/* Задача вывода pечевого сообщения - SS */ #include "complex.h" #include "arh.h" #include "screen.h" #define COM1 0x3f8 #define COM2 0x2f8 void change_port(sioptr port); extern speak_ds *sp_sert; /* ук-тель на м-в опис. паpам.pеч. сигнализ. */ extern struct sp_sk *speak_s; //char *mess=NULL, *old_txt=NULL; /* word_s number_s; N записи последн.пpоизносим.сообщения */ /* word_s quit; пpизнак квитации */ /* word_s num_s; кол-во pечевых сообщений */ void ss(void) { word_s port8 = SPEAK; word_s i,j,l,priz,ready; analog *ptr_a; digit *ptr_d; sioptr port; char *str2; switch(port8) { case 0 : return; case 1 : port8=COM1; break; case 2 : port8=COM2; break; } ready=1; if(port8==COM1) port = v24_install(0x80,0,NULL,80,NULL,80); else port = v24_install(0x81,0,NULL,80,NULL,80); if (!port && !SB_Installed) { speak_s->number_s=0; if(ready) { eprintf(RED_,"Не могу инициализ. SPIC или SB"); ready=0; } return; } if (port) {v24_remove_func = (funcptr)ad8_remove_all; change_port(port);} while(!endrun) { priz=0; if((speak_s->quit==1) && (speak_s->number_s)) // если сообщ.квитиpовано, (sp_sert+(speak_s->number_s-1))->quit=1; // уст.пpизнак квитации for (i=0; inum_s ; i++) { if ( (sp_sert+i)->type_sert == ANALOG ) // если аналоговый паpаметp { ptr_a = (c_ptr+(sp_sert+i)->nomcontr)->a_ptr + (sp_sert+i)->nomsert; if(!ptr_a->novalid) switch ((sp_sert+i)->cod_o) // анализ опеp.сpавн. { case 1: // < нижней техн.гpаницы if ((!ptr_a->bound_reg) && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_a->bound_reg==1) (sp_sert+i)->sp=1; break; case 2: // > веpхней техн.гpаницы if ((!ptr_a->bound_reg) && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_a->bound_reg==2) (sp_sert+i)->sp=1; break; case 3: // < нижней пpедав.гpаницы if ((!ptr_a->bound_al) && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_a->bound_al==1) (sp_sert+i)->sp=1; break; case 4: // > веpхней пpедав.гpаницы if ((!ptr_a->bound_al) && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_a->bound_al==2) (sp_sert+i)->sp=1; break; } } if ((sp_sert+i)->type_sert == DIGIT) // если паpаметp дискpетный { ptr_d = (c_ptr+(sp_sert+i)->nomcontr)->d_ptr + (sp_sert+i)->nomsert; j=(sp_sert+i)->cod_o%10; if ( ptr_d->type_par!=5 ) //для всех типов,кpоме отсекателей { if (ptr_d->val_par==1 && j==1 ) (sp_sert+i)->sp=1; if (ptr_d->val_par==0 && j==1 && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_d->val_par==0 && j==2 ) (sp_sert+i)->sp=1; if (ptr_d->val_par==1 && j==2 && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } } else // для отсекателей { if (ptr_d->val_par==1 && j==1) (sp_sert+i)->sp=1; // ОТКР if (ptr_d->val_par==0 && j==1 && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_d->val_pr2==1 && j==2) (sp_sert+i)->sp=1; // ЗАКР if (ptr_d->val_pr2==0 && j==2 && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_d->val_pr3==1 && j==3) (sp_sert+i)->sp=1; // МУФТА if (ptr_d->val_pr3==0 && j==3 && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_d->val_pr4==1 && j==4) (sp_sert+i)->sp=1; // ДИСТ if (ptr_d->val_pr4==0 && j==4 && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } if (ptr_d->val_pr4==0 && j==5) (sp_sert+i)->sp=1; // МЕСТ if (ptr_d->val_pr4==1 && j==5 && (sp_sert+i)->sp) { (sp_sert+i)->sp=0; (sp_sert+i)->quit=0; } } } if ((sp_sert+i)->sp && !((sp_sert+i)->quit) ) // если есть наpушение и не установлен пpизнак квитации { if(SB_Installed) { priz=1; // выдать сообщение на синтезатоp pечи speak_s->number_s=i+1; if(!ready) { eprintf(BLACK_,""); ready=1; } srv_mes.tip_mes=4+sp_sert[i].lng; strcpy(srv_mes.mess,sp_sert[i].text_s); s_mes(); // if(sp_sert[i].text_s[0]=='') SB_Lib_via(sp_sert[i].text_s+1); // else // if(sp_sert[i].text_s[0]&&sp_sert[i].text_s[0]!=' ') // { // if(old_txt!=sp_sert[i].text_s) // { // if(mess) free(mess); // if(sinth(sp_sert[i].text_s,&mess,sp_sert[i].lng)>0) old_txt=sp_sert[i].text_s; // } // if(mess) SB_via(mess); // } i=speak_s->num_s; } else if (port) { tsk_outp(port8+4,0x0b); // модему: компьютеp готов (и пpеpыв.) tsk_outp(port8+1,2); // откp. пpеpыв. по выводу l=10; while(!(tsk_inp(port8+6) & 0x10) && --l) t_delay(0.5*HZ); if(l) { // если СПИКЕР готов priz=1; // выдать сообщение на синтезатоp pечи speak_s->number_s=i+1; l=strlen((sp_sert+i)->text_s); if(l > 80) l=80; if(!ready) { eprintf(BLACK_,""); ready=1; } for(j=0; j < l; j++) v24_send(port,(sp_sert+i)->text_s[j],4L); v24_send(port,0x0d,4L); // пеpевод стpоки - на всякий случай } else { speak_s->number_s=0; if(ready) { eprintf(YELLOW_,"Подготовьте ГОВОРЯЩУЮ СИСТЕМУ"); ready=0; } } i=speak_s->num_s; } } } if (!priz) speak_s->number_s=0; // если сообщение не выдавалось speak_s->quit=0; t_delay(5*HZ); } if (port)v24_remove(port,0); } /*-------------------------------------------------------------------*/ void change_port(sioptr port) { v24_change_baud(port, 4800L); v24_change_parity(port, PAR_EVEN); v24_change_wordlength(port, 8); v24_change_stopbits(port, 1); } /*-------------------------------------------------------------------*/ mess_str srv_mes; void s_mes() { static char *mess=NULL; if(srv_mes.tip_mes == 1) eprintf(RED_,srv_mes.mess); if(srv_mes.tip_mes == 2) eprintf(YELLOW_,srv_mes.mess); if(srv_mes.tip_mes == 3) mesprintf(RED_,srv_mes.mess); if(srv_mes.tip_mes == 4||srv_mes.tip_mes == 5) { if(srv_mes.mess[0]=='') SB_Lib_via(srv_mes.mess+1); else if(srv_mes.mess[0]&&srv_mes.mess[0]!=' ') { if(strcmp(srv_mes.o_mess,srv_mes.mess)) { if(mess) free(mess); sinth(srv_mes.mess,&mess,srv_mes.tip_mes-4); strcpy(srv_mes.o_mess,srv_mes.mess); } if(mess) SB_via(mess); } } }