firmware for the SOLID Slow Control Module for SM1

Dependencies:   S_SCTRL_SMlib adc_ad9249 mbed sscm_comm AD5384 SWSPI T_adt7320

Committer:
wbeaumont
Date:
Fri Oct 23 11:23:14 2015 +0000
Revision:
13:ac7235a87242
Parent:
12:54b96bf7b291
production version archiving

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wbeaumont 0:dcd70d1b89b1 1 #include "mbed.h"
wbeaumont 1:f792767b2223 2 /* SOLID SM1 Slow Control firmware
wbeaumont 1:f792767b2223 3 *
wbeaumont 1:f792767b2223 4
wbeaumont 1:f792767b2223 5 * V 1.0? initial version release
wbeaumont 1:f792767b2223 6 * v 1.11 version , added status field
wbeaumont 1:f792767b2223 7 * v 1.13 corrected error in ADC register write
wbeaumont 2:d18b1a1643e8 8 * v 1.14 added heartbeat off / in
wbeaumont 3:badf265a8898 9 * v 1.20 added DAC
wbeaumont 3:badf265a8898 10 * v 1.30 added Temperature probe support
wbeaumont 3:badf265a8898 11 * v 1.31 bug correction ,for selecting the probe the devnr has to be used
wbeaumont 3:badf265a8898 12 * v 1.35 added version read for software modules (comm, T , ADC , DAC SWSPI)
wbeaumont 3:badf265a8898 13 * v 1.36 added ini1 ini2 srst commands for DAC
wbeaumont 3:badf265a8898 14 * v 1.37 new get Version class
wbeaumont 4:009703f995c6 15 * v 1.40 added init ( dac) for all connectors (2)
wbeaumont 4:009703f995c6 16 * v 1.50 added broadcast for DAC channels ( 1.. 32 )
wbeaumont 4:009703f995c6 17 * v 1.51 added set bias (digital) commands
wbeaumont 4:009703f995c6 18 * v 1.54 added hardware DAC reset in init , added hw reset call for DAC
wbeaumont 4:009703f995c6 19 * v 1.55 removed decode message , messages on the ADC commands
wbeaumont 4:009703f995c6 20 * v 1.60 added set cal values fire call , error codes corrected
wbeaumont 4:009703f995c6 21 * v 1.61 corrected BIAS channel, introduced DEIMOS32.h
wbeaumont 5:4177f8012a25 22 * v 1.65 added heartbeat on / off, added set cal level
wbeaumont 5:4177f8012a25 23 * v 1.66 implemented real temperature readout
wbeaumont 5:4177f8012a25 24 * v 1.70 implemented set_volt and get_volt commands
wbeaumont 8:03f20aed4214 25 * v 1.72 implemented setbias , get bias volt dummy
wbeaumont 10:efd3f490648c 26 * v 1.73 implemented setbias , get bias volt via Deimos32 class
wbeaumont 10:efd3f490648c 27 * v 1.74 added check for empty deimos pointer
wbeaumont 10:efd3f490648c 28 * v 1.75 added check for devnr < 1
wbeaumont 10:efd3f490648c 29 * v 1.76 added check for devnr per device type , added connector range ( only 1 or 2 are accepted)
wbeaumont 10:efd3f490648c 30 * v 1.78 canged the place of cmd read to the end of the mail loop was at the start
wbeaumont 10:efd3f490648c 31 * v 1.79 added hv stet /get string to replace bi(ias) old commands are still working
wbeaumont 10:efd3f490648c 32 * wait only if cmd is not ready
wbeaumont 11:b1e6d7c18790 33 * v 1.86 corrected dac assignment in DEIMOS32 class , correced gain factor in dac AD5384 class
wbeaumont 12:54b96bf7b291 34 * V 1.90 sthv returns
wbeaumont 13:ac7235a87242 35 * (C) Wim Beaumont Univeristeit Antwerpen 2014 , 2015
wbeaumont 13:ac7235a87242 36 *
wbeaumont 1:f792767b2223 37 */
wbeaumont 0:dcd70d1b89b1 38
wbeaumont 12:54b96bf7b291 39 #define VERSION "1.90"
wbeaumont 0:dcd70d1b89b1 40
wbeaumont 2:d18b1a1643e8 41
wbeaumont 3:badf265a8898 42 #include "SWSPI_BI.h"
wbeaumont 0:dcd70d1b89b1 43 #include "solid_sctrl_def.h"
wbeaumont 0:dcd70d1b89b1 44 #include "S_SCTRL_SM1_PinDef.h"
wbeaumont 0:dcd70d1b89b1 45 #include "S_SCTRL_SM1_hwfunct.h"
wbeaumont 4:009703f995c6 46 #include "DEIMOS32.h"
wbeaumont 2:d18b1a1643e8 47 #include "AD9249.h"
wbeaumont 2:d18b1a1643e8 48 #include "AD5384.h"
wbeaumont 3:badf265a8898 49 #include "adt7320.h"
wbeaumont 3:badf265a8898 50 #include "getVersion.h"
wbeaumont 0:dcd70d1b89b1 51
wbeaumont 0:dcd70d1b89b1 52 #define DEBUGPF(x) printf((x));
wbeaumont 0:dcd70d1b89b1 53
wbeaumont 0:dcd70d1b89b1 54
wbeaumont 0:dcd70d1b89b1 55 #define MAXCMDLLENGTH 256
wbeaumont 0:dcd70d1b89b1 56
wbeaumont 0:dcd70d1b89b1 57 #include "sscm_comm.h"
wbeaumont 0:dcd70d1b89b1 58 using namespace sscm_comm ;
wbeaumont 0:dcd70d1b89b1 59
wbeaumont 0:dcd70d1b89b1 60
wbeaumont 0:dcd70d1b89b1 61
wbeaumont 0:dcd70d1b89b1 62 Serial pc(USBTX,USBRX);
wbeaumont 0:dcd70d1b89b1 63
wbeaumont 0:dcd70d1b89b1 64
wbeaumont 0:dcd70d1b89b1 65 char cmdin[MAXCMDLLENGTH];
wbeaumont 0:dcd70d1b89b1 66 u8 cmdready;
wbeaumont 0:dcd70d1b89b1 67 bool cmdstart=false;
wbeaumont 0:dcd70d1b89b1 68
wbeaumont 0:dcd70d1b89b1 69
wbeaumont 0:dcd70d1b89b1 70 void pc_callback() {
wbeaumont 0:dcd70d1b89b1 71 // Note: you need to actually read from the serial to clear the RX interrupt
wbeaumont 0:dcd70d1b89b1 72 static unsigned char cnt;
wbeaumont 0:dcd70d1b89b1 73
wbeaumont 0:dcd70d1b89b1 74 char c;
wbeaumont 0:dcd70d1b89b1 75 c=pc.getc();
wbeaumont 0:dcd70d1b89b1 76 if( c== CMDSTART && !cmdready ) { cnt=0; cmdstart=true; cmdready=false; }
wbeaumont 0:dcd70d1b89b1 77 if ( cmdstart) {
wbeaumont 0:dcd70d1b89b1 78 cmdin[cnt]=c; cnt++;
wbeaumont 0:dcd70d1b89b1 79 if (c== CMDSTOP ) { cmdready=true;}
wbeaumont 0:dcd70d1b89b1 80 }
wbeaumont 0:dcd70d1b89b1 81
wbeaumont 0:dcd70d1b89b1 82
wbeaumont 0:dcd70d1b89b1 83
wbeaumont 0:dcd70d1b89b1 84 //printf("%c:",c );
wbeaumont 0:dcd70d1b89b1 85 }
wbeaumont 0:dcd70d1b89b1 86
wbeaumont 0:dcd70d1b89b1 87
wbeaumont 0:dcd70d1b89b1 88
wbeaumont 0:dcd70d1b89b1 89
wbeaumont 0:dcd70d1b89b1 90 int main() {
wbeaumont 0:dcd70d1b89b1 91 pc.attach(pc_callback);
wbeaumont 0:dcd70d1b89b1 92 ssc_cmd cmd;
wbeaumont 12:54b96bf7b291 93 bool heartbeat=false;
wbeaumont 0:dcd70d1b89b1 94 int i = 0;
wbeaumont 0:dcd70d1b89b1 95 HWlines hwl ;
wbeaumont 0:dcd70d1b89b1 96 assignports( &hwl );
wbeaumont 0:dcd70d1b89b1 97 setdefault(hwl );
wbeaumont 3:badf265a8898 98 // reuse getVesion
wbeaumont 3:badf265a8898 99 getVersion gv( VERSION, VERSION , __TIME__, __DATE__ );
wbeaumont 3:badf265a8898 100 getVersion gvc;
wbeaumont 3:badf265a8898 101 getsscmVersion gvsscm;
wbeaumont 2:d18b1a1643e8 102 SWSPI spi(hwl.mosi[0],hwl.miso[0],hwl.sclk[0]); // mosi, miso, sclk
wbeaumont 2:d18b1a1643e8 103 SWSPI spi2(hwl.mosi[1],hwl.miso[1],hwl.sclk[1]); // mosi, miso, sclk
wbeaumont 0:dcd70d1b89b1 104
wbeaumont 0:dcd70d1b89b1 105 SWSPI_BI spi_adc(hwl.msio[0],hwl.direction[0],hwl.stio_mo[0] ,hwl.sclk[0]); // msio, dir , sclk
wbeaumont 0:dcd70d1b89b1 106 SWSPI_BI spi_adc2(hwl.msio[1],hwl.direction[1],hwl.stio_mo[1],hwl.sclk[1]); // msio, dir , sclk
wbeaumont 0:dcd70d1b89b1 107 // initalize ADC classes
wbeaumont 0:dcd70d1b89b1 108 AD9249 adc[2][2]={AD9249( &spi_adc,hwl.csb1[0]), AD9249( &spi_adc,hwl.csb2[0]),
wbeaumont 0:dcd70d1b89b1 109 AD9249( &spi_adc2,hwl.csb1[1]), AD9249 ( &spi_adc2,hwl.csb2[1])};
wbeaumont 4:009703f995c6 110 AD5384 dac[2][1]={AD5384(&spi,hwl.dac_cs[0],hwl.dac_rst[0]), AD5384(&spi2,hwl.dac_cs[1],hwl.dac_rst[1]) };
wbeaumont 3:badf265a8898 111 adt7320 temp[2][3]= { adt7320(&spi, hwl.t_cs[0]),adt7320(&spi, hwl.tc_cs1[0]),adt7320(&spi, hwl.tc_cs2[0]),
wbeaumont 3:badf265a8898 112 adt7320(&spi2, hwl.t_cs[1]),adt7320(&spi2, hwl.tc_cs1[1]),adt7320(&spi2, hwl.tc_cs2[1]) };
wbeaumont 0:dcd70d1b89b1 113
wbeaumont 8:03f20aed4214 114 Deimos32* deimos[2] = { 0,0};
wbeaumont 0:dcd70d1b89b1 115
wbeaumont 0:dcd70d1b89b1 116 pc.printf("\nSOLID SLOW CONTROL for SM1 version %s %s %s \n\r",VERSION,__DATE__,__TIME__ );
wbeaumont 4:009703f995c6 117
wbeaumont 4:009703f995c6 118 for (u8 cc= 1; cc < 3 ; cc++) {
wbeaumont 4:009703f995c6 119 dac[cc-1][0].init1();
wbeaumont 4:009703f995c6 120
wbeaumont 4:009703f995c6 121 }
wbeaumont 4:009703f995c6 122
wbeaumont 0:dcd70d1b89b1 123 cmdready=false;
wbeaumont 0:dcd70d1b89b1 124 while (1) {
wbeaumont 3:badf265a8898 125 char cmdoutstr[100];
wbeaumont 0:dcd70d1b89b1 126 if (cmdready) {
wbeaumont 10:efd3f490648c 127 //cmdready=false;
wbeaumont 0:dcd70d1b89b1 128 int decresult=decode_cmd(cmdin,&cmd);
wbeaumont 4:009703f995c6 129 //printf("decode result = %d \n\r" ,decresult);
wbeaumont 10:efd3f490648c 130 decresult=abs(decresult);
wbeaumont 10:efd3f490648c 131 if( cmd.con <1 || cmd.con > 2 ) { decresult= 0x04 +decresult; }
wbeaumont 10:efd3f490648c 132 if( decresult){
wbeaumont 4:009703f995c6 133 u8 errcode=(u8)decresult ;
wbeaumont 4:009703f995c6 134 errcode = 0xE0 + errcode;
wbeaumont 4:009703f995c6 135 cmd.status=errcode;
wbeaumont 10:efd3f490648c 136 encode_cmd ( cmdoutstr, &cmd); pc.printf( "%s", cmdoutstr);
wbeaumont 10:efd3f490648c 137 cmdready=false;
wbeaumont 4:009703f995c6 138 continue;
wbeaumont 4:009703f995c6 139 }
wbeaumont 4:009703f995c6 140
wbeaumont 4:009703f995c6 141
wbeaumont 3:badf265a8898 142
wbeaumont 0:dcd70d1b89b1 143
wbeaumont 0:dcd70d1b89b1 144 u8 do8; // dataout
wbeaumont 0:dcd70d1b89b1 145 u16 do16;
wbeaumont 4:009703f995c6 146 int chc=0, stch=0 ,endch=0;
wbeaumont 1:f792767b2223 147 cmd.status=1; // use it for the moment as error handling ,
wbeaumont 1:f792767b2223 148 switch ( cmd.dev) {
wbeaumont 2:d18b1a1643e8 149
wbeaumont 4:009703f995c6 150 case ADC : {
wbeaumont 1:f792767b2223 151 cmd.status=2;
wbeaumont 4:009703f995c6 152 //pc.printf("ADC cmd = %s \n\r",cmd.cmd);
wbeaumont 4:009703f995c6 153 //pc.printf("check now ranges %d %d \n\r",cmd.con, cmd.devnr);
wbeaumont 10:efd3f490648c 154 if( cmd.devnr < 1 || cmd.devnr > 2 ) { cmd.status =3; }
wbeaumont 10:efd3f490648c 155 else {
wbeaumont 1:f792767b2223 156 if (!strcmp( cmd.cmd, "spa1")) { adc[cmd.con-1][cmd.devnr-1].setPattern1(cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;}
wbeaumont 1:f792767b2223 157 if (!strcmp( cmd.cmd, "spa2")) { adc[cmd.con-1][cmd.devnr-1].setPattern2(cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;}
wbeaumont 2:d18b1a1643e8 158 if (!strcmp( cmd.cmd, "rpa1")) { adc[cmd.con-1][cmd.devnr-1].readPattern1(do16 ); cmd.dataout=do16; cmd.status=0; }
wbeaumont 2:d18b1a1643e8 159 if (!strcmp( cmd.cmd, "rpa2")) { adc[cmd.con-1][cmd.devnr-1].readPattern2(do16 ); cmd.dataout=do16; cmd.status=0; }
wbeaumont 2:d18b1a1643e8 160 if (!strcmp( cmd.cmd, "rr08")) {adc[cmd.con-1][cmd.devnr-1].readReg8(cmd.ch,do8 ); cmd.dataout=(u16)do8; cmd.status=0; }
wbeaumont 1:f792767b2223 161 if (!strcmp( cmd.cmd, "rr16")) {adc[cmd.con-1][cmd.devnr-1].readReg16(cmd.ch,do16 ); cmd.dataout=(u32)do16;cmd.status=0; }
wbeaumont 1:f792767b2223 162 if (!strcmp( cmd.cmd, "sr08")) { adc[cmd.con-1][cmd.devnr-1].setReg8(cmd.ch, (u8)cmd.datain ); cmd.dataout=cmd.datain; cmd.status=0; }
wbeaumont 1:f792767b2223 163 if (!strcmp( cmd.cmd, "sr16")) { adc[cmd.con-1][cmd.devnr-1].setReg16(cmd.ch, (u16)cmd.datain ); cmd.dataout=cmd.datain; cmd.status=0; }
wbeaumont 3:badf265a8898 164 if (!strcmp( cmd.cmd, "ghrv")) {do16=adc[cmd.con-1][cmd.devnr-1].getHdrVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 3:badf265a8898 165 if (!strcmp( cmd.cmd, "gscv")) {do16=adc[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 3:badf265a8898 166 if (!strcmp( cmd.cmd, "ini1")) { adc[cmd.con-1][cmd.devnr-1].init1();cmd.dataout=cmd.datain;cmd.status=0;}
wbeaumont 3:badf265a8898 167 if (!strcmp( cmd.cmd, "ini2")) { adc[cmd.con-1][cmd.devnr-1].init2();cmd.dataout=cmd.datain;cmd.status=0;}
wbeaumont 10:efd3f490648c 168 } // end check dev nr.
wbeaumont 4:009703f995c6 169 }break;
wbeaumont 4:009703f995c6 170 case DAC :{
wbeaumont 10:efd3f490648c 171 cmd.status=2;
wbeaumont 10:efd3f490648c 172 if( cmd.devnr != 1 ) { cmd.status =3;goto DACENDCMD; }
wbeaumont 4:009703f995c6 173 if (!strcmp( cmd.cmd, "ini1")) { dac[cmd.con-1][cmd.devnr-1].init1();cmd.dataout=cmd.datain;cmd.status=0; goto DACENDCMD;}
wbeaumont 4:009703f995c6 174 if (!strcmp( cmd.cmd, "ini2")) { dac[cmd.con-1][cmd.devnr-1].init2();cmd.dataout=cmd.datain;cmd.status=0; goto DACENDCMD;}
wbeaumont 4:009703f995c6 175 if (!strcmp( cmd.cmd, "srst")) { dac[cmd.con-1][cmd.devnr-1].soft_rst();cmd.dataout=cmd.datain;cmd.status=0;goto DACENDCMD;}
wbeaumont 4:009703f995c6 176 if (!strcmp( cmd.cmd, "hrst")) { dac[cmd.con-1][cmd.devnr-1].hw_rst();cmd.dataout=cmd.datain;cmd.status=0;goto DACENDCMD;}
wbeaumont 4:009703f995c6 177 if (!strcmp( cmd.cmd, "gctr")) { do16=dac[cmd.con-1][cmd.devnr-1].get_ctrl();cmd.dataout=do16;cmd.status=0;goto DACENDCMD;}
wbeaumont 4:009703f995c6 178 if (!strcmp( cmd.cmd, "ghrv")) { do16=dac[cmd.con-1][cmd.devnr-1].getHdrVersion();cmd.dataout=do16; cmd.status=0;goto DACENDCMD;}
wbeaumont 4:009703f995c6 179 if (!strcmp( cmd.cmd, "gscv")) { do16=dac[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;goto DACENDCMD;}
wbeaumont 4:009703f995c6 180 // set output register bias channel
wbeaumont 10:efd3f490648c 181 if ((!strcmp( cmd.cmd, "sbid")) || (!strcmp( cmd.cmd, "shvd")) )
wbeaumont 10:efd3f490648c 182 { 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;}
wbeaumont 10:efd3f490648c 183 if ((!strcmp( cmd.cmd, "gbid")) || (!strcmp( cmd.cmd, "ghvd")) )
wbeaumont 10:efd3f490648c 184 {cmd.ch=DACBIASCH;do16=dac[cmd.con-1][cmd.devnr-1].get_dac(cmd.ch-1);cmd.dataout=do16;cmd.status=0;goto DACENDCMD;}
wbeaumont 8:03f20aed4214 185 if (!strcmp( cmd.cmd, "inhv")) {
wbeaumont 8:03f20aed4214 186 if(cmd.con== 0) {cmd.status=100;goto DACENDCMD;} // can not be broadcast ;}
wbeaumont 8:03f20aed4214 187 if(cmd.con > 2) {cmd.status=101;goto DACENDCMD;}
wbeaumont 10:efd3f490648c 188 if( deimos[cmd.con-1] ) {cmd.status=102;goto DACENDCMD;} // if already init don't init again.
wbeaumont 8:03f20aed4214 189 float hvnom=u162float( cmd.dataout , cmd.datain);
wbeaumont 11:b1e6d7c18790 190 deimos[cmd.con-1]= new Deimos32(hvnom ,cmd.con,&dac[cmd.con-1][cmd.devnr-1]);
wbeaumont 8:03f20aed4214 191 cmd.status=0;goto DACENDCMD;
wbeaumont 8:03f20aed4214 192 }
wbeaumont 10:efd3f490648c 193 if ((!strcmp( cmd.cmd, "sbia")) || (!strcmp( cmd.cmd, "sthv")) ) {
wbeaumont 8:03f20aed4214 194 float biasvolt= u162float( cmd.dataout , cmd.datain);
wbeaumont 8:03f20aed4214 195 u8 strtcnt=0; u8 stpcnt=2;
wbeaumont 8:03f20aed4214 196 if (cmd.con ==1) stpcnt=1;
wbeaumont 8:03f20aed4214 197 if (cmd.con ==2) strtcnt=1; // else it is assumed to be 9
wbeaumont 8:03f20aed4214 198 float retvalue=0;
wbeaumont 9:20fc5a795ec4 199 for ( u8 bcnt=strtcnt ; bcnt < stpcnt; bcnt++) {
wbeaumont 12:54b96bf7b291 200 u16 dacvalue=0;
wbeaumont 11:b1e6d7c18790 201 if ( ! deimos[bcnt]) retvalue=200;
wbeaumont 11:b1e6d7c18790 202 else {
wbeaumont 11:b1e6d7c18790 203 retvalue+=-deimos[bcnt]->setHV(biasvolt,dacvalue);
wbeaumont 11:b1e6d7c18790 204 cmd.datain=0; cmd.dataout=dacvalue;
wbeaumont 11:b1e6d7c18790 205 }
wbeaumont 9:20fc5a795ec4 206 }
wbeaumont 8:03f20aed4214 207 cmd.status=u8(retvalue);goto DACENDCMD;
wbeaumont 7:5f8abd383a7d 208 }
wbeaumont 11:b1e6d7c18790 209 if ((!strcmp( cmd.cmd, "gbia")) || (!strcmp( cmd.cmd, "gthv")) || (!strcmp( cmd.cmd, "gthn")) ) {
wbeaumont 8:03f20aed4214 210 if ( cmd.con ==0 ) cmd.con=1;
wbeaumont 9:20fc5a795ec4 211 if (deimos[cmd.con-1]) {
wbeaumont 11:b1e6d7c18790 212 float volt;
wbeaumont 11:b1e6d7c18790 213 if (!strcmp( cmd.cmd, "gthn")) volt=deimos[cmd.con-1]->getHvNom();
wbeaumont 11:b1e6d7c18790 214 else volt=deimos[cmd.con-1]->getHv();
wbeaumont 9:20fc5a795ec4 215 float2_2u16( volt , cmd.dataout , cmd.datain);
wbeaumont 9:20fc5a795ec4 216 cmd.status=0;
wbeaumont 9:20fc5a795ec4 217 }
wbeaumont 9:20fc5a795ec4 218 else cmd.status=200;
wbeaumont 9:20fc5a795ec4 219 goto DACENDCMD;
wbeaumont 7:5f8abd383a7d 220 }
wbeaumont 4:009703f995c6 221 // set CAL level values
wbeaumont 4:009703f995c6 222 if (!strcmp( cmd.cmd, "scll")) {
wbeaumont 4:009703f995c6 223 if( cmd.ch !=0) { stch=cmd.ch+DACCAL1CH-1; endch=cmd.ch+DACCAL1CH; } else { stch=DACCAL1CH; endch=DACCAL1CH+4;};
wbeaumont 4:009703f995c6 224 for (chc= stch ; chc < endch; chc++){
wbeaumont 4:009703f995c6 225 cmd.ch=chc;
wbeaumont 4:009703f995c6 226 dac[cmd.con-1][cmd.devnr-1].set_dac(cmd.ch-1,cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;
wbeaumont 4:009703f995c6 227 }
wbeaumont 4:009703f995c6 228 goto DACENDCMD;
wbeaumont 4:009703f995c6 229 }
wbeaumont 3:badf265a8898 230
wbeaumont 4:009703f995c6 231 if (!strcmp( cmd.cmd, "gcll")){
wbeaumont 4:009703f995c6 232 if( cmd.ch !=0) { stch=cmd.ch+DACCAL1CH-1; endch=cmd.ch+DACCAL1CH; } else { stch=DACCAL1CH; endch=DACCAL1CH+4;};
wbeaumont 4:009703f995c6 233 for (chc= stch ; chc < endch; chc++){
wbeaumont 4:009703f995c6 234 cmd.ch=chc;
wbeaumont 4:009703f995c6 235 do16=dac[cmd.con-1][cmd.devnr-1].get_dac(cmd.ch-1);cmd.dataout=do16;cmd.status=0;
wbeaumont 4:009703f995c6 236 }
wbeaumont 4:009703f995c6 237 goto DACENDCMD;
wbeaumont 4:009703f995c6 238 }
wbeaumont 4:009703f995c6 239
wbeaumont 4:009703f995c6 240
wbeaumont 4:009703f995c6 241 // channel related commands
wbeaumont 4:009703f995c6 242 if( cmd.ch !=0) { stch=cmd.ch-1; endch=cmd.ch; } else { stch=0; endch=31;};
wbeaumont 4:009703f995c6 243 if (!strcmp( cmd.cmd, "sdac")) {
wbeaumont 4:009703f995c6 244 for (chc= stch ; chc < endch; chc++){
wbeaumont 4:009703f995c6 245 dac[cmd.con-1][cmd.devnr-1].set_dac(chc,cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;
wbeaumont 4:009703f995c6 246 }
wbeaumont 4:009703f995c6 247 goto DACENDCMD;
wbeaumont 5:4177f8012a25 248 }
wbeaumont 5:4177f8012a25 249 if (!strcmp( cmd.cmd, "svlt")) {
wbeaumont 5:4177f8012a25 250 for (chc= stch ; chc < endch; chc++){
wbeaumont 5:4177f8012a25 251 float volt= u162float( cmd.dataout , cmd.datain);
wbeaumont 5:4177f8012a25 252 dac[cmd.con-1][cmd.devnr-1].set_volt(chc,volt);cmd.status=0;
wbeaumont 5:4177f8012a25 253 }
wbeaumont 5:4177f8012a25 254 goto DACENDCMD;
wbeaumont 5:4177f8012a25 255 }
wbeaumont 4:009703f995c6 256 // next is not very usefull for multiple channels
wbeaumont 4:009703f995c6 257 if (!strcmp( cmd.cmd, "rdac")) {
wbeaumont 4:009703f995c6 258 for (chc= stch ; chc < endch; chc++){
wbeaumont 4:009703f995c6 259 do16=dac[cmd.con-1][cmd.devnr-1].get_dac(chc);cmd.dataout=do16;cmd.status=0;
wbeaumont 4:009703f995c6 260 }
wbeaumont 4:009703f995c6 261 goto DACENDCMD;
wbeaumont 5:4177f8012a25 262 }
wbeaumont 5:4177f8012a25 263 if (!strcmp( cmd.cmd, "gvlt")) {
wbeaumont 5:4177f8012a25 264 for (chc= stch ; chc < endch; chc++){
wbeaumont 5:4177f8012a25 265 float volt=dac[cmd.con-1][cmd.devnr-1].get_volt(chc);
wbeaumont 5:4177f8012a25 266 float2_2u16( volt , cmd.dataout , cmd.datain);
wbeaumont 5:4177f8012a25 267 cmd.status=0;
wbeaumont 5:4177f8012a25 268 }
wbeaumont 5:4177f8012a25 269 goto DACENDCMD;
wbeaumont 5:4177f8012a25 270 }
wbeaumont 4:009703f995c6 271 DACENDCMD : ;
wbeaumont 4:009703f995c6 272 }break;
wbeaumont 10:efd3f490648c 273 case TEMP : {cmd.status=2;
wbeaumont 10:efd3f490648c 274 if( cmd.devnr < 1 || cmd.devnr > 3 ) { cmd.status =3; goto TEMPENDCMD; }
wbeaumont 5:4177f8012a25 275 if (!strcmp( cmd.cmd, "rtmp")){
wbeaumont 5:4177f8012a25 276 float temperature=temp[cmd.con-1][cmd.devnr-1].getTemperature();
wbeaumont 5:4177f8012a25 277 float2_2u16(temperature,cmd.dataout,cmd.datain);cmd.status=0;
wbeaumont 5:4177f8012a25 278 }
wbeaumont 3:badf265a8898 279 if (!strcmp( cmd.cmd, "rtpd")){ do16=temp[cmd.con-1][cmd.devnr-1].get_T();cmd.dataout=do16;cmd.status=0;}
wbeaumont 3:badf265a8898 280 if (!strcmp( cmd.cmd, "gtid")){ do8=temp[cmd.con-1][cmd.devnr-1].getId();cmd.dataout=do8;cmd.status=0;}
wbeaumont 3:badf265a8898 281 if (!strcmp( cmd.cmd, "rtcr")){ do16=temp[cmd.con-1][cmd.devnr-1].get_TcritSP();cmd.dataout=do16;cmd.status=0;}
wbeaumont 3:badf265a8898 282 if (!strcmp( cmd.cmd, "stcr")){ temp[cmd.con-1][cmd.devnr-1].set_TcritSP(cmd.datain);cmd.dataout=cmd.datain;cmd.status=0;}
wbeaumont 3:badf265a8898 283 if (!strcmp( cmd.cmd, "ghrv")) {do16=temp[cmd.con-1][cmd.devnr-1].getHdrVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 3:badf265a8898 284 if (!strcmp( cmd.cmd, "gscv")) {do16=temp[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 5:4177f8012a25 285 if (!strcmp( cmd.cmd, "gtmp")) {do16=temp[cmd.con-1][cmd.devnr-1].getSrcVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 3:badf265a8898 286 if (!strcmp( cmd.cmd, "ini1")) { temp[cmd.con-1][cmd.devnr-1].init1();cmd.dataout=cmd.datain;cmd.status=0;}
wbeaumont 3:badf265a8898 287 if (!strcmp( cmd.cmd, "ini2")) { temp[cmd.con-1][cmd.devnr-1].init2();cmd.dataout=cmd.datain;cmd.status=0;}
wbeaumont 10:efd3f490648c 288 TEMPENDCMD : ;
wbeaumont 10:efd3f490648c 289 }break;
wbeaumont 3:badf265a8898 290 case SSCM:
wbeaumont 3:badf265a8898 291 cmd.status=2;
wbeaumont 4:009703f995c6 292 // generate internal CAL
wbeaumont 4:009703f995c6 293 if (!strcmp( cmd.cmd, "acal")){toggle_cal(hwl,cmd.ch );cmd.status=0;}
wbeaumont 5:4177f8012a25 294 // set calline lvl
wbeaumont 5:4177f8012a25 295 if (!strcmp( cmd.cmd, "scll")){set_cal_line(hwl,cmd.ch, cmd.datain );cmd.status=0;}
wbeaumont 4:009703f995c6 296 // heartbeat
wbeaumont 5:4177f8012a25 297 if (!strcmp( cmd.cmd, "t_hb")) { if ( cmd.datain ==0 ) heartbeat=false;
wbeaumont 5:4177f8012a25 298 if ( cmd.datain ==1 ) heartbeat=true;
wbeaumont 5:4177f8012a25 299 if ( cmd.datain ==2) heartbeat=!heartbeat;cmd.status=0;
wbeaumont 5:4177f8012a25 300 }
wbeaumont 4:009703f995c6 301 //get main version
wbeaumont 3:badf265a8898 302 if (!strcmp( cmd.cmd, "gmpv")) {do16=gv.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 303 // get module serial nr
wbeaumont 4:009703f995c6 304 if (!strcmp( cmd.cmd, "msnr")) {do8=get_serialnr(&hwl);cmd.dataout=(u16)do8; cmd.status=0;}
wbeaumont 4:009703f995c6 305 // get version module version
wbeaumont 3:badf265a8898 306 if (!strcmp( cmd.cmd, "gvhv")) {do16=gvc.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 307 if (!strcmp( cmd.cmd, "gvsv")) {do16=gvc.getSrcVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 308 // get communication module version
wbeaumont 3:badf265a8898 309 if (!strcmp( cmd.cmd, "gchv")) {do16=gvsscm.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 3:badf265a8898 310 if (!strcmp( cmd.cmd, "gcsv")) {do16=gvsscm.getSrcVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 311 // get spi module version
wbeaumont 4:009703f995c6 312 if (!strcmp( cmd.cmd, "gshv")) {do16=spi.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 313 if (!strcmp( cmd.cmd, "gssv")) {do16=spi.getSrcVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 314 // get bispi module version
wbeaumont 4:009703f995c6 315 if (!strcmp( cmd.cmd, "gbhv")) {do16=spi_adc.getHdrVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 316 if (!strcmp( cmd.cmd, "gbsv")) {do16=spi_adc.getSrcVersion();cmd.dataout=do16; cmd.status=0;}
wbeaumont 4:009703f995c6 317
wbeaumont 4:009703f995c6 318
wbeaumont 3:badf265a8898 319
wbeaumont 1:f792767b2223 320 break;
wbeaumont 1:f792767b2223 321 default : cmd.status=1;
wbeaumont 1:f792767b2223 322 break;
wbeaumont 1:f792767b2223 323 } // end switch
wbeaumont 4:009703f995c6 324 encode_cmd ( cmdoutstr, &cmd);
wbeaumont 0:dcd70d1b89b1 325 pc.printf( "%s", cmdoutstr);
wbeaumont 10:efd3f490648c 326 cmdready=false;
wbeaumont 0:dcd70d1b89b1 327 }//end if cmdready
wbeaumont 0:dcd70d1b89b1 328 else {
wbeaumont 1:f792767b2223 329 if ( heartbeat) printf( "%03d>%s\n\r",(i++ % 1000),cmdin);
wbeaumont 10:efd3f490648c 330 wait(0.2);
wbeaumont 0:dcd70d1b89b1 331 }
wbeaumont 0:dcd70d1b89b1 332 }// end while
wbeaumont 0:dcd70d1b89b1 333
wbeaumont 0:dcd70d1b89b1 334 }