00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "NoninCom.h"
00029
00030 std::list<NoninCom*> noninList;
00031
00032 NoninCom::NoninCom() : LSerie(), openutils::Thread()
00033 {
00034 state = false;
00035 tickData = 0;
00036 timeOut = 0;
00037 displayType = DISPLAY_FULL;
00038 artifact = false;
00039 oot = false;
00040 snsa = false;;
00041 perf = RED;
00042 NONIN_initParser( &parser, handleDataValueFunc,this);
00043 noninList.push_back(this);
00044 start();
00045 isRunning = true;
00046 }
00047
00048 NoninCom::~NoninCom()
00049 {
00050 isRunning = false;
00051 state = false;
00052 this->stop();
00053 noninList.remove(this);
00054 }
00055
00056 bool NoninCom::IsNoninConnected(int numPort, long speedInBaud)
00057 {
00058 int syncByte = 0;
00059 if(open(numPort,speedInBaud, 8, 0, 1))
00060 {
00061
00062
00063 SendSerialNumberCommand();
00064 UINT timeout = GetTickCount();
00065
00066 while((syncByte <= 0) && ((GetTickCount() - timeout) < 10000))
00067 {
00068 unsigned char streamByteH[1];
00069 receiveData(1,streamByteH);
00070 if(streamByteH[0] == 2)
00071 {
00072 syncByte = SetSerialNumber();
00073 }
00074 }
00075
00076 syncByte = FillConfigurationSector();
00077 if (syncByte > 0)
00078 {
00079 return true;
00080 }
00081 else
00082 {
00083 disconnect();
00084 return false;
00085 }
00086 }
00087 return false;
00088 }
00089
00090 bool NoninCom::connect()
00091 {
00092
00093 DWORD firstTime = timeGetTime() ;
00094 while(isRunning && timeGetTime()-firstTime<DISCONNECTION_WIN_TIME);
00095 int cpt = 0 ;
00096 do
00097 {
00098 cpt++;
00099 if(IsNoninConnected(cpt,N_BAUD_9600))
00100 {
00101 state = true;
00102 PostMessage(HScol, NONIN_CONNECTED_CB, (int)this,NULL);
00103 }
00104 } while(cpt!=16 && !state && isRunning);
00105
00106 return state;
00107 }
00108
00109
00110 bool NoninCom::safe_connection()
00111 {
00112 if (state) disconnect();
00113 return connect();
00114 }
00115
00116
00117 int NoninCom::parseByte()
00118 {
00119 unsigned char streamByteH[1];
00120 receiveData(1,streamByteH);
00121 int syncByte = NONIN_parseByte(&parser, streamByteH[0]);
00122 return 1;
00123 }
00124
00125
00126 int NoninCom::SendSerialNumberCommand()
00127 {
00128 unsigned char command[6] = {0x02,0x74,0x02,0x02,0x02,0x03};
00129 sendData(6,command);
00130 return 1;
00131 }
00132
00133
00134 int NoninCom::SetSerialNumber()
00135 {
00136 unsigned char streamByteH[1];
00137
00138 receiveData(1,streamByteH);
00139 if(streamByteH[0] != 244)
00140 return 0;
00141
00142 receiveData(1,streamByteH);
00143 if(streamByteH[0] != 11)
00144 return 0;
00145
00146 receiveData(1,streamByteH);
00147 if(streamByteH[0] != 2)
00148 return 0;
00149
00150 unsigned char serial[9];
00151 receiveData(9,serial);
00152
00153 unsigned char chkSum[1];
00154 receiveData(1,chkSum);
00155 int result = streamByteH[0];
00156 for(int i=0;i<9;i++)
00157 result += serial[i];
00158 if(result%256 != chkSum[0])
00159 return 0;
00160 receiveData(1,streamByteH);
00161 for(int i=0;i<9;i++)
00162 serialNumber += (char)serial[i];
00163 return 1;
00164 }
00165
00166
00167 int NoninCom::SendOptions()
00168 {
00169 unsigned char command[8] = {0x02,0x70,0x04,0x02,0x02,0x61,0xD9,0x03};
00170 sendData(8,command);
00171 UINT timeout = GetTickCount();
00172 unsigned char streamByteH[1];
00173 receiveData(1,streamByteH);
00174 MMechostr(1,"Wating ACK bytes : %i\n",streamByteH[0]);
00175 while(streamByteH[0] != 6 && ((GetTickCount() - timeout) < 10000))
00176 {
00177 receiveData(1,streamByteH);
00178 MMechostr(1,"Wating ACK bytes : %i\n",streamByteH[0]);
00179 }
00180 if(streamByteH[0]==6)
00181 return 1;
00182 return 0;
00183 }
00184
00185
00186 int NoninCom::FillConfigurationSector()
00187 {
00188 unsigned char command[138] =
00189 {
00190
00191 0x00,'1','1','4','2',
00192
00193 '0','9','0','1','0','1','0','1','0','1',
00194
00195 '2','0','0','1','0','1','0','1','0','1',
00196
00197 '0','9','0','1','0','1','0','1','0','1',
00198
00199 '2','0','0','1','0','1','0','1','0','1',
00200
00201 '0','9','0','1','0','1','0','1','0','1',
00202
00203 '2','0','0','1','0','1','0','1','0','1',
00204
00205 '0','0','0','0','0','0','0','0','0','0',
00206 '0','0','0','0','0','0','0','0','0','0',
00207 '0','0','0','0','0','0','0','0','0','0',
00208 '0','0','0','0','0','0','0','0','0','0',
00209 '0','0','0','0','0','0','0','0','0','0',
00210
00211 '0','0','0','0',
00212
00213 '0','0','0',
00214
00215
00216 '0','0','0','0','0','0',
00217
00218 0x00,0x00,0x00,0x00,0x00,0x00,
00219
00220 0x30,0x11,
00221
00222 0x0D,0x0A
00223 };
00224 sendData(138,command);
00225 int val = 0;
00226 for(int i = 0;i<134;i++)
00227 {
00228 val+=command[i];
00229 }
00230 MMechostr(1,"Command : %i\n",val);
00231 UINT timeout = GetTickCount();
00232 unsigned char streamByteH[1];
00233 receiveData(1,streamByteH);
00234 MMechostr(1,"Wating ACK bytes : %i\n",streamByteH[0]);
00235 while(streamByteH[0] != 6 && ((GetTickCount() - timeout) < 10000))
00236 {
00237 receiveData(1,streamByteH);
00238 MMechostr(1,"Wating ACK bytes : %i\n",streamByteH[0]);
00239 }
00240 if(streamByteH[0]==6)
00241 return 1;
00242 return 0;
00243 }
00244
00245
00246 std::string NoninCom::GetSerialNumber()
00247 {
00248 if(state)
00249 return serialNumber;
00250 return "";
00251 }
00252
00253
00254 bool NoninCom::dataIsValide(int data)
00255 {
00256 if(data)
00257 return true;
00258 return false;
00259 }
00260
00261
00265 void NoninCom::handleDataValueFunc(unsigned char code,unsigned char plethMSB, unsigned char plethLSB, unsigned char data, void *customData )
00266 {
00267 NoninCom* nonin = (NoninCom*)customData;
00268
00269
00270 if((plethMSB&8))
00271 {
00272 if(!nonin->snsa)
00273 {
00274 PostMessage(HScol, NONIN_SNSA_CB, (int)customData,NULL);
00275 nonin->snsa = true;
00276 }
00277 return;
00278 }
00279
00280 switch( code )
00281 {
00282 case( PARSER_CODE_HRMSB ):
00283 nonin->parser.frame = PARSER_CODE_HRLSB;
00284 break;
00285 case( PARSER_CODE_HRLSB ):
00286 nonin->parser.frame = PARSER_CODE_SPO2;
00287 break;
00288 case( PARSER_CODE_SPO2 ):
00289 if(nonin->dataIsValide((int)data))
00290 PostMessage(HScol, NONIN_SPO2_CB, (int)customData,(LPARAM)((int)data));
00291 nonin->parser.frame = PARSER_CODE_SREV;
00292 break;
00293 case( PARSER_CODE_SREV ):
00294 nonin->parser.frame = PARSER_CODE_RESERVED6;
00295 break;
00296 case( PARSER_CODE_RESERVED6 ):
00297 nonin->parser.frame = PARSER_CODE_TMRMSB;
00298 break;
00299 case( PARSER_CODE_TMRMSB ):
00300 nonin->parser.frame = PARSER_CODE_TMRLSB;
00301 break;
00302 case( PARSER_CODE_TMRLSB ):
00303 nonin->parser.frame = PARSER_CODE_STAT2;
00304 break;
00305 case( PARSER_CODE_STAT2 ):
00306 MMechostr(1,"STAT2 \n");
00307 if(data&0x00000001)
00308 MMechostr(1,"Replace Battery\n");
00309 else
00310 MMechostr(1,"Battery : ok\n");
00311 nonin->parser.frame = PARSER_CODE_SPO2D;
00312 break;
00313 case( PARSER_CODE_SPO2D ):
00314 nonin->parser.frame = PARSER_CODE_SPO2FAST;
00315 break;
00316 case( PARSER_CODE_SPO2FAST ):
00317 nonin->parser.frame = PARSER_CODE_SPO2BB;
00318 break;
00319 case( PARSER_CODE_SPO2BB ):
00320 nonin->parser.frame = PARSER_CODE_RESERVED12;
00321 break;
00322 case( PARSER_CODE_RESERVED12 ):
00323 nonin->parser.frame = PARSER_CODE_RESERVED13;
00324 break;
00325 case( PARSER_CODE_RESERVED13 ):
00326 nonin->parser.frame = PARSER_CODE_EHRMSB;
00327 break;
00328 case( PARSER_CODE_EHRMSB ):
00329 nonin->parser.frame = PARSER_CODE_EHRLSB;
00330 break;
00331 case( PARSER_CODE_EHRLSB ):
00332 nonin->parser.frame = PARSER_CODE_ESPO2;
00333 break;
00334 case( PARSER_CODE_ESPO2 ):
00335 nonin->parser.frame = PARSER_CODE_ESPO2D;
00336 break;
00337 case( PARSER_CODE_ESPO2D ):
00338 nonin->parser.frame = PARSER_CODE_RESERVED18;
00339 break;
00340 case( PARSER_CODE_RESERVED18 ):
00341 nonin->parser.frame = PARSER_CODE_RESERVED19;
00342 break;
00343 case( PARSER_CODE_RESERVED19 ):
00344 nonin->parser.frame = PARSER_CODE_HRDMSB;
00345 break;
00346 case( PARSER_CODE_HRDMSB ):
00347 nonin->parser.frame = PARSER_CODE_HRDLSB;
00348 break;
00349 case( PARSER_CODE_HRDLSB ):
00350 nonin->parser.frame = PARSER_CODE_EHRDMSB;
00351 break;
00352 case( PARSER_CODE_EHRDMSB ):
00353 nonin->parser.frame = PARSER_CODE_EHRDLSB;
00354 break;
00355 case( PARSER_CODE_EHRDLSB ):
00356 if(nonin->dataIsValide((int)data))
00357 PostMessage(HScol, NONIN_HR_CB, (int)customData,(LPARAM)((int)data));
00358 nonin->parser.frame = PARSER_CODE_RESERVED24;
00359 break;
00360 case( PARSER_CODE_RESERVED24 ):
00361 nonin->parser.frame = PARSER_CODE_RESERVED25;
00362 break;
00363 case( PARSER_CODE_RESERVED25 ):
00364 nonin->parser.frame = PARSER_CODE_HRMSB;
00365 break;
00366 default:
00367 break;
00368 }
00369 }
00370
00371
00372 void NoninCom::disconnect()
00373 {
00374 closeCom();
00375 state = false;
00376 PostMessage(HScol, NONIN_DISCONNECTED_CB, (int)this,NULL);
00377 }
00378
00379
00380 void NoninCom::run()
00381 {
00382 try
00383 {
00384 tickData = GetTickCount();
00385 while(isRunning)
00386 {
00387 if(!state)
00388 safe_connection();
00389
00390 if(state)
00391 {
00392 if(!parseByte())
00393 safe_connection();
00394 }
00395 }
00396 disconnect();
00397 }
00398 catch(openutils::ThreadException ex)
00399 {
00400 MMechostr(MSKDEBUG,"error thread : %s \n",ex.getMessage().c_str()) ;
00401 }
00402 }