hdo
beta
|
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 }