Communication for solid slow control.

Fork of sscm_comm by wimbeaumont Project

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__){
+}