3. Александр Фролов, “Язык СИ”, М: «Питер», 1999г, 450с., ил.
4. http://www.simens.com/index.htm Система команд мобільного телефону (англ.) s25modCom.pdf, 52 Kb.
5. ECCOM bridge руководство по експлуатации, 1996г.,, ECCOM_BRIDGE.PDF, 491Kb
6. Справка по Visual Basic 5.0, %Program files%Microsoft Exchange/office/1049/vbaoff9.chm
7. Cправка по Microsoft Outlook 2000, %program files%Microsoft Exchange/Office/1049/vbaoutl9.chm
8. Справка по Microsoft Access 2000, %windir%help/Access.chm
9. Манн Ентони.
10. М23 Visual Basic 5. Руководство разработчика.:
11. Пер. с англ. – К.: Диалектика, 1997–705с.: ил. – Парал. тит. англ.
12. ISDN 966–506–115–1 (рус)
13. Конспекс лекцій по Access, Мунтяну Р.П. викладач кафедри КСМ, Чернівецького Національного Університету 2001 рік
14. ГОСТ 19.001-77 ЕСПД. Общие положения.
15. ГОСТ 19.101 -77 ЕСПД, Виды программ и программных документов.
16. ГОСТ 19.104-78 ЕСПД. Основные надписи.
17. ГОСТ 19.105-78 ЕСПД. Общие требования к программным документам.
18. ГОСТ 19,401-78 ЕСПД. Текст программы.
19. ГОСТ 19.402-78 ЕСПД. Описание программы.
ДОДАТОК 1
Затверджено
Л.ФФ.57149-ТП 12 01-1
“ПРОГРАМНО-АПАРАТНИЙ КОМПЛЕКС MTM↔GSM”
ПРОГРАМА ОБРОБКИ ДЗВІНКІВ
ТЕКСТ ПРОГРАМИ
Анотація
Опис програми Л.ФФ.57149-ТП 12 01-1 містить текст програми bridge.c. Текст програми містить коментарі у важко зрозумілих місцях.
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#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"; // номер послідовного порта, у форматі
// COMn, де n від 1 до 4
chardelay = 0, // затримка передачі між символами
unsigned speed = 9600; // швидкість обміну даними
char initialize[80]; // команда ініціалізації
char dropline[80]; // команда покласти трубку
char dialPrefix[80]; // префікс номера
char dialSuffix[80]; // суфікс номера
char maxTime [80]; // максимальний час розмови
char numDigits [80]; // максимальна кількість цифр у наборі коду
char LPT[10]; //Адреса порту прінтера
int LPTin = 1;
int LPTout = 0;
int PhoneNum;
char dialNumber[80]; // телефонній номер
int tarifIn;
int tarifOut;
double money;
double START_money;
int dir;//напрям розмови
int tarifConnect;
int countSec = 0;
extern void Csleep(time_t interval); // затримка виконання програми на задану кількість секунд
extern void Cdelay(int milliseconds); // затримка виконання програми на задану кількість мілісекунд
void PhoneDown(void); // покласти трубку на МТМ
int initializeDevice(void); // ініціалізація пристрою
char * waitRing(void); // Очікуємо дзвінок
void saveLog(char *timeStart,char *timeEnd,char *Number,char *direction); // записати ЛОГ файл
void beep(int no){ // біпер в МТМ
while (no>0){
Cdelay(100);
sound(700);
Cdelay(100);
nosound();
no--;
}
}
void decUserMoney(int direct){
// Тарифікація на міст (Direct=PHONE – тарифікація на місто, у іншому випадку
//на мобільний телефон)
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;
};
};
//почати розмову поки не закінчиться ліміт або гроші
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 коли мобільні телефони встановили зв‘язок
Cdelay(200);
if (r_count_pending()>0) {
sread(buf,r_count_pending(),0); // 0 при наборі номера
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;
//почати відлік часу і зменшити гроші на рахунку абонента
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; // розмову закінчено
}
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");
};
// підняти трубку на МТМ
void PhoneUp(){
asm{
mov dx,LPTout
mov al,080h
out dx,al;
}
};
// Опустити трубу
void PhoneDown(){
asm{
mov dx,LPTout
mov al,00h
out dx,al;
}
};
// вивести повідомлення про помилку
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;
}
};
// очікування дзвінків (з МТМ або з 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);