Дипломная работа: Апаратно–програмний комплекс 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