Communication for solid slow control.
Fork of sscm_comm by
Diff: sscm_comm.cpp
- Revision:
- 9:a68c382dea12
- Parent:
- 7:6d3c421026df
diff -r 6d3c421026df -r a68c382dea12 sscm_comm.cpp --- a/sscm_comm.cpp Sun Oct 05 17:11:51 2014 +0000 +++ b/sscm_comm.cpp Tue Oct 07 22:51:01 2014 +0000 @@ -13,89 +13,156 @@ using namespace sscm_comm; int sscm_comm::decode_cmd(char* input, ssc_cmd * sc){ -char part[6]; -int rv=0; - -part[0]=input[0];part[1]=input[1];part[2]=0;sc->module = (u8)strtol(part, NULL, 16); -if( input[3] != SEP ) rv =-1; // tbd check for module range -else { - u16 ic;//input counter - part[0]=input[4];part[1]=input[5];part[2]=0;sc->con = (u8)strtol(part, NULL, 16); - if( input[6] != SEP ) rv= -2; // tbd check for connector range - else { - part[0]=input[7];part[1]=input[8];part[2]=0;sc->dev = (ssc_dev)strtol(part, NULL, 16); - if( input[9] != SEP ) rv= -3; - else { ic=10; - part[0]=input[ic++];part[1]=input[ic++];part[2]=0;sc->devnr = (u8)strtol(part, NULL, 16); - if( input[ic++] != SEP ) rv= -9; - - else { - sc->cmd[0]=input[ic++];sc->cmd[1]=input[ic++];sc->cmd[2]=input[ic++];sc->cmd[3]=input[ic++];sc->cmd[4]='\0'; - if( input[ic++] != SEP ) rv= -4; - else { - part[0]=input[ic++];part[1]=input[ic++];part[2]=0;sc->ch = (u8)strtol(part, NULL, 16); - if( input[ic++] != SEP ) rv= -5; - else{ - part[0]=input[ic++];part[1]=input[ic++];part[2]=input[ic++];part[3]=input[ic++];part[4]=0;sc->datain = (u16)strtol(part, NULL, 16); - if( input[ic++] != SEP ) rv= -6; - else { - part[0]=input[ic++];part[1]=input[ic++];part[2]=input[ic++];part[3]=input[ic++];part[4]=0;sc->dataout = (u16)strtol(part, NULL, 16); - if( input[ic++] != SEP ) rv= -7; - else { - part[0]=input[ic++];part[1]=input[ic++];part[4]=0;sc->status = (u8)strtol(part, NULL, 16); - if( input[ic++] != SEP ) rv= -8; - else rv=0; - - } } } } }} } } - int crr=check_ranges( sc); if ( crr < 0 ) rv=crr ; -for( int i=0;i<27;i++) input[i]=0; - -return rv; + char part[6]; + int rv = 0; + part[0] = input[0]; + part[1] = input[1]; + part[2] = 0; + sc->module = (u8) strtol(part, NULL, 16); + if(input[3] != SEP) { + rv =-1; // tbd check for module range + } else { + u16 ic;//input counter + part[0] = input[4]; + part[1] = input[5]; + part[2] = 0; + sc->con = (u8) strtol(part, NULL, 16); + if(input[6] != SEP) { + rv = -2; // tbd check for connector range + } else { + part[0] = input[7]; + part[1] = input[8]; + part[2] = 0; + sc->dev = (ssc_dev) strtol(part, NULL, 16); + if (input[9] != SEP) { + rv = -3; + } else { + ic = 10; + part[0] = input[ic++]; + part[1] = input[ic++]; + part[2] = 0; + sc->devnr = (u8) strtol(part, NULL, 16); + if (input[ic++] != SEP) { + rv = -9; + } else { + sc->cmd[0] = input[ic++]; + sc->cmd[1] = input[ic++]; + sc->cmd[2] = input[ic++]; + sc->cmd[3] = input[ic++]; + sc->cmd[4] = '\0'; + if (input[ic++] != SEP) { + rv = -4; + } else { + part[0] = input[ic++]; + part[1] = input[ic++]; + part[2] = 0; + sc->ch = (u8) strtol(part, NULL, 16); + if (input[ic++] != SEP) { + rv= -5; + } else { + part[0] = input[ic++]; + part[1] = input[ic++]; + part[2] = input[ic++]; + part[3] = input[ic++]; + part[4] = 0; + sc->datain = (u16) strtol(part, NULL, 16); + if(input[ic++] != SEP) { + rv= -6; + } else { + part[0] = input[ic++]; + part[1] = input[ic++]; + part[2] = input[ic++]; + part[3] = input[ic++]; + part[4] = 0; + sc->dataout = (u16) strtol(part, NULL, 16); + if (input[ic++] != SEP) { + rv= -7; + } else { + part[0] = input[ic++]; + part[1] = input[ic++]; + part[4] = 0; + sc->status = (u8) strtol(part, NULL, 16); + if (input[ic++] != SEP) { + rv = -8; + } else { + rv = 0; + } + } + } + } + } + } + } + } + } + int crr = check_ranges(sc); + if (crr < 0) rv = crr; + for (int i = 0; i < 27; i++) { + input[i] = 0; + } + return rv; } -int sscm_comm::check_ranges( ssc_cmd* sc ){ - - int rv =1; // no check done - // devnr check - if ( sc->con <1 || sc->con >2 ){ rv= -43; goto RVOUT;} - switch ( sc->dev) { - case ADC : if(sc->devnr < 1 || sc->devnr > 2 ){ rv=-23; break; } - break; - - case TEMP : if( sc->ch <1 || sc->ch >2) {rv =-22 ;break;} - break; - default : rv=1; - } -RVOUT: return rv; - +int sscm_comm::check_ranges(ssc_cmd * sc) { + int rv = 1; // no check done + // devnr check + if (sc->con < 1 || sc->con > 2) { + rv = -43; + goto RVOUT; // goto jail. Do not collect £200. + } + switch (sc->dev) { + case ADC: + if (sc->devnr < 1 || sc->devnr > 2) { + rv = -23; + break; + } + break; + case TEMP: + if (sc->ch < 1 || sc->ch > 2) { + rv = -22; + break; + } + break; + default: + rv = 1; + } +RVOUT: + return rv; } -void sscm_comm::encode_cmd ( char *output , ssc_cmd *sc) { - sprintf(output,"%c%02X%c%02X%c%02X%c%02X%c%c%c%c%c%c%02X%c%04X%c%04X%c%02X%c%c\0", - CMDSTART,sc->module,SEP,sc->con,SEP,sc->dev,SEP,sc->devnr,SEP,sc->cmd[0],sc->cmd[1],sc->cmd[2],sc->cmd[3], - SEP,sc->ch,SEP,sc->datain,SEP,sc->dataout,SEP,sc->status,SEP,CMDSTOP); - } +void sscm_comm::encode_cmd(char * output, ssc_cmd * sc) { + sprintf(output, + "%c%02X%c%02X%c%02X%c%02X%c%c%c%c%c%c%02X%c%04X%c%04X%c%02X%c%c\0", + CMDSTART, sc->module, SEP, sc->con, SEP, sc->dev, SEP, sc->devnr, + SEP, sc->cmd[0], sc->cmd[1], sc->cmd[2], sc->cmd[3], + SEP, sc->ch, SEP, sc->datain, SEP, sc->dataout, SEP, + sc->status, SEP, CMDSTOP); +} - - void sscm_comm::getmodulecordinate(u8 plane, u8& modulenr, u8& connr ,u8& serialnr ){ +void sscm_comm::getmodulecordinate(u8 plane, u8& modulenr, u8& connr, u8& serialnr) { // to be implemented modulenr=0; } - /* - u16 sscm_comm::getSrcVersion(){ - return get_hex_version_nr(SSCM_COMM_LIB_SRC_VERSION ); + return get_hex_version_nr(SSCM_COMM_LIB_SRC_VERSION); } u16 sscm_comm::getHdrVersion(){ - return get_hex_version_nr(SSCM_COMM_LIB_HDR_VERSION ); + return get_hex_version_nr(SSCM_COMM_LIB_HDR_VERSION ); } */ -void sscm_comm::get_mppc_dac_chnr(u8 plane, u8 x , u8 y, u8& ch,u8& modulenr, u8& connr ,u8&dacch, u8& serialnr ) {}; -void sscm_comm::get_mppc_adc_chnr(u8 plane, u8 x , u8 y, u8& ch,u8& modulenr, u8& connr , u8& adcdevnr, u8& adcchnr , u8& serialnr ){}; + +void sscm_comm::get_mppc_dac_chnr(u8 plane, u8 x, u8 y, u8& ch, u8& modulenr, + u8& connr, u8& dacch, u8& serialnr) { +} - +void sscm_comm::get_mppc_adc_chnr(u8 plane, u8 x , u8 y, u8& ch, u8& modulenr, + u8& connr, u8& adcdevnr, u8& adcchnr, + u8& serialnr) { +} -sscm_comm::getsscmVersion::getsscmVersion():getVersion( SSCM_COMM_LIB_HDR_VERSION,SSCM_COMM_LIB_SRC_VERSION, __TIME__, __DATE__){}; +sscm_comm::getsscmVersion::getsscmVersion(): + getVersion(SSCM_COMM_LIB_HDR_VERSION, SSCM_COMM_LIB_SRC_VERSION, __TIME__, __DATE__){ +}