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 "NoninStreamParser.h"
00029
00030
00031
00032
00033 #include <stdio.h>
00034
00035
00036 #define PARSER_STATE_NULL 0x00
00037 #define PARSER_STATE_SYNC 0x01
00038 #define PARSER_STATE_SYNC_CHECK 0x02
00039 #define PARSER_STATE_PLETHMSB 0x03
00040 #define PARSER_STATE_PLETHLSB 0x04
00041 #define PARSER_STATE_DATA 0x05
00042 #define PARSER_STATE_CHKSUM 0x06
00043
00044
00045
00046
00047 int
00048 NONIN_initParser( NoninStreamParser *parser,
00049 void (*handleDataValueFunc)(unsigned char frame, unsigned char plethMSB, unsigned char plethLSB, unsigned char data, void *customData),
00050 void *customData ) {
00051
00052 if( !parser ) return( -1 );
00053
00054
00055 parser->state = PARSER_STATE_SYNC;
00056
00057
00058 parser->handleDataValue = handleDataValueFunc;
00059 parser->customData = customData;
00060 parser->frame = PARSER_CODE_HRMSB;
00061
00062 return( 0 );
00063 }
00064
00065
00066
00067
00068 int
00069 NONIN_parseByte( NoninStreamParser *parser, unsigned char byte )
00070 {
00071 int returnValue = 0;
00072 if( !parser ) return( -1 );
00073
00074
00075 switch( parser->state ) {
00076
00077
00078 case( PARSER_STATE_SYNC ):
00079 if( byte == 1 ) {
00080 parser->check = 0;
00081 parser->state = PARSER_STATE_SYNC_CHECK;
00082 parser->sync = 1;
00083 returnValue = 1;
00084 }
00085 else
00086 returnValue = -1;
00087 break;
00088
00089
00090 case( PARSER_STATE_SYNC_CHECK ):
00091 parser->state = PARSER_STATE_PLETHMSB;
00092
00093 parser->plethMSBByte = byte;
00094 returnValue = 2;
00095 break;
00096
00097
00098 case( PARSER_STATE_PLETHMSB ):
00099 parser->state = PARSER_STATE_PLETHLSB;
00100
00101 parser->plethLSBByte = byte;
00102 returnValue = 3;
00103 break;
00104
00105
00106
00107 case( PARSER_STATE_PLETHLSB ):
00108 parser->state = PARSER_STATE_DATA;
00109
00110 parser->dataByte = byte;
00111 returnValue = 4;
00112 break;
00113
00114
00115 case( PARSER_STATE_DATA ):
00116 parser->chksum = byte;
00117 parser->state = PARSER_STATE_CHKSUM;
00118
00119
00120
00121 parser->check = 1;
00122 parser->handleDataValue(parser->frame,parser->plethMSBByte,parser->plethLSBByte, parser->dataByte, parser->customData);
00123 parser->state = PARSER_STATE_SYNC;
00124 returnValue = 5;
00125
00126 break;
00127
00128
00129
00130 default:
00131 returnValue = -6;
00132 break;
00133 }
00134 return( returnValue );
00135 }
00136
00137
00142 int parseFrame( NoninStreamParser *parser )
00143 {
00144
00145
00146 if( parser->handleDataValue )
00147 {
00148 parser->handleDataValue(parser->frame,parser->plethMSBByte,parser->plethLSBByte, parser->dataByte, parser->customData);
00149 return 0;
00150 }
00151 return -1;
00152 }