Communication for solid slow control.
Fork of sscm_comm by
sscm_comm.cpp
- Committer:
- NickRyder
- Date:
- 2014-10-07
- Revision:
- 9:a68c382dea12
- Parent:
- 7:6d3c421026df
File content as of revision 9:a68c382dea12:
#if defined (TARGET_KL25Z) // in mbed problems to call strtol #include "mbed.h" // for the strtol #else #include <stlib.h> // for the strtol #endif #include "sscm_comm.h" #define SSCM_COMM_LIB_SRC_VERSION "3.31" 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; } 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::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); } u16 sscm_comm::getHdrVersion(){ 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) { } sscm_comm::getsscmVersion::getsscmVersion(): getVersion(SSCM_COMM_LIB_HDR_VERSION, SSCM_COMM_LIB_SRC_VERSION, __TIME__, __DATE__){ }