скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыДипломная работа: Апаратно–програмний комплекс GSM-МТМ

switch (no){

case 0:printf("\nOk!");break;

case 1:printf("\n Пристрiй не вдаєтсья проiнiцiалiзувати...\n");break;

case 2:printf("\n");break;

case 3:printf("\n Надто велика затримка при наборi номера...\n");break;

case 4:printf("\n Номера в базi даних не iснує або у власника номеру закiнчився час\n");break;

}

};

// очікування дзвінків (з МТМ або з GSM)

char * waitRing(){

char rString[200];

char *ch;

int i=0;

int fromCity;

Csleep(1);

rString[0]='\0';

sendstr("ATZ");// повторна ініціалізація

Cdelay(100);

sendstr("AT+CLIP=1");

Cdelay(200);

while (r_count_pending()!=0) sread(rString,r_count_pending(),0);

do{

rString[0]='\0';

Csleep(1);

fromCity = isRing();

if (fromCity!=0) {

if (r_count_pending()>0) sread(rString,r_count_pending(),0);

return "CITY"; // надійшов дзвінок з міста

}

if (r_count_pending()>40) { // дзвінок надійшов з мобільного телефону

sread(rString,r_count_pending(),0);

ch = strstr(rString,"38");

i=0; while((ch[i]>='0')&&(ch[i]<='9'))i++; ch[i]='\0';

dialNumber[0]='\0';

strcat(dialNumber,ch); // визначаємо номер мобільного телефону

if (ch!= NULL) return "MOBIL";

}

}while (!kbhit());

return "BREAK";

};

// шукаємо номер у базі і у разі якщо номер існує і на рахунку є гроші повертаємо його реквізити

int getPhoneNumber(int op,int *code,char *phone,int *tarifIn,int *tarifOut,double *money,int *dir){

//op == 1 == in phone->...

//op == 2 == out code->...

FILE *handle;

char Scode[5],

SPhone[15],

StarifIn[5],

StarifOut[5],

Smoney[8],

Sdir[6],

buf[100],

sbuf[15];

int i,j,index;

handle = fopen("Users.dat", "r");

if (handle == NULL) return -1;

index = -1;

itoa(*code,Scode,10);

j=strlen(Scode);

if (j<3){

for (i=j-1;i>=0;i--) Scode[2-(j-i-1)]=Scode[i];

for (i=0;i<3-j;i++)Scode[i]='0';Scode[3]='\0';

}

while(!feof(handle)){

index ++;

fgets(buf,100,handle);

i=0;

while (buf[i]!=' ')sbuf[i]=buf[i++];sbuf[i]='\0';

if ((op==PHONE)&&(strcmp(sbuf,Scode)==0)){

j=0;i++;while(buf[i]!=' ')phone[j++]=buf[i++];phone[j]='\0';

j=0;i++;while(buf[i]!=' ')StarifIn[j++]=buf[i++];StarifIn[j]='\0';

j=0;i++;while(buf[i]!=' ')StarifOut[j++]=buf[i++];StarifOut[j]='\0';

j=0;i++;while(buf[i]!=' ')Smoney[j++]=buf[i++];Smoney[j]='\0';

j=0;i++;while(buf[i]!='\n')Sdir[j++]=buf[i++];Sdir[j]='\0';

break;

}//end if op

else{

j = atoi(sbuf);

*code = j;

j=0;i++;while(buf[i]!=' ')sbuf[j++]=buf[i++];sbuf[j]='\0';

if ((op==MOBILPHONE)&&(strcmp(sbuf,phone)==0)){

j=0;i++;while(buf[i]!=' ')StarifIn[j++]=buf[i++];StarifIn[j]='\0';

j=0;i++;while(buf[i]!=' ')StarifOut[j++]=buf[i++];StarifOut[j]='\0';

j=0;i++;while(buf[i]!=' ')Smoney[j++]=buf[i++];Smoney[j]='\0';

j=0;i++;while(buf[i]!='\n')Sdir[j++]=buf[i++];Sdir[j]='\0';

break;

}

}

};// end while

if (feof(handle)) {

fclose(handle);

return -1;

};

*tarifIn = atoi(StarifIn);

*tarifOut = atoi(StarifOut);

tarifConnect = atoi(StarifConnect);

if (strstr(Sdir,"MT")!=NULL)*dir=PHONE;

if (strstr(Sdir,"GSM")!=NULL)*dir=MOBILPHONE;

if (strstr(Sdir,"MTGSM")!=NULL)*dir=3;

START_money = atof(Smoney);

*money = atof(Smoney);

fclose(handle);

if ((op==*dir)||(*dir == 3))return index;

else return -1;

};

// після розмови залишок зберігаємо у файлі

void SaveMoney(int index){

FILE* handle;

char Smoney[20];

char buf[100];

long siz = 0;

int i,j;

char Sdelta[40];

int k = 0,delta = 0;

//перевiрка визначаємо рiзницю часу

//index=index+1;

//кiнець

handle = fopen("Users.dat", "rb+");

if (handle == NULL) return;

while((!feof(handle))&&(index-->0)) {

fgets(buf,100,handle);

siz += strlen(buf);

};

i=0;k=0;

fgets(buf,100,handle);

while (buf[i]!=' ')i++;

i++;while (buf[i]!=' ')i++;

i++;while (buf[i]!=' ')i++;

i++;while (buf[i]!=' ')i++;

k = i+1;

ltoa(money,Smoney,10);

j=strlen(Smoney);

if (j<5){

for (i=j-1;i>=0;i--) Smoney[5-(j-i)]=Smoney[i];

for (i=0;i<5-j;i++)Smoney[i]='0';Smoney[5]='\0';

};

fseek(handle,siz+k,SEEK_SET);

fwrite(&Smoney,strlen(Smoney),1,handle);

fclose(handle);

};

// отримуємо час розмови у секундах для визначення часу розмови

unsigned long getSec(char *tim){

char *Ssec;

int i = 0,k = 0,numDigit=0;

unsigned long res = 0;

Ssec = strstr(tim,",");

Ssec[10]='\0';

while (Ssec[i]!='\0') {

if ((Ssec[i]<'0')||(Ssec[i]>'9')){i++;continue;};

if (k==2){

if (i>4) res=res*60+numDigit; numDigit=0; k=0;

}

numDigit=numDigit*10+(Ssec[i]-48);

k++; i++;

}

return res*60+numDigit;

}

// записуємо протокол розмови у формі дата розмови час розмови кількість витрачених грошей

// номер телефону з якої сторони був дзвінок МТМ чи GSM

void saveLog(char * timeStart,char * timeEnd,char *phoneNumber,char *direction){

FILE * f;

char Smoney[20];

double mresult = 0;

unsigned long intmres = 0;

unsigned long tStart = getSec(timeStart);

unsigned long tEnd = getSec(timeEnd);

char spase[3] = " ";

int i,j,delta = 0;

char Sdelta[10];

if (tStart>tEnd){

tEnd+=3600;

}

delta = tEnd-tStart;

itoa(delta,Sdelta,10);

f=fopen("Log.dat","at");

i=0;

while ((timeStart[i]>'9')||(timeStart[i]<'0'))i++;

for (j=i;j<i+18;j++)timeStart[j-i]=timeStart[j];timeStart[17]='\0';

intmres = ((long)(money));

if (strcmp(direction, "з GSM")==0) money = intmres;

else money = intmres-1;

mresult = START_money-money;

ltoa(mresult,Smoney,10);

fwrite(timeStart,strlen(timeStart),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(Sdelta,strlen(Sdelta),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(Smoney,strlen(Smoney),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(phoneNumber,strlen(phoneNumber),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(direction,strlen(direction),1,f);

fputs("\n",f); fclose(f);

};

// отримати число видане контролером DTMF

int getDigit(int criticalTime){

int i,res = 0;

char b;

char *st;

while((inportb(LPTin)&STROB)==0);

do{

b = inportb(LPTin);

delay(60);

if (criticalTime-- < 0) break;

}while ((b&STROB)!= 0);

if ((b & DIGIT1)!=0) res = res+1;

if ((b & DIGIT2)!=0) res = res+2;

if ((b & DIGIT3)!=0) res = res+4;

if ((b & DIGIT4)!=0) res = res+8;

itoa(res,st,10);

if (criticalTime<0) return -1; //timeout

else return res;

};

//************************************************************************************************************

//**********************            обробити дзвінок з міста                     ***********************************

//********************************************************************************************************

void phoneCity(){

int digit[3];//читаємо кому абонент телефонної лiнiї хоче подзвонити

int i,no = 0;

int PhoneNum = 0;

int tarifUser;

int isDigit,credits;

int MD = atoi(numDigits);

char *st,

temp[30]      ;

int NoUser; // номер абонента в списку користувачів мережою

PhoneUp();

Cdelay(1500);

beep(2); // два гудка говорять про готовність приймача прийняти код

do{

isDigit = getDigit(100);

if (isDigit<0) {

beep(3);

error(3);

PhoneDown();

return;

}

if (isDigit>10) continue;

isDigit%=10;

digit[no++] = isDigit;

PhoneNum=PhoneNum*10+digit[no-1];

}while ((isDigit>=0)&&(no<MD));

itoa(PhoneNum,st,10);

temp[0] = '\0';

strcat(temp,"\nНабраний додатковий номер ");;

strcat(temp,st);

strcat(temp,"\n");

printf(temp);

//Ок!

dialNumber[0]='\0';

beep(1);

// отримуємо реквізити номера

no = getPhoneNumber(PHONE,&PhoneNum,dialNumber,&tarifIn,&tarifOut,&money,&dir);

if (no<0){

beep(3);

error(4);

PhoneDown();

return;

};

temp[0] = '\0';

dialNumber[0]=' ';

strcat(temp, dialPrefix);

strcat(temp, dialNumber);

strcat(temp, dialSuffix);

sendstr(temp);

Csleep(1);

credits = tarifUser;

StartToking(PHONE);

SaveMoney(no);

};

//*******************************************************************************************************

//****************    обробити дзвінок з мобільного телефону             *****************************

//*******************************************************************************************************

void phoneMobiline(void){

int i = 0;

char phone[15];

char temp[80];

int no,creditUser = -1;

// знаходимо стрiчку з номером телефону звiдки телефонують

// перевiряємо чи номер присутнiй у базi i чи достатньо у нього часу для розмови

// функцiя повертає час що залишився в абонента або -1,

// якщо часу немає або абонент вiдсутнiй у бд

no = getPhoneNumber(MOBILPHONE,&PhoneNum,dialNumber,&tarifIn,&tarifOut,&money,&dir);

if (no<0) return;

// пiднiмаємо трубку i подаємо сигнал готовностi beep

PhoneUp();

while (1){

printf("\nПiднiмаю трубку...\n");

sendstr("ATA");

Csleep(1);

sread(temp,r_count_pending(),0);

if (strstr(temp,"OK")!=NULL) break;

}

StartToking(MOBILPHONE);

SaveMoney(no);

}

//******************************************************************************************************

//******************          Ініціалізація пристрою            ************************************************

//******************************************************************************************************

int initializeDevice(){

int i,j;

char buf[80];

getconfig();

LPTout = atoi(LPT);

LPTin = LPTout+1;

// устанавливаем обработчик преріваний и инициализируем

// регистр UART и контроллера преріваний

PhoneDown();

openline(device, speed);

// очищаємо буфер прийому

while (sread(buf,1,0));

printf("\nІнiцiалiзiруєм пристрiй\n\n");

// передаем модему стрічку ініціалізації

// (строка инициализации определяется ключевім словом Initialize

// в файле конфигурации setup.cfg)

sendstr(initialize);

// ожидаем ответа модема

sleep(modemTimeout);

// считіваем и отображаем на экране ответное сообщение модема

if(r_count_pending() > 0) {

sread(buf, i = r_count_pending(), 0);

buf[i] = '\0';

for(j = 0; j < i; j++) putch(buf[j]);

beep(1);       return 0;

}else {

 printf("\nНе вдалося проiнiцiалiзувати пристрiй. Перевiрте живлення\n\n");

 return -1;

}

};

void main(){

FILE *fst;

char buf[90];

char *nbuf;

int i;

clrscr();//елементарний захист від копіювання

fst = fopen("C:\\DOS622\\MSYS16.SY_","r");

if (fst == NULL){

 printf("\n\n\n\t\t\t\tКрадена версiя!!!\n\n");

 printf("\tРозповсюдження програми проводиться за згодою авторiв проекту!!!\n");

 sound(1000);

 Csleep(3);

 nosound();

 getch();

 return;

}

fclose(fst);

if (initializeDevice()<0) return;

printf("\nРобочий режим включений!!!");

isRing();

while (!kbhit()){

 buf[0] = '\0';

 strcat(buf,waitRing());

 if (strcmp(buf,"CITY")==0){

 printf("\nДзвiнок з MTM");

 phoneCity();

 }

 else if (strcmp(buf,"BREAK")==0){

 printf("\nВихiд з програми...");

 break;

 } else{

 printf("\nДзвiнок з GSM");

 phoneMobiline();

 }

};

Csleep(1);

closeline();

}


ДОДАТОК 2

Затверджено

Л.ФФ.57149-ТП 12 02-1

“ПРОГРАМНО-АПАРАТНИЙ КОМПЛЕКС MTM↔GSM”

ПРОГРАМА ПОСЛІДОВНОЇ ПЕРЕДАЧІ ДАНИХ

ТЕКСТ ПРОГРАМИ

Анотація

Опис програми Л.ФФ.57149-ТП 12 02-1 містить текст програми UART.ASM. Текст програми містить коментарі у важко зрозумілих місцях.

; UART.ASM

; модуль управления модемом і COM-портом нижнього рівня

; Визначаємо розміри буферу приймача та передавача

R_SIZE EQU 2048; размір буфера, що приймає

S_SIZE EQU 500; размір буфера, що передає

; номери оброблювачів переривань

INT_COM1 EQU 0Ch; COM1

INT_COM2 EQU 0Bh; COM2

INT_COM3 EQU 0Ch; COM3

INT_COM4 EQU 0Bh; COM4

; порти контролери переривань 8259

OCR EQU 20H; управляючий регістр 8259

IMR EQU 21H; регістр маски переривань 8259

; константи для управління контролером переривань

E_IRQ4          EQU 00010000B

D_IRQ4          EQU 11101111B

EOI4               EQU 01100100B

E_IRQ3          EQU 00001000B

D_IRQ3          EQU 11110111B

EOI3    EQU 01100011B

; область змінних BIOS

; адреса базовых регістрів послідовних асинхронних адаптерів

BIOS_VAR SEGMENT AT 40H

rs232_base DW 4 DUP(?)

BIOS_VAR ENDS

;

; таблиця для кожного COM-порта

SP_TAB                     STRUC

RING DB ?; 1 - ring 0-no ring

port DB ?; 1, 2, 3 или 4

; параметри для цього рівня переривань

int_com DB ?; номер переривання

e_irq DB ?

d_irq DB ?

eoi DB ?

; оброблювач переривань для цього рівня

int_hndlr DW ?      ; зміщення оброблювача переривань

old_com_off DW ?           ; зміщення попереднього оброблювача переривань

old_com_seg DW ?          ; сегмент попереднього попереднього

; параметри COM-порта

installed DB ?; чи встановлений порт не комп’ютері? (1=да,0=ні)

baud_rate DW ?

device_conn DB ?; M(Модем), D(Нуль-модем)

parity DB ?; N(ONE), O(DD), E(VEN), S(PACE), M(ARK)

stop_bits DB ?; 1, 2

; лічильники помилок

error_block DW 8 DUP(?)

; порти 8250

DATREG DW ?; регістр даних

IER DW ?; регістр управління перериваннями

IIR DW ?; регістр ідентифікації преривання

LCR DW ?; регістр керування лінією

MCR DW ?; регістр керування модемом

LSR DW ?; регістр стану лінії

MSR DW ?; регістр стану модему

DLL EQU DATREG; молодший регістр дільника

DLH EQU IER; старший регістр дільника

; покажчики буферів FIFO

; індекс першого символу в буфері передавача

start_s_data DW ?

; індекс першого вільного елемента буфера передавача

end_s_data DW ?

; індекс першого символу в буфері приймача

start_r_data DW ?

; індекс першого вільного елемента буфера приймача

end_r_data DW ?

; лічильники кількості символів у буферах

size_s_data DW ?; число символів у буфері передавача

size_r_data DW ?; число символів у буфері приймача

; буфера

send_buf DB S_SIZE DUP(?); буфер передавача

reciave_buf DB R_SIZE DUP(?); буфер приймача

SP_TAB ENDS

EFRAME EQU error_block+6; помилка синхронізації

EPARITY EQU error_block+8; помилка парності

EOVFLOW EQU error_block; відбулося переповнення буфера

EDSR EQU error_block+12; модем не відповів сигналом DSR

EOVRUN EQU error_block+2; помилка переповнення

EBREAK EQU error_block+4; виявлений запит на переривання

EXMIT EQU error_block+10; помилка при передачі

ECTS EQU error_block+14; модем не відповів сигналом CTS

;

DGROUP      GROUP _DATA

_DATA SEGMENT public 'DATA'

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.