АпаратнотАУпрограмний комплекс 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[