Solid experiment slow control.

Dependencies:   AD5384 SWSPI S_SCTRL_SMlib T_adt7320 adc_ad9249 mbed sscm_comm

Fork of sscm by wimbeaumont Project

main.cpp

Committer:
wbeaumont
Date:
2014-09-30
Revision:
1:f792767b2223
Parent:
0:dcd70d1b89b1
Child:
2:d18b1a1643e8

File content as of revision 1:f792767b2223:

#include "mbed.h"
/* SOLID SM1 Slow Control firmware 
 *
 
  * V 1.0?  initial version   release 
  * v 1.11  version , added status field 
  * v 1.13  corrected error in ADC register write
  * v 1.14  added heartbeat off / in  
*/ 

#include "SWSPI_BI.h"

#include "AD9249.h"
#include "solid_sctrl_def.h"
#include "S_SCTRL_SM1_PinDef.h" 
#include "S_SCTRL_SM1_hwfunct.h" 

#define VERSION "1.13"

#define DEBUGPF(x) printf((x));


#define MAXCMDLLENGTH 256

#include "sscm_comm.h"
using namespace sscm_comm ;



Serial pc(USBTX,USBRX);


char cmdin[MAXCMDLLENGTH];
u8 cmdready;
bool cmdstart=false;




void pc_callback() {
    // Note: you need to actually read from the serial to clear the RX interrupt  
    static unsigned char cnt;
    
    char c;
        c=pc.getc();
     if( c== CMDSTART && !cmdready ) { cnt=0; cmdstart=true; cmdready=false; }
     if ( cmdstart) { 
        cmdin[cnt]=c; cnt++;             
        if (c== CMDSTOP ) { cmdready=true;} 
     }   
        
    
        
    //printf("%c:",c );    
 }




int main() {
    pc.attach(pc_callback);
    ssc_cmd cmd;
    bool heartbeat=true;
    int i = 0;
     HWlines  hwl ;
    assignports( &hwl );
    setdefault(hwl );
    
  
    SWSPI_BI spi_adc(hwl.msio[0],hwl.direction[0],hwl.stio_mo[0] ,hwl.sclk[0]); // msio, dir , sclk 
    SWSPI_BI spi_adc2(hwl.msio[1],hwl.direction[1],hwl.stio_mo[1],hwl.sclk[1]); // msio, dir , sclk 
    // 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])};
     
  
      
    
  
    
    
      pc.printf("\nSOLID SLOW CONTROL for SM1 version %s %s %s  \n\r",VERSION,__DATE__,__TIME__ );
    cmdready=false;
    while (1) {
        wait(0.5);
        if (cmdready) {
            cmdready=false;
            int decresult=decode_cmd(cmdin,&cmd);
            printf("decode result = %d \n\r" ,decresult);
            if( decresult){  continue; }           
            char cmdoutstr[100];
            
            u8 do8; // dataout
            u16 do16;
            cmd.status=1; // use it for the moment as error handling , 
            switch ( cmd.dev) {
                case DAC :  
                        {cmd.status=2;} ;
                break;
                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);
                    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=(u32)do16; cmd.status=0; }
                    if (!strcmp( cmd.cmd, "rpa2")) { adc[cmd.con-1][cmd.devnr-1].readPattern2(do16 ); cmd.dataout=(u32)do16; cmd.status=0; }
                    if (!strcmp( cmd.cmd, "rr08")) {adc[cmd.con-1][cmd.devnr-1].readReg8(cmd.ch,do8 ); cmd.dataout=(u32)do8; cmd.status=0; }
                    if (!strcmp( cmd.cmd, "rr16")) {adc[cmd.con-1][cmd.devnr-1].readReg16(cmd.ch,do16 ); cmd.dataout=(u32)do16;cmd.status=0;  }
                    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; }
                    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; }
                break; 
                case SSCCM: 
                        if (!strcmp( cmd.cmd, "t_hb")) { heartbeat=!heartbeat;}
                break;
             default : cmd.status=1;
             break;
        } // end switch 
         encode_cmd ( cmdoutstr, &cmd);  
         pc.printf( "%s", cmdoutstr);
        }//end  if cmdready 
        else {
             if ( heartbeat) printf( "%03d>%s\n\r",(i++ % 1000),cmdin);
            }
    }// end while 
   
}