firmware for the SOLID Slow Control Module for SM1

Dependencies:   S_SCTRL_SMlib adc_ad9249 mbed sscm_comm AD5384 SWSPI T_adt7320

Revision:
10:efd3f490648c
Parent:
9:20fc5a795ec4
Child:
11:b1e6d7c18790
--- a/main.cpp	Sun Dec 07 23:43:41 2014 +0000
+++ b/main.cpp	Tue Jan 20 16:00:27 2015 +0000
@@ -23,11 +23,16 @@
   * v 1.66  implemented real  temperature readout 
   * v 1.70  implemented set_volt and get_volt commands
   * v 1.72  implemented setbias , get bias volt  dummy
-  * v 1.73 implemented setbias , get bias volt  via Deimos32 class 
-  * v 1.74 added check for empty deimos pointer 
+  * v 1.73  implemented setbias , get bias volt  via Deimos32 class 
+  * v 1.74  added check for empty deimos pointer 
+  * v 1.75  added check for devnr < 1 
+  * v 1.76  added check for devnr per device type , added connector range  ( only 1 or 2 are accepted)
+  * v 1.78  canged the place of cmd read to the end of the mail loop was at the start
+  * v 1.79  added hv stet /get string to replace bi(ias) old commands are still working
+  *         wait only if cmd is not ready 
 */ 
 
-#define VERSION "1.74
+#define VERSION "1.79"
 
 
 #include "SWSPI_BI.h"
@@ -113,18 +118,19 @@
 
     cmdready=false;
     while (1) {
-        wait(0.5);
         char cmdoutstr[100];  
         if (cmdready) {
-            cmdready=false;
+            //cmdready=false;
             int decresult=decode_cmd(cmdin,&cmd);
             //printf("decode result = %d \n\r" ,decresult);
-            if( decresult){                 
-                 decresult=abs(decresult);
+            decresult=abs(decresult);
+            if( cmd.con  <1 || cmd.con > 2   ) { decresult= 0x04 +decresult; } 
+            if( decresult){                                  
                  u8  errcode=(u8)decresult ;
                  errcode = 0xE0 + errcode;
                  cmd.status=errcode;
-                 encode_cmd ( cmdoutstr, &cmd); pc.printf( "%s", cmdoutstr);  
+                 encode_cmd ( cmdoutstr, &cmd); pc.printf( "%s", cmdoutstr);
+                 cmdready=false;
                  continue; 
             }
                  
@@ -141,6 +147,8 @@
                     cmd.status=2;
                     //pc.printf("ADC cmd = %s \n\r",cmd.cmd);
                     //pc.printf("check now ranges %d %d  \n\r",cmd.con, cmd.devnr);
+                    if( cmd.devnr < 1 || cmd.devnr > 2 ) { cmd.status =3; }
+                    else {
                     if (!strcmp( cmd.cmd, "spa1")) { adc[cmd.con-1][cmd.devnr-1].setPattern1(cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;}
                     if (!strcmp( cmd.cmd, "spa2")) { adc[cmd.con-1][cmd.devnr-1].setPattern2(cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;}
                     if (!strcmp( cmd.cmd, "rpa1")) { adc[cmd.con-1][cmd.devnr-1].readPattern1(do16 ); cmd.dataout=do16; cmd.status=0; }
@@ -153,9 +161,11 @@
                     if (!strcmp( cmd.cmd, "gscv")) {do16=adc[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;}
                     if (!strcmp( cmd.cmd, "ini1")) { adc[cmd.con-1][cmd.devnr-1].init1();cmd.dataout=cmd.datain;cmd.status=0;}
                     if (!strcmp( cmd.cmd, "ini2")) { adc[cmd.con-1][cmd.devnr-1].init2();cmd.dataout=cmd.datain;cmd.status=0;}
+                    } // end  check dev nr. 
                 }break;
                 case DAC :{
-                    cmd.status=2;                    
+                    cmd.status=2;
+                    if(  cmd.devnr != 1 ) { cmd.status =3;goto DACENDCMD; } 
                     if (!strcmp( cmd.cmd, "ini1")) { dac[cmd.con-1][cmd.devnr-1].init1();cmd.dataout=cmd.datain;cmd.status=0; goto DACENDCMD;}
                     if (!strcmp( cmd.cmd, "ini2")) { dac[cmd.con-1][cmd.devnr-1].init2();cmd.dataout=cmd.datain;cmd.status=0; goto DACENDCMD;}
                     if (!strcmp( cmd.cmd, "srst")) { dac[cmd.con-1][cmd.devnr-1].soft_rst();cmd.dataout=cmd.datain;cmd.status=0;goto DACENDCMD;}
@@ -164,16 +174,19 @@
                     if (!strcmp( cmd.cmd, "ghrv")) { do16=dac[cmd.con-1][cmd.devnr-1].getHdrVersion();cmd.dataout=do16; cmd.status=0;goto DACENDCMD;}
                     if (!strcmp( cmd.cmd, "gscv")) { do16=dac[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;goto DACENDCMD;}
                     // set output register bias channel 
-                    if (!strcmp( cmd.cmd, "sbid")) { cmd.ch=DACBIASCH;dac[cmd.con-1][cmd.devnr-1].set_dac(cmd.ch-1,cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;goto DACENDCMD;}
-                    if (!strcmp( cmd.cmd, "gbid")) {cmd.ch=DACBIASCH;do16=dac[cmd.con-1][cmd.devnr-1].get_dac(cmd.ch-1);cmd.dataout=do16;cmd.status=0;goto DACENDCMD;}
+                    if ((!strcmp( cmd.cmd, "sbid")) || (!strcmp( cmd.cmd, "shvd")) ) 
+                            { cmd.ch=DACBIASCH;dac[cmd.con-1][cmd.devnr-1].set_dac(cmd.ch-1,cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;goto DACENDCMD;}
+                    if ((!strcmp( cmd.cmd, "gbid")) || (!strcmp( cmd.cmd, "ghvd")) ) 
+                            {cmd.ch=DACBIASCH;do16=dac[cmd.con-1][cmd.devnr-1].get_dac(cmd.ch-1);cmd.dataout=do16;cmd.status=0;goto DACENDCMD;}
                     if (!strcmp( cmd.cmd, "inhv")) { 
                         if(cmd.con== 0) {cmd.status=100;goto DACENDCMD;} // can not be broadcast ;}
                         if(cmd.con > 2) {cmd.status=101;goto DACENDCMD;}
+                        if( deimos[cmd.con-1] ) {cmd.status=102;goto DACENDCMD;} // if already init don't init again.
                         float hvnom=u162float( cmd.dataout , cmd.datain);
                         deimos[cmd.con-1]= new Deimos32(hvnom ,cmd.con-1,&dac[cmd.con-1][cmd.devnr-1]);
                         cmd.status=0;goto DACENDCMD;
                     }    
-                    if (!strcmp( cmd.cmd, "sbia")) {
+                    if ((!strcmp( cmd.cmd, "sbia")) || (!strcmp( cmd.cmd, "sthv")) ) {
                          float biasvolt= u162float( cmd.dataout , cmd.datain); 
                          u8 strtcnt=0; u8 stpcnt=2;
                          if (cmd.con ==1)  stpcnt=1;
@@ -185,7 +198,7 @@
                          }
                          cmd.status=u8(retvalue);goto DACENDCMD;
                     }
-                    if (!strcmp( cmd.cmd, "gbia")) {
+                    if ((!strcmp( cmd.cmd, "gbia")) || (!strcmp( cmd.cmd, "gthv"))) {
                             if ( cmd.con ==0 ) cmd.con=1;
                             if (deimos[cmd.con-1]) {
                                 float volt=deimos[cmd.con-1]->getHv();
@@ -247,7 +260,8 @@
                      }          
                      DACENDCMD : ;
                 }break; 
-                case TEMP : cmd.status=2;
+                case TEMP : {cmd.status=2;
+                        if( cmd.devnr < 1 || cmd.devnr > 3 ) { cmd.status =3; goto TEMPENDCMD; }
                         if (!strcmp( cmd.cmd, "rtmp")){ 
                                                          float temperature=temp[cmd.con-1][cmd.devnr-1].getTemperature();
                                                         float2_2u16(temperature,cmd.dataout,cmd.datain);cmd.status=0;
@@ -261,7 +275,8 @@
                         if (!strcmp( cmd.cmd, "gtmp")) {do16=temp[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;}
                         if (!strcmp( cmd.cmd, "ini1")) { temp[cmd.con-1][cmd.devnr-1].init1();cmd.dataout=cmd.datain;cmd.status=0;}
                         if (!strcmp( cmd.cmd, "ini2")) { temp[cmd.con-1][cmd.devnr-1].init2();cmd.dataout=cmd.datain;cmd.status=0;}
-                break;
+                        TEMPENDCMD : ;
+                }break;
                 case SSCM: 
                         cmd.status=2;
                         // generate internal CAL 
@@ -298,9 +313,11 @@
         } // end switch 
         encode_cmd ( cmdoutstr, &cmd);  
          pc.printf( "%s", cmdoutstr);
+         cmdready=false;
         }//end  if cmdready 
         else {
              if ( heartbeat) printf( "%03d>%s\n\r",(i++ % 1000),cmdin);
+             wait(0.2);
             }
     }// end while