functions for the communication between SOLID slow control modules and Cprograms

Dependents:   sscm SPItest sscm

Committer:
wbeaumont
Date:
Tue Oct 14 17:06:23 2014 +0000
Revision:
9:4bfcfa029dff
Parent:
7:6d3c421026df
Child:
10:0675c2e3d330
changed error codes for decode and range checking

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wbeaumont 2:1f9887337a1b 1 #if defined (TARGET_KL25Z)
wbeaumont 2:1f9887337a1b 2 // in mbed problems to call strtol
wbeaumont 2:1f9887337a1b 3 #include "mbed.h" // for the strtol
wbeaumont 2:1f9887337a1b 4 #else
wbeaumont 2:1f9887337a1b 5 #include <stlib.h> // for the strtol
wbeaumont 2:1f9887337a1b 6 #endif
wbeaumont 1:288db0531b1f 7
wbeaumont 9:4bfcfa029dff 8
wbeaumont 9:4bfcfa029dff 9 /*****
wbeaumont 9:4bfcfa029dff 10 * version history
wbeaumont 9:4bfcfa029dff 11 * v3.31 first version history entry
wbeaumont 9:4bfcfa029dff 12 * v3.32 changed the return values for decode and range checking
wbeaumont 9:4bfcfa029dff 13 *******/
wbeaumont 9:4bfcfa029dff 14
wbeaumont 1:288db0531b1f 15 #include "sscm_comm.h"
wbeaumont 0:2afae79ea9ca 16
wbeaumont 0:2afae79ea9ca 17
wbeaumont 9:4bfcfa029dff 18
wbeaumont 9:4bfcfa029dff 19
wbeaumont 9:4bfcfa029dff 20 #define SSCM_COMM_LIB_SRC_VERSION "3.32"
wbeaumont 0:2afae79ea9ca 21
wbeaumont 1:288db0531b1f 22 using namespace sscm_comm;
wbeaumont 0:2afae79ea9ca 23
wbeaumont 0:2afae79ea9ca 24 int sscm_comm::decode_cmd(char* input, ssc_cmd * sc){
wbeaumont 0:2afae79ea9ca 25 char part[6];
wbeaumont 0:2afae79ea9ca 26 int rv=0;
wbeaumont 0:2afae79ea9ca 27
wbeaumont 0:2afae79ea9ca 28 part[0]=input[0];part[1]=input[1];part[2]=0;sc->module = (u8)strtol(part, NULL, 16);
wbeaumont 2:1f9887337a1b 29 if( input[3] != SEP ) rv =-1; // tbd check for module range
wbeaumont 0:2afae79ea9ca 30 else {
wbeaumont 5:357fa8928d63 31 u16 ic;//input counter
wbeaumont 0:2afae79ea9ca 32 part[0]=input[4];part[1]=input[5];part[2]=0;sc->con = (u8)strtol(part, NULL, 16);
wbeaumont 2:1f9887337a1b 33 if( input[6] != SEP ) rv= -2; // tbd check for connector range
wbeaumont 0:2afae79ea9ca 34 else {
wbeaumont 0:2afae79ea9ca 35 part[0]=input[7];part[1]=input[8];part[2]=0;sc->dev = (ssc_dev)strtol(part, NULL, 16);
wbeaumont 0:2afae79ea9ca 36 if( input[9] != SEP ) rv= -3;
wbeaumont 2:1f9887337a1b 37 else { ic=10;
wbeaumont 2:1f9887337a1b 38 part[0]=input[ic++];part[1]=input[ic++];part[2]=0;sc->devnr = (u8)strtol(part, NULL, 16);
wbeaumont 2:1f9887337a1b 39 if( input[ic++] != SEP ) rv= -9;
wbeaumont 2:1f9887337a1b 40
wbeaumont 2:1f9887337a1b 41 else {
wbeaumont 3:e9053e5e7175 42 sc->cmd[0]=input[ic++];sc->cmd[1]=input[ic++];sc->cmd[2]=input[ic++];sc->cmd[3]=input[ic++];sc->cmd[4]='\0';
wbeaumont 2:1f9887337a1b 43 if( input[ic++] != SEP ) rv= -4;
wbeaumont 2:1f9887337a1b 44 else {
wbeaumont 2:1f9887337a1b 45 part[0]=input[ic++];part[1]=input[ic++];part[2]=0;sc->ch = (u8)strtol(part, NULL, 16);
wbeaumont 2:1f9887337a1b 46 if( input[ic++] != SEP ) rv= -5;
wbeaumont 0:2afae79ea9ca 47 else{
wbeaumont 5:357fa8928d63 48 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);
wbeaumont 2:1f9887337a1b 49 if( input[ic++] != SEP ) rv= -6;
wbeaumont 0:2afae79ea9ca 50 else {
wbeaumont 5:357fa8928d63 51 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);
wbeaumont 2:1f9887337a1b 52 if( input[ic++] != SEP ) rv= -7;
wbeaumont 4:66d1a4200f67 53 else {
wbeaumont 4:66d1a4200f67 54 part[0]=input[ic++];part[1]=input[ic++];part[4]=0;sc->status = (u8)strtol(part, NULL, 16);
wbeaumont 4:66d1a4200f67 55 if( input[ic++] != SEP ) rv= -8;
wbeaumont 0:2afae79ea9ca 56 else rv=0;
wbeaumont 0:2afae79ea9ca 57
wbeaumont 4:66d1a4200f67 58 } } } } }} } }
wbeaumont 9:4bfcfa029dff 59 if ( rv ==0) {
wbeaumont 9:4bfcfa029dff 60 int crr=check_ranges( sc);
wbeaumont 9:4bfcfa029dff 61 if ( crr < 0 ) rv=crr ;
wbeaumont 9:4bfcfa029dff 62 }
wbeaumont 9:4bfcfa029dff 63 // clean input string
wbeaumont 9:4bfcfa029dff 64 for( int i=0;i<27;i++) input[i]=0;
wbeaumont 0:2afae79ea9ca 65
wbeaumont 0:2afae79ea9ca 66 return rv;
wbeaumont 0:2afae79ea9ca 67 }
wbeaumont 0:2afae79ea9ca 68
wbeaumont 2:1f9887337a1b 69 int sscm_comm::check_ranges( ssc_cmd* sc ){
wbeaumont 2:1f9887337a1b 70
wbeaumont 2:1f9887337a1b 71 int rv =1; // no check done
wbeaumont 2:1f9887337a1b 72 // devnr check
wbeaumont 9:4bfcfa029dff 73 if ( sc->con <1 || sc->con >2 ){ rv= -0x10; goto RVOUT;}
wbeaumont 2:1f9887337a1b 74 switch ( sc->dev) {
wbeaumont 9:4bfcfa029dff 75 case ADC : if(sc->devnr < 1 || sc->devnr > 2 ){ rv=-0x11; break; }
wbeaumont 6:d9a96735d0fb 76 break;
wbeaumont 2:1f9887337a1b 77
wbeaumont 9:4bfcfa029dff 78 case TEMP : if( sc->ch <1 || sc->ch >2) {rv =-0x12 ;break;}
wbeaumont 6:d9a96735d0fb 79 break;
wbeaumont 6:d9a96735d0fb 80 default : rv=1;
wbeaumont 2:1f9887337a1b 81 }
wbeaumont 3:e9053e5e7175 82 RVOUT: return rv;
wbeaumont 2:1f9887337a1b 83
wbeaumont 2:1f9887337a1b 84 }
wbeaumont 2:1f9887337a1b 85
wbeaumont 0:2afae79ea9ca 86 void sscm_comm::encode_cmd ( char *output , ssc_cmd *sc) {
wbeaumont 4:66d1a4200f67 87 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",
wbeaumont 2:1f9887337a1b 88 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],
wbeaumont 4:66d1a4200f67 89 SEP,sc->ch,SEP,sc->datain,SEP,sc->dataout,SEP,sc->status,SEP,CMDSTOP);
wbeaumont 0:2afae79ea9ca 90 }
wbeaumont 0:2afae79ea9ca 91
wbeaumont 0:2afae79ea9ca 92
wbeaumont 0:2afae79ea9ca 93 void sscm_comm::getmodulecordinate(u8 plane, u8& modulenr, u8& connr ,u8& serialnr ){
wbeaumont 1:288db0531b1f 94 // to be implemented
wbeaumont 1:288db0531b1f 95 modulenr=0;
wbeaumont 6:d9a96735d0fb 96 }
wbeaumont 6:d9a96735d0fb 97
wbeaumont 0:2afae79ea9ca 98
wbeaumont 7:6d3c421026df 99 /*
wbeaumont 6:d9a96735d0fb 100
wbeaumont 7:6d3c421026df 101 u16 sscm_comm::getSrcVersion(){
wbeaumont 7:6d3c421026df 102 return get_hex_version_nr(SSCM_COMM_LIB_SRC_VERSION );
wbeaumont 7:6d3c421026df 103 }
wbeaumont 6:d9a96735d0fb 104
wbeaumont 7:6d3c421026df 105 u16 sscm_comm::getHdrVersion(){
wbeaumont 7:6d3c421026df 106 return get_hex_version_nr(SSCM_COMM_LIB_HDR_VERSION );
wbeaumont 7:6d3c421026df 107 }
wbeaumont 7:6d3c421026df 108 */
wbeaumont 6:d9a96735d0fb 109 void sscm_comm::get_mppc_dac_chnr(u8 plane, u8 x , u8 y, u8& ch,u8& modulenr, u8& connr ,u8&dacch, u8& serialnr ) {};
wbeaumont 6:d9a96735d0fb 110 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 ){};
wbeaumont 7:6d3c421026df 111
wbeaumont 7:6d3c421026df 112
wbeaumont 7:6d3c421026df 113
wbeaumont 7:6d3c421026df 114 sscm_comm::getsscmVersion::getsscmVersion():getVersion( SSCM_COMM_LIB_HDR_VERSION,SSCM_COMM_LIB_SRC_VERSION, __TIME__, __DATE__){};