firmware for the SOLID Slow Control Module for SM1

Dependencies:   S_SCTRL_SMlib adc_ad9249 mbed sscm_comm AD5384 SWSPI T_adt7320

Revision:
4:009703f995c6
Parent:
3:badf265a8898
Child:
5:4177f8012a25
--- a/main.cpp	Sun Oct 05 17:13:02 2014 +0000
+++ b/main.cpp	Tue Oct 14 17:11:31 2014 +0000
@@ -12,15 +12,23 @@
   * v 1.35  added version read for software modules  (comm, T , ADC , DAC  SWSPI) 
   * v 1.36  added ini1 ini2  srst commands for DAC 
   * v 1.37  new get Version class
+  * v 1.40  added init ( dac) for all connectors (2) 
+  * v 1.50  added broadcast for DAC channels ( 1.. 32 )
+  * v 1.51  added set bias (digital) commands
+  * v 1.54  added hardware DAC reset in init , added hw reset call for DAC 
+  * v 1.55  removed decode message , messages on the ADC commands 
+  * v 1.60  added set cal values fire call , error codes corrected 
+  * v 1.61  corrected BIAS channel, introduced DEIMOS32.h 
 */ 
 
-#define VERSION "1.37"
+#define VERSION "1.63"
 
 
 #include "SWSPI_BI.h"
 #include "solid_sctrl_def.h"
 #include "S_SCTRL_SM1_PinDef.h" 
 #include "S_SCTRL_SM1_hwfunct.h" 
+#include "DEIMOS32.h" 
 #include "AD9249.h"
 #include "AD5384.h"
 #include "adt7320.h"
@@ -84,14 +92,19 @@
     // initalize ADC classes 
     AD9249 adc[2][2]={AD9249( &spi_adc,hwl.csb1[0]), AD9249( &spi_adc,hwl.csb2[0]),
                           AD9249( &spi_adc2,hwl.csb1[1]),  AD9249  ( &spi_adc2,hwl.csb2[1])};
-    AD5384 dac[2][1]={AD5384(&spi,hwl.dac_cs[0]), AD5384(&spi2,hwl.dac_cs[1]) };
-      
+    AD5384 dac[2][1]={AD5384(&spi,hwl.dac_cs[0],hwl.dac_rst[0]), AD5384(&spi2,hwl.dac_cs[1],hwl.dac_rst[1]) };
     adt7320 temp[2][3]= { adt7320(&spi, hwl.t_cs[0]),adt7320(&spi, hwl.tc_cs1[0]),adt7320(&spi, hwl.tc_cs2[0]),
                             adt7320(&spi2, hwl.t_cs[1]),adt7320(&spi2, hwl.tc_cs1[1]),adt7320(&spi2, hwl.tc_cs2[1]) };
   
     
     
       pc.printf("\nSOLID SLOW CONTROL for SM1 version %s %s %s  \n\r",VERSION,__DATE__,__TIME__ );
+      
+      for (u8 cc= 1; cc < 3 ; cc++) {
+           dac[cc-1][0].init1();
+           
+      }
+
     cmdready=false;
     while (1) {
         wait(0.5);
@@ -99,19 +112,29 @@
         if (cmdready) {
             cmdready=false;
             int decresult=decode_cmd(cmdin,&cmd);
-            printf("decode result = %d \n\r" ,decresult);
-            if( decresult){ cmd.status=abs(decresult);  encode_cmd ( cmdoutstr, &cmd);   continue; }           
+            //printf("decode result = %d \n\r" ,decresult);
+            if( decresult){                 
+                 decresult=abs(decresult);
+                 u8  errcode=(u8)decresult ;
+                 errcode = 0xE0 + errcode;
+                 cmd.status=errcode;
+                 encode_cmd ( cmdoutstr, &cmd); pc.printf( "%s", cmdoutstr);  
+                 continue; 
+            }
+                 
+                 
             
             
             u8 do8; // dataout
             u16 do16;
+            int chc=0, stch=0 ,endch=0;
             cmd.status=1; // use it for the moment as error handling , 
             switch ( cmd.dev) {
                 
-                case ADC :   
+                case ADC :  { 
                     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);
+                    //pc.printf("ADC cmd = %s \n\r",cmd.cmd);
+                    //pc.printf("check now ranges %d %d  \n\r",cmd.con, cmd.devnr);
                     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; }
@@ -124,18 +147,56 @@
                     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;}
-                break;
-                case DAC :
-                    cmd.status=2;
-                    if (!strcmp( cmd.cmd, "sdac")) { dac[cmd.con-1][cmd.devnr-1].set_dac(cmd.ch,cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;}
-                    if (!strcmp( cmd.cmd, "rdac")) { do16=dac[cmd.con-1][cmd.devnr-1].get_dac(cmd.ch);cmd.dataout=do16;cmd.status=0;}
-                    if (!strcmp( cmd.cmd, "ini1")) { dac[cmd.con-1][cmd.devnr-1].init1();cmd.dataout=cmd.datain;cmd.status=0;}
-                    if (!strcmp( cmd.cmd, "ini2")) { dac[cmd.con-1][cmd.devnr-1].init2();cmd.dataout=cmd.datain;cmd.status=0;}
-                    if (!strcmp( cmd.cmd, "srst")) { dac[cmd.con-1][cmd.devnr-1].soft_rst();cmd.dataout=cmd.datain;cmd.status=0;}
-                    if (!strcmp( cmd.cmd, "ghrv")) {do16=dac[cmd.con-1][cmd.devnr-1].getHdrVersion();cmd.dataout=do16; cmd.status=0;}
-                    if (!strcmp( cmd.cmd, "gscv")) {do16=dac[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;}
+                }break;
+                case DAC :{
+                    cmd.status=2;                    
+                    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;}
+                    if (!strcmp( cmd.cmd, "hrst")) { dac[cmd.con-1][cmd.devnr-1].hw_rst();cmd.dataout=cmd.datain;cmd.status=0;goto DACENDCMD;}
+                    if (!strcmp( cmd.cmd, "gctr")) { do16=dac[cmd.con-1][cmd.devnr-1].get_ctrl();cmd.dataout=do16;cmd.status=0;goto DACENDCMD;}
+                    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;}
+                    // set CAL level values                   
+                    if (!strcmp( cmd.cmd, "scll")) { 
+                        if( cmd.ch !=0) { stch=cmd.ch+DACCAL1CH-1; endch=cmd.ch+DACCAL1CH; } else { stch=DACCAL1CH; endch=DACCAL1CH+4;};
+                        for (chc= stch ; chc < endch; chc++){
+                            cmd.ch=chc;                        
+                            dac[cmd.con-1][cmd.devnr-1].set_dac(cmd.ch-1,cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;
+                        }
+                        goto DACENDCMD;
+                    }
                     
-                break; 
+                    if (!strcmp( cmd.cmd, "gcll")){                     
+                     if( cmd.ch !=0) { stch=cmd.ch+DACCAL1CH-1; endch=cmd.ch+DACCAL1CH; } else { stch=DACCAL1CH; endch=DACCAL1CH+4;};
+                        for (chc= stch ; chc < endch; chc++){
+                            cmd.ch=chc;                        
+                            do16=dac[cmd.con-1][cmd.devnr-1].get_dac(cmd.ch-1);cmd.dataout=do16;cmd.status=0;
+                        }
+                        goto DACENDCMD;
+                    }
+                  
+                    
+                    // channel related commands 
+                    if( cmd.ch !=0) { stch=cmd.ch-1; endch=cmd.ch; } else { stch=0; endch=31;};
+                    if (!strcmp( cmd.cmd, "sdac")) {
+                        for (chc= stch ; chc < endch; chc++){ 
+                            dac[cmd.con-1][cmd.devnr-1].set_dac(chc,cmd.datain);cmd.dataout=cmd.datain;cmd.status=0; 
+                        }
+                        goto DACENDCMD;
+                     }   
+                     // next is not very usefull for multiple channels 
+                     if (!strcmp( cmd.cmd, "rdac")) {
+                        for (chc= stch ; chc < endch; chc++){ 
+                            do16=dac[cmd.con-1][cmd.devnr-1].get_dac(chc);cmd.dataout=do16;cmd.status=0;
+                        }
+                        goto DACENDCMD;
+                     }     
+                     DACENDCMD : ;
+                }break; 
                 case TEMP : cmd.status=2;
                         if (!strcmp( cmd.cmd, "rtpd")){ do16=temp[cmd.con-1][cmd.devnr-1].get_T();cmd.dataout=do16;cmd.status=0;}
                         if (!strcmp( cmd.cmd, "gtid")){ do8=temp[cmd.con-1][cmd.devnr-1].getId();cmd.dataout=do8;cmd.status=0;}
@@ -148,19 +209,34 @@
                 break;
                 case SSCM: 
                         cmd.status=2;
-                        if (!strcmp( cmd.cmd, "t_hb")) { heartbeat=!heartbeat;cmd.status=2;}
+                        // generate internal CAL 
+                        if (!strcmp( cmd.cmd, "acal")){toggle_cal(hwl,cmd.ch );cmd.status=0;}
+                        // heartbeat 
+                        if (!strcmp( cmd.cmd, "t_hb")) { heartbeat=!heartbeat;cmd.status=0;}
+                        //get main version
                         if (!strcmp( cmd.cmd, "gmpv")) {do16=gv.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
-                        
+                        // get module serial nr 
+                        if (!strcmp( cmd.cmd, "msnr")) {do8=get_serialnr(&hwl);cmd.dataout=(u16)do8; cmd.status=0;}
+                        // get version module version
                         if (!strcmp( cmd.cmd, "gvhv")) {do16=gvc.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
-                        if (!strcmp( cmd.cmd, "msnr")) {do8=get_serialnr(&hwl);cmd.dataout=(u16)do8; cmd.status=0;}
+                        if (!strcmp( cmd.cmd, "gvsv")) {do16=gvc.getSrcVersion();cmd.dataout=do16; cmd.status=0;}
+                        // get communication  module version
                         if (!strcmp( cmd.cmd, "gchv")) {do16=gvsscm.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
                         if (!strcmp( cmd.cmd, "gcsv")) {do16=gvsscm.getSrcVersion();cmd.dataout=do16; cmd.status=0;}
+                        // get spi  module version
+                        if (!strcmp( cmd.cmd, "gshv")) {do16=spi.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
+                        if (!strcmp( cmd.cmd, "gssv")) {do16=spi.getSrcVersion();cmd.dataout=do16; cmd.status=0;} 
+                        // get bispi  module version
+                        if (!strcmp( cmd.cmd, "gbhv")) {do16=spi_adc.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
+                        if (!strcmp( cmd.cmd, "gbsv")) {do16=spi_adc.getSrcVersion();cmd.dataout=do16; cmd.status=0;} 
+                      
+                      
                       
                 break;
              default : cmd.status=1;
              break;
         } // end switch 
-         encode_cmd ( cmdoutstr, &cmd);  
+        encode_cmd ( cmdoutstr, &cmd);  
          pc.printf( "%s", cmdoutstr);
         }//end  if cmdready 
         else {