АпаратнотАУпрограмний комплекс GSM-МТМ

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



#include "uart.h"

#include "get_word.h"

#include "common.h"

#include "modem.h"

//#include "mod_link.h"

//#include "timer.h"

#include "tools.h"

#include "conf.h"

const PHONE = 1;

const MOBILPHONE = 2;

char *device = "COM1"; // номер послiдовного порта, у форматi

// COMn, де n вiд 1 до 4

chardelay = 0, // затримка передачi мiж символами

unsigned speed = 9600; // швидкiсть обмiну даними

char initialize[80]; // команда iнiцiалiзацiСЧ

char dropline[80]; // команда покласти трубку

char dialPrefix[80]; // префiкс номера

char dialSuffix[80]; // суфiкс номера

char maxTime [80]; // максимальний час розмови

char numDigits [80]; // максимальна кiлькiсть цифр у наборi коду

char LPT[10]; //Адреса порту прiнтера

int LPTin = 1;

int LPTout = 0;

int PhoneNum;

char dialNumber[80]; // телефоннiй номер

int tarifIn;

int tarifOut;

doublemoney;

double START_money;

int dir;//напрям розмови

int tarifConnect;

int countSec = 0;

extern void Csleep(time_t interval); // затримка виконання програми на задану кiлькiсть секунд

extern void Cdelay(int milliseconds); // затримка виконання програми на задану кiлькiсть мiлiсекунд

void PhoneDown(void); // покласти трубку на МТМ

int initializeDevice(void); // iнiцiалiзацiя пристрою

char * waitRing(void); // ОчiкуСФмо дзвiнок

void saveLog(char *timeStart,char *timeEnd,char *Number,char *direction); // записати ЛОГ файл

void beep(int no){ // бiпер в МТМ

while (no>0){

Cdelay(100);

sound(700);

Cdelay(100);

nosound();

no--;

}

}

void decUserMoney(int direct){

// Тарифiкацiя на мiст (Direct=PHONE тарифiкацiя на мiсто, у iншому випадку

//на мобiльний телефон)

float tOut1 = tarifOut/60.0; //GSM

if (direct == PHONE) money = money - tOut1;

else{

if (countSec == 0) money = money - tarifIn;

countSec++;

if(countSec == 60) countSec = 0;

};

};

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

void StartToking(int direction){

char timeStart[80];

char timeEnd[80];

char buf[80];

char * tim;

int i=0;

//очистили буфер

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

Cdelay(200);

do{

sendstr("AT+CPAS"); //команда видаСФ 4 коли мобiльнi телефони встановили звязок

Cdelay(200);

if (r_count_pending()>0) {

sread(buf,r_count_pending(),0); // 0 при наборi номера

if (strstr(buf,"+CPAS: 0")!=NULL) {

printf("\nКiнець звязку!!! \n");

Csleep(1);

PhoneDown();

return;

};

if (strstr(buf,"+CPAS: 4")!=NULL){

//початок розмови зчитуСФмо час

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

sendstr("AT+CCLK?");

Cdelay(200);

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

for (i=0;i<strlen(timeStart)-1;i++)

if ((timeStart[i]==O)&&(timeStart[i+1]==K)){

break;

}

timeStart[i+2]=\0;

printf(timeStart);

printf("\n");

break;

}

}

} while(1);

i = atoi(maxTime);

countSec = 0;

//почати вiдлiк часу i зменшити грошi на рахунку абонента

do{

decUserMoney(direction);

if (i==30) beep(4); // чотири гудка коли часу залишилось 30 сек

sendstr("AT+CPAS");

Cdelay(200);

sread(buf,r_count_pending(),0);

Cdelay(700);

if (strstr(buf,"+CPAS: 0")!=NULL){

break; // розмову закiнчено

}

if (i<0){ beep(3); Csleep(1); break; }//час вийшов кiнець розмови

i--;

}while ((i>0)&&(!kbhit()));

//кiнець розмови зчитуСФмо час

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

sendstr("AT+CCLK?");

Cdelay(200);

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

for (i=0;i<strlen(timeEnd)-1;i++)

if ((timeEnd[i]==O)&&(timeEnd[i+1]==K)) break;

timeEnd[i+2]=\0;

printf(timeEnd);

sendstr("AT+CHUP");

sendstr("\nATZ");

printf("\nКiнець звязку!!! \n");

Csleep(1);

PhoneDown();

if (direction == PHONE) {

if (START_money!=money) money = money - tarifConnect;

saveLog(timeStart,timeEnd,dialNumber,"з MTM");

}

else saveLog(timeStart,timeEnd,dialNumber,"з GSM");

};

// пiдняти трубку на МТМ

void PhoneUp(){

asm{

mov dx,LPTout

mov al,080h

out dx,al;

}

};

// Опустити трубу

void PhoneDown(){

asm{

mov dx,LPTout

mov al,00h

out dx,al;

}

};

// вивести повiдомлення про помилку

void error(int no){

printf("\n\nПОМИЛКА!!!\n");

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;

}

};

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

char * waitRing(){

char rString[200];

char *ch;

int i=0;

int fromCity;

Csleep(1);

rString[0]=\0;

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

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"; // надiйшов дзвiнок з мiста

}

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

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); // визначаСФмо номер мобiльного телефону

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

}

}while (!kbhit());

return "BREAK";

};

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

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[