hdo  beta
/home/mrazik/Documents/web/old/hdo/hdo.c
Zobrazit dokumentaci tohoto souboru.
00001 #include <stdio.h>
00002 #include "hdo.h"
00011 /*static*/ struct hdo_data hdo;   
00012 
00017 inline void hdo_set_status (enum stat st) {
00018   hdo.counter = 0;
00019   hdo.suma    = 0;
00020   hdo.status  = st;
00021 }
00030 int tlg_write (int avg, char* ptr) {
00031   char c;
00032 
00033   if (hdo.tindex >= 44) {   // Konec telegramu
00034     ptr [hdo.windex] = 0;
00035     hdo.tindex       = 0;
00036     hdo.windex       = 0;
00037     hdo_set_status (WAIT_FOR_BEGIN);
00038     return 1;
00039   }
00040   // Doplním písmenka
00041   if (hdo.tindex == 0)  ptr [hdo.windex++] = 'A';
00042   if (hdo.tindex == 4)  ptr [hdo.windex++] = 'B';
00043   if (hdo.tindex == 12) {
00044     ptr [hdo.windex++] = ' ';
00045     ptr [hdo.windex++] = 'D';
00046     ptr [hdo.windex++] = 'P';
00047     ptr [hdo.windex++] = ':';
00048   }
00049   // Skupina A
00050   if (hdo.tindex < 4) {
00051     if (avg) c = '1' + hdo.tindex;
00052     else     c = '-';
00053     ptr [hdo.windex++] = c;
00054   }
00055   // Skupina B
00056   else if (hdo.tindex < 12) {
00057     if (avg) c = '1' + hdo.tindex - 4;
00058     else     c = '-';
00059     ptr [hdo.windex++] = c;
00060   }
00061   // Dvojpovel
00062   else {
00063     // skupiny po 4 oddělit mezerami pro lepší čitelnost
00064     if (!((hdo.tindex+4) % 8)) ptr [hdo.windex++] = ' ';
00065     if (hdo.tindex % 2) {               // bit "vypnuto" na tindex - to až následně
00066       if (ptr [hdo.windex] == '-') {         // zapnuto nebylo
00067         if (avg) ptr [hdo.windex] = 'V';     // tedy je vypnuto
00068       }
00069       else {                                 // bylo zapnuto
00070         if (avg) ptr [hdo.windex] = 'E';     // tedy je chyba - nemůže být obojí
00071       }
00072       hdo.windex++;
00073     }
00074     else {                              // bit "zapnuto" na tindex - to je první !!!
00075       if (avg) ptr [hdo.windex] = 'Z';       // je zapnuto
00076       else     ptr [hdo.windex] = '-';       // ještě se uvidí
00077     }
00078   }
00079   hdo.tindex++;
00080   hdo_set_status (SPACE1);
00081   return 0;
00082 }
00083 
00084 int tlg_decode (int num, char* str) {
00085   int on_off, rv = 0;
00086   switch (hdo.status) {
00087     case WAIT_FOR_BEGIN:
00088       hdo.tindex = 0;
00089       hdo.windex = 0;
00090       // start telegramu
00091       if (num > hdo.triger) hdo.status = SYNC_PULSE;
00092       break;
00093     case SYNC_PULSE:
00094       hdo.counter++;
00095       if (hdo.counter == SYNC_HI) hdo_set_status  (SYNC_SPACE);
00096       else if (num < hdo.triger)  hdo.status = SYNC_PULSE_DROP;
00097       break;
00098     case SYNC_PULSE_DROP:
00099       hdo.counter++;
00100       if (hdo.counter == SYNC_HI) hdo_set_status  (SYNC_SPACE);
00101       else if (num > hdo.triger) hdo.status = SYNC_PULSE;
00102       else {
00103         // chyba startovacího pulsu
00104         if (hdo.counter > DATA_HI) {  // pro krátký puls ignoruj
00105           rv = -1;
00106           sprintf (str, "Chyba startovaciho pulsu");
00107         }
00108         hdo.status = WAIT_FOR_BEGIN;
00109       }
00110       break;
00111     case SYNC_SPACE:
00112       hdo.counter++;
00113       if (hdo.counter == SYNC_LO) hdo_set_status  (DATA_PULSE);
00114       else if (num > hdo.triger)  hdo.status = SYNC_SPACE_DROP;
00115       break;
00116     case SYNC_SPACE_DROP:
00117       hdo.counter++;
00118       if (hdo.counter == SYNC_LO) hdo_set_status  (DATA_PULSE);
00119       else if (num < hdo.triger) hdo.status = SYNC_PULSE;
00120       else {
00121           hdo.status = WAIT_FOR_BEGIN;    // chyba synchronizační mezery
00122           rv = -1;
00123           sprintf (str, "Chyba synchronizacni mezery");
00124       }
00125       break;
00126     case DATA_PULSE:
00127       hdo.counter++;
00128       hdo.suma += num;
00129       if (hdo.suma > (hdo.counter * hdo.triger)) on_off = 1;
00130       else                                       on_off = 0;
00131       if (hdo.counter == DATA_HI) {
00132         rv = tlg_write (on_off, str);
00133       }
00134       break;
00135     case SPACE1:
00136       if (num > hdo.triger) hdo.status = SPACE2;
00137       else                  hdo.status = SPACE3;
00138       break;
00139     case SPACE2:
00140       if (num > hdo.triger) {
00141         hdo.status = WAIT_FOR_BEGIN;  // chyba mezery mezi daty
00142         sprintf (str, "Chyba mezery mezi daty");
00143         rv = -1;
00144       }
00145       else hdo.status = SPACE3;
00146       break;
00147     case SPACE3:
00148       hdo.status = DATA_PULSE;
00149       break;
00150     default :
00151       break;
00152   }
00153   return rv;
00154 }
00155 
00156 int hdo_action (char* tlg, const char* command) {
00157   int  i, j;
00158   char c;
00159   const int index_table [] = {19,20,21,22, 24,25,26,27, 29,30,31,32, 34,35,36,37};
00160   i = command [1] - '1';              // An
00161   if ((i < 0) || (i > 3)) return 0;   // chyba
00162   if (tlg [i+1] == '-')   return 0;   // není pro mne
00163   i = command [3] - '1';              // Bn
00164   if ((i < 0) || (i > 7)) return 0;   // chyba
00165   if (tlg [i+6] == '-')   return 0;   // není pro mne
00166   i = command [6] - '0';              // DPn
00167   j = command [7];                    // DPn+1
00168   if (j) {
00169     j -= '0';
00170     i *= 10;
00171     i += j;
00172   }                                    // v i je číslo za DP
00173   if ((i < 1) || (i > 16)) return 0;   // chyba
00174   i--;                                 // index bude o 1 menší
00175   j = index_table [i];                 // v telegramu na pozici j
00176   c = tlg [j];                         // je písmeno
00177   if (c == 'Z') return +1;             // Z - potom zapni
00178   if (c == 'V') return -1;             // V - vypni
00179   return 0;
00180 }
00181 
00182 void hdo_init (int tv) {
00183   hdo.windex  = 0;
00184   hdo.tindex  = 0;
00185   hdo.counter = 0;
00186   hdo.suma    = 0;
00187   hdo.triger  = tv;
00188   hdo.status  = WAIT_FOR_BEGIN;
00189 }