Example project for the Rioux Chem control box

Dependencies:   mbed MODSERIAL

Dependents:   screentest

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CHEM_BOX_COMMON.cpp Source File

CHEM_BOX_COMMON.cpp

00001 #include "mbed.h"
00002 #include "CHEM_BOX_INTERFACE.h"
00003 #include "MODSERIAL.h"
00004 #include <stdio.h>
00005 #include <stdarg.h>
00006 
00007 //Mbed Objects
00008 
00009 DigitalOut MBED_LED1(LED1);
00010 
00011 DigitalOut AIO_ADC1_CS(p30);     
00012 
00013 DigitalOut AIO_ADC2_CS(p29);  
00014 
00015 PwmOut BUZZER_CONTROL(p26);
00016 
00017 DigitalOut MCU_SR_CLEAR(p25);    
00018 
00019 DigitalOut AIO_DAC1_CS(p24);    
00020 
00021 DigitalOut AIO_DAC2_CS(p23);     
00022 
00023 DigitalOut RED_LED(p20);
00024 
00025 DigitalOut GREEN_LED(p14);
00026  
00027 
00028 DigitalOut MFC_POWER_CONTROL(p22); 
00029 
00030 PwmOut FAN_CONTROL(p21);       
00031 
00032 SPI SPI1(p5,p6,p7);
00033 
00034 DigitalOut MCU_SR_LOAD(p8); 
00035 
00036 SPI SPI0(p11,p12,p13); 
00037 
00038 
00039 BusOut TEMP_SENSE_ADDRESS(p15,p16,p17,p18);
00040 
00041 DigitalOut TEMP_SENSE_CS(p19); 
00042 
00043 
00044 MODSERIAL RS232_0(p9, p10, 1024, 1024); 
00045 
00046 MODSERIAL RS232_1(p28, p27, 1024, 1024); 
00047 
00048 // Make TX buffer 1024bytes and RX buffer use 512bytes.
00049 MODSERIAL PC(USBTX, USBRX, 1024, 1024); // tx, rx
00050 
00051 //Local Variables
00052 
00053 
00054 static uint8_t TerminalEcho = 1;
00055 
00056 static uint8_t HeaterBits = 0;
00057 
00058 static uint16_t SolenoidBits = 0;
00059 
00060 static uint8_t DigitalOutputBits = 0;
00061 
00062 Timeout BuzzTimeout;
00063      
00064 static uint16_t Thermocouple_FAULT = 0;     
00065 
00066 static uint16_t Thermocouple_SCV = 0;     
00067 
00068 static uint16_t Thermocouple_SCG = 0;     
00069 
00070 static uint16_t Thermocouple_OC= 0;     
00071 
00072 static float Temperature[12];
00073 
00074 static float InternalTemperature[12];
00075 
00076 static uint16_t ReadRawADC(uint8_t Channel);
00077 
00078 
00079 //Local Functions
00080 
00081 void InitTerminal();
00082 
00083 void WriteRAW_DAC_Value(uint8_t Channel,uint16_t Data);
00084 
00085 
00086 
00087 void InitChemBox()
00088 {
00089 
00090     AIO_ADC1_CS = 1;     
00091     
00092     AIO_ADC2_CS = 1;   
00093     
00094     BUZZER_CONTROL.period_ms(1.0);
00095     
00096     MCU_SR_CLEAR = 1;   
00097     
00098     AIO_ADC1_CS = 1;    
00099     
00100     AIO_ADC2_CS = 1;    
00101     
00102     MFC_POWER_CONTROL = 0;
00103     
00104     FAN_CONTROL.period_us(1000);    
00105     
00106     FAN_CONTROL.write(0);
00107         
00108     SPI1.format(8,0);
00109     
00110     SPI1.frequency(4000000);
00111     
00112     MCU_SR_LOAD = 0;
00113     
00114     SPI0.format(8,0);
00115     
00116     SPI0.frequency(4000000);
00117     
00118     TEMP_SENSE_ADDRESS = 0;
00119     
00120     TEMP_SENSE_CS = 1;
00121 
00122     HeaterBits = 0;
00123 
00124     SolenoidBits = 0;
00125 
00126     DigitalOutputBits = 0;
00127 
00128     Thermocouple_FAULT = 0;     
00129 
00130     Thermocouple_SCV = 0;     
00131     
00132     Thermocouple_SCG = 0;     
00133     
00134     Thermocouple_OC= 0;     
00135 
00136     InitTerminal();
00137     
00138     RS232_0.baud(19200);
00139   
00140     RS232_1.baud(9600);
00141     
00142 
00143 }
00144 
00145 
00146 void SetFanSpeed(uint8_t S)
00147 {
00148   if(S>100)
00149     S = 100;
00150     
00151     FAN_CONTROL = (float)(S)/100.0;
00152    
00153 }
00154 
00155 void EnableFan()
00156 {
00157     SetFanSpeed(100);
00158 }
00159 
00160 void DisableFan()
00161 {
00162     SetFanSpeed(0);
00163 }    
00164 
00165 void BuzzOff()
00166 {
00167     BUZZER_CONTROL = 0;
00168 }
00169 
00170 void Buzz(float Time)
00171 {
00172    BUZZER_CONTROL = 0.5;
00173    BuzzTimeout.attach(&BuzzOff, Time);
00174   
00175 }
00176 
00177 
00178 void EnableHeater(uint8_t RelayIndex)
00179 {
00180     HeaterBits |= (1<<RelayIndex);
00181 }
00182 
00183 void DisableHeater(uint8_t RelayIndex)
00184 {
00185     HeaterBits &= ~(1<<RelayIndex);
00186 }
00187 
00188 void EnableSolenoidValve(uint8_t SolenoidIndex)
00189 {
00190     SolenoidBits |= (1<<SolenoidIndex);
00191 }
00192 
00193 void DisableSolenoidValue(uint8_t SolenoidIndex)
00194 {
00195     SolenoidBits &= ~(1<<SolenoidIndex);
00196 }
00197 
00198 void DisableAllHeatersAndSolenoids()
00199 {
00200     
00201     SolenoidBits = 0;
00202     HeaterBits = 0;
00203 
00204     MCU_SR_CLEAR = 1;
00205     
00206     MCU_SR_CLEAR = 0;
00207 
00208     MCU_SR_CLEAR = 1;
00209     
00210     MCU_SR_LOAD = 1;
00211    
00212     MCU_SR_LOAD = 0;
00213 }
00214 
00215 void EnableMiscDigitalOutput(uint8_t DigitalOutIndex)
00216 {
00217     DigitalOutputBits |= (1<<DigitalOutIndex);
00218 }
00219 
00220 void DisableMiscDigitalOutput(uint8_t DigitalOutIndex)
00221 {
00222     DigitalOutputBits &= ~(1<<DigitalOutIndex);
00223 }
00224 
00225 void FlushDigitalIO()
00226 {
00227     SPI1.format(8,0);
00228     
00229     SPI1.write((SolenoidBits >> 8) & 0xFF);
00230     SPI1.write(SolenoidBits & 0xFF);
00231     SPI1.write(HeaterBits & 0xFF);
00232     SPI1.write(DigitalOutputBits & 0xFF);
00233     
00234     MCU_SR_LOAD = 1;
00235     MCU_SR_LOAD = 0;
00236 }
00237 
00238 //Make sure to call  ReadThermocouple before you call this so internal variables are updated
00239 uint16_t ReadThermocouple_OC() 
00240 {
00241     return Thermocouple_OC;
00242 }
00243 //Make sure to call  ReadThermocouple before you call this so internal variables are updated
00244 uint16_t ReadThermocouple_SCG()
00245 {
00246     return Thermocouple_SCG;
00247 }
00248 //Make sure to call  ReadThermocouple before you call this so internal variables are updated
00249 uint16_t ReadThermocouple_SCV()
00250 {
00251     return  Thermocouple_SCV;
00252 }
00253 //Make sure to call  ReadThermocouple before you call this so internal variables are updated
00254 uint16_t ReadThermocouple_FAULT()
00255 {
00256     return  Thermocouple_FAULT;
00257 }
00258 
00259 
00260 float ReadInternalTemperature(uint8_t ThermocoupleIndex)
00261 {
00262     ReadThermocouple(ThermocoupleIndex); //this will yank out the Data
00263     return InternalTemperature[ThermocoupleIndex];
00264 }
00265 
00266 
00267    
00268 float ReadThermocouple(uint8_t ThermocoupleIndex)
00269 {
00270     uint8_t i=0;
00271     uint32_t    ThermocoupleData = 0;
00272     uint8_t TempData[4];
00273     
00274     int16_t InternalTemp = 0;
00275     int16_t ThermocoupleTemp = 0;
00276     
00277     //reset SPi format
00278     SPI1.format(8,0);
00279     
00280     TEMP_SENSE_ADDRESS = ThermocoupleIndex & 0x1f;
00281     
00282     TEMP_SENSE_CS = 0;
00283     
00284     for(i=0;i<4;i++)
00285         TempData[i] = SPI1.write(0);
00286     
00287     TEMP_SENSE_CS = 1;
00288 
00289 
00290     ThermocoupleData =   (uint32_t)(TempData[3])         | 
00291                         (((uint32_t)(TempData[2]))<<8)   |
00292                         (((uint32_t)(TempData[1]))<<16)  |
00293                         (((uint32_t)(TempData[0]))<<24);
00294                         
00295     
00296     if(ThermocoupleData & 0x01)
00297          Thermocouple_OC |= (1<<ThermocoupleIndex);
00298     else
00299          Thermocouple_OC &= ~(1<<ThermocoupleIndex);       
00300 
00301     if(ThermocoupleData & 0x02)
00302         Thermocouple_SCG |= (1<<ThermocoupleIndex);
00303     else
00304         Thermocouple_SCG &= ~(1<<ThermocoupleIndex);
00305 
00306     if(ThermocoupleData & 0x04)
00307         Thermocouple_SCV |= (1<<ThermocoupleIndex);
00308     else
00309         Thermocouple_SCV &= ~(1<<ThermocoupleIndex);
00310 
00311     if(ThermocoupleData & (1<<16))
00312         Thermocouple_FAULT |= (1<<ThermocoupleIndex);
00313     else
00314         Thermocouple_FAULT &= ~(1<<ThermocoupleIndex);
00315 
00316     if(ThermocoupleData & (1<<15))
00317         InternalTemp = (int16_t) ( ( (ThermocoupleData>>4) & 0xFFF) | 0xF000);  //Sign extend in this case.... we need to map a 12 bit signed number to 16-bits
00318     else
00319         InternalTemp = (int16_t)( ( (ThermocoupleData>>4) & 0xFFF));
00320 
00321 
00322      if(ThermocoupleData & (0x80000000))
00323         ThermocoupleTemp = (int16_t)(((ThermocoupleData>>18) & 0x2FFF) | 0xC000);  //Sign extend in this case.... we need to map a 14 bit signed number to 16-bits
00324     else
00325         ThermocoupleTemp = (int16_t)(((ThermocoupleData>>18) & 0x2FFF));
00326 
00327      Temperature[ThermocoupleIndex] = (float)ThermocoupleTemp/4.0;
00328 
00329      InternalTemperature[ThermocoupleIndex] = (float)InternalTemp/16.0;;
00330 
00331     return  Temperature[ThermocoupleIndex];
00332 }
00333 
00334 float ReadMFC_AnalogInput(uint8_t Channel)
00335 {
00336     if(Channel > 7)
00337         Channel = 7;
00338 
00339     return ((float)(ReadRawADC(Channel)) /4095.0) * 5.0;
00340 
00341 }
00342 
00343 void EnableMFC_Power()
00344 {
00345     MFC_POWER_CONTROL = 1;
00346 }
00347 
00348 void DisableMFC_Power()
00349 {
00350     MFC_POWER_CONTROL = 0;
00351 }
00352 
00353 
00354 float ReadMISC_AnalogInput(uint8_t Channel)
00355 {
00356 
00357     if(Channel > 3)
00358         Channel = 3;
00359 
00360     return ((float)(ReadRawADC(Channel + 9)) /4095.0) * 5.0;
00361 
00362 }
00363 
00364 
00365 
00366 float Read4to20(uint8_t Channel)
00367 {
00368 
00369     if(Channel > 1)
00370         Channel = 1;
00371 
00372     return (((float)(ReadRawADC(Channel + 7)) /4095.0) * 5.0) / 82;
00373     
00374 }
00375 
00376 
00377 float ReadBP_AnalogInput()
00378 {
00379 
00380     return ((float)(ReadRawADC(15)) /4095.0) * 10.0;
00381 
00382 }
00383 
00384 
00385 
00386 
00387 static uint16_t ReadRawADC_Single(uint8_t Channel)
00388 {
00389     uint8_t ControlByte[3];
00390     uint8_t ADC_Data[3];
00391     uint16_t V;
00392     
00393     SPI0.format(8,0);   //The ADC requires mode 0,0
00394     
00395     /*See Microchip manual DS21298E-page 21*/
00396     
00397     ControlByte[0] = (((Channel&0x07)>>2) & 0x01) | (3<<1);
00398     ControlByte[1] = Channel<<6;
00399     ControlByte[2] = 0;
00400     
00401     
00402     if(Channel<8)
00403         AIO_ADC1_CS = 0;
00404     else
00405         AIO_ADC2_CS = 0;
00406             
00407         //unroll the loop    
00408         ADC_Data[0] = SPI0.write(ControlByte[0]);
00409         ADC_Data[1] = SPI0.write(ControlByte[1]);
00410         ADC_Data[2] = SPI0.write(ControlByte[2]);
00411    
00412         AIO_ADC1_CS = 1;
00413         AIO_ADC2_CS = 1;
00414         
00415         
00416         V = ((uint16_t)(ADC_Data[1])<<8 | (uint16_t)(ADC_Data[2])) & 0xFFF;
00417    
00418         return (V);
00419         
00420 }
00421 
00422 #define FILTER_SIZE 64
00423 
00424 static uint16_t ReadRawADC(uint8_t Channel)
00425 {
00426     uint32_t Value = 0;
00427     
00428     for(int i=0;i<FILTER_SIZE;i++)
00429     {
00430         Value+=ReadRawADC_Single(Channel);
00431     }
00432     
00433     Value = Value / FILTER_SIZE;
00434     
00435     return Value;
00436     
00437 }
00438 
00439 void WriteMFC_AnalogOut(uint8_t Channel,float Value)
00440 {
00441 
00442     if(Channel>7)
00443         Channel = 7;
00444         
00445     if(Value >5.0)
00446         Value = 5.0;
00447      
00448     if(Value<0.0)
00449         Value = 0.0;
00450   
00451     WriteRAW_DAC_Value(Channel,(uint16_t)((Value/5.0) * 4095));
00452  
00453 }
00454 
00455 void WriteMISC_AnalogOut(uint8_t Channel,float Value)
00456 {
00457     if(Channel>3)
00458         Channel = 3;
00459         
00460     if(Value >5.0)
00461         Value = 5.0;
00462      
00463     if(Value<0.0)
00464         Value = 0.0;
00465 
00466         WriteRAW_DAC_Value(8+Channel,(uint16_t)((Value/5.0)*4095));
00467 }
00468 
00469 void WriteBP_AnalogOut(float Value)
00470 {
00471         
00472     if(Value >10.0)
00473         Value = 10.0;
00474      
00475     if(Value<0.0)
00476         Value = 0.0;
00477 
00478         WriteRAW_DAC_Value(12,(uint16_t)((Value/10.0)*4095));
00479 }
00480 
00481 
00482 void WriteRAW_DAC_Value(uint8_t Channel,uint16_t Data)
00483 {
00484 
00485     uint16_t DataOut;
00486     
00487     if(Channel<8)
00488         AIO_DAC1_CS = 0;
00489     else
00490     {
00491         AIO_DAC2_CS = 0;
00492         Channel -= 8;
00493      }   
00494 
00495     SPI0.format(8,1);   //The DAC requires mode 0,1
00496    
00497     DataOut = ((uint16_t)(Channel) & 0x7)<<12  | (Data & 0xFFF);
00498     
00499     SPI0.write((DataOut>>8)&0xFF);
00500     SPI0.write(DataOut&0xFF);
00501 
00502     AIO_DAC1_CS = 1;
00503     AIO_DAC2_CS = 1;
00504 
00505 }
00506 
00507 
00508 
00509 
00510 #define MAX_TERMINAL_LINE_CHARS 128
00511 #define MAX_TERMINAL_CMD_CHARS  64
00512 
00513 #ifndef TRUE
00514 #define TRUE 1
00515 #endif
00516 
00517 #ifndef FALSE
00518 #define FALSE 0
00519 #endif
00520 
00521 typedef void (*TerminalCallback)(char *);
00522 
00523 
00524 typedef struct 
00525 {
00526     const char *CommandString;
00527     TerminalCallback Callback;
00528     const char *HelpString;
00529         
00530 } TerminalCallbackRecord;
00531 
00532 //Callback function prototypes
00533 void TerminalCmd_Help(char *arg);
00534 void TerminalCmd_Stub(char *arg);
00535 void TerminalCmd_EnableHeater(char *arg);
00536 void TerminalCmd_DisableHeater(char *arg);
00537 void TerminalCmd_EnableSolenoidValve(char *arg);
00538 void TerminalCmd_DisableSolenoidValue(char *arg);
00539 void TerminalCmd_DisableAllHeatersAndSolenoids(char *arg);
00540 void TerminalCmd_EnableMiscDigitalOutput(char *arg);
00541 void TerminalCmd_DisableMiscDigitalOutput(char *arg);
00542 void TerminalCmd_FlushDigitalIO(char *arg);
00543 void TerminalCmd_FanOn(char *arg);
00544 void TerminalCmd_FanOff(char *arg);
00545 void TerminalCmd_Buzz(char *arg);
00546 void TerminalCmd_T(char *arg);
00547 void TerminalCmd_MFCI(char *arg);
00548 void TerminalCmd_MFCO(char *arg);
00549 void TerminalCmd_4TO20(char *arg);
00550 void TerminalCmd_AIN(char *arg);
00551 void TerminalCmd_MFCON(char *arg);
00552 void TerminalCmd_MFCOFF(char *arg);
00553 void TerminalCmd_AOUT(char *arg);
00554 void TerminalCmd_Reset(char *arg);
00555 void TerminalCmd_ECHO_OFF(char *arg);
00556 void TerminalCmd_BPOUT(char *arg);
00557 void TerminalCmd_BPIN(char *arg);
00558 void TerminalCmd_P0(char *arg);
00559 void TerminalCmd_P1(char *arg);
00560 void TerminalCmd_P0B(char *arg);
00561 void TerminalCmd_P1B(char *arg);
00562 
00563 //Populate this array with the callback functions and their terminal command string
00564 TerminalCallbackRecord MyTerminalCallbackRecords[] ={   {"reset",TerminalCmd_Reset,"Resets the CHEM box"},
00565 
00566                                                         {"help",TerminalCmd_Help,"Lists available commands"},
00567                                                         
00568                                                         {"EH",TerminalCmd_EnableHeater,"Enables a heater channel.  Argument should be between 0 and 7.   Outputs will update when a FDIO command is issued"},
00569                                                         
00570                                                         {"DH",TerminalCmd_DisableHeater,"Disables a heater channel.  Argument should be between 0 and 7. Outputs will update when a FDIO command is issued"},
00571                                                         
00572                                                         {"ESV",TerminalCmd_EnableSolenoidValve,"Enables a solenoid channel. Argument should be between 0 and 11.  Outputs will update when a FDIO command is issued"},
00573                                                         
00574                                                         {"DSV",TerminalCmd_DisableSolenoidValue,"Disables a solenoid channel. Argument should be between 0 and 11.  Outputs will update when a FFDIO command is issued"},
00575                                                         
00576                                                         {"DAHAS",TerminalCmd_DisableAllHeatersAndSolenoids,"Disables all heaters and solenoids.  Command is immediately executed."},
00577                                                         
00578                                                         {"EMDO",TerminalCmd_EnableMiscDigitalOutput,"Enables a misc. digital output.  Argument should be between 0 and 3.  Output will update when a FDIO command is issued"},
00579                                                         
00580                                                         {"DMDO",TerminalCmd_DisableMiscDigitalOutput,"Enables a misc. digital output.  Argument should be between 0 and 3.  Output will update when a FDIO command is issued"},
00581                                                         
00582                                                         {"FDIO",TerminalCmd_FlushDigitalIO,"Updates the all of the digital IO channels"},
00583                                                         
00584                                                         {"FON",TerminalCmd_FanOn,"Turns on the fans"},
00585                                                         
00586                                                         {"FOFF",TerminalCmd_FanOff,"Turns off the fans"},
00587                                                         
00588                                                         {"BUZZ",TerminalCmd_Buzz,"Buzz for a little bit.  Argument should be a floating point number representing the number of seconds to buzz"},
00589                                                         
00590                                                         {"T",TerminalCmd_T,"Read thermocouple channel"},
00591                                                         
00592                                                         {"MFCI",TerminalCmd_MFCI,"Reads in voltage from MFC channel"},
00593                                                         
00594                                                         {"MFCO",TerminalCmd_MFCO,"Sets voltage at MFC output channel.  First argument should be the channel.  Second argument should be the voltage.  I.E.  MFCO 1.45"},
00595                                                         
00596                                                         {"AOUT",TerminalCmd_AOUT,"Sets voltage at misc. output channel. First argument should be the channel.  Second argument should be the voltage.  I.E.  AOUT 3.211"},
00597                                                         
00598                                                         {"4TO20",TerminalCmd_4TO20,"Reads a 4 to 20 mA channel"},
00599                                                         
00600                                                         {"AIN",TerminalCmd_AIN,"Reads a general purpose analog in channel"},
00601                                                         
00602                                                         {"MFCON",TerminalCmd_MFCON,"Turns on the MFC power"},
00603                                                         
00604                                                         {"MFCOFF",TerminalCmd_MFCOFF,"Turns off the MFC power"},
00605                                                         
00606                                                         {"BPOUT",TerminalCmd_BPOUT,"Sets a control voltage between 0 and 10 for the backpressure regulator.  I.E. BPOUT 1.21"},
00607                                                     
00608                                                         {"BPIN",TerminalCmd_BPIN,"Reads the Back pressure regulator feedback.   I.E. BPIN "},
00609                                                     
00610                                                         {"P0",TerminalCmd_P0,"Sends a command over RS232 port 0.  A carriage return will be added automatically."},
00611                                                   
00612                                                         {"P1",TerminalCmd_P1,"Sends a command over RS232 port 1.   A carriage return and line feed will be added automatically."},
00613                                                     
00614                                                         {"P0B",TerminalCmd_P0B,"Change the baud rate of Port 0 (default 19200)"},
00615                                                   
00616                                                         {"P1B",TerminalCmd_P1B,"Change the baud rate of Port 1 (default 9600)"},
00617                                                    
00618                                                         {"ECHO_OFF",TerminalCmd_ECHO_OFF,"Disables echoing of characters"}
00619                                                     };
00620 
00621 
00622 extern "C" void mbed_reset();
00623 
00624 void TerminalCmd_Reset(char *arg)
00625 {
00626     mbed_reset();
00627 }
00628 
00629 
00630 
00631 void TerminalCmd_Stub(char *arg)
00632 {
00633     PC.printf("stub \r\n");
00634 }
00635 
00636 void TerminalCmd_ECHO_OFF(char *arg)
00637 {
00638     TerminalEcho = 0;
00639 }
00640 
00641 uint8_t RS232_Buff[2][256];
00642 
00643 uint32_t RS232_Idx[2];
00644 
00645 
00646 void ResetRS232_Response(uint32_t Channel)
00647 {
00648       if(Channel == 0)
00649       {
00650         RS232_Idx[0] = 0;
00651       }  
00652       else
00653       {
00654           RS232_Idx[1] = 0;
00655        }
00656 }
00657 
00658 void TerminalCmd_P0(char *arg)
00659 {
00660     ResetRS232_Response(0);
00661     RS232_0.printf("%s\r",arg);
00662 }
00663 
00664 void TerminalCmd_P1(char *arg)
00665 {
00666     ResetRS232_Response(1);
00667     RS232_1.printf("%s\r\n",arg);
00668 }
00669 
00670 
00671 void ProcessRS232()
00672 {
00673     uint8_t Val;
00674      
00675     while(RS232_0.readable())
00676     {
00677         Val = RS232_0.getc();
00678         
00679         if(Val == 0x03)
00680         {
00681             
00682             if(RS232_Idx[0]>0)
00683             {
00684                 RS232_Buff[0][RS232_Idx[0]++] = 0;
00685                 PC.printf("P:0:%s\r\n",&RS232_Buff[0][0]);
00686                 ResetRS232_Response(0);
00687                 break;
00688             }
00689         }
00690         else
00691         { 
00692             if((Val>0x020) && (Val<0x7F) && (RS232_Idx[0]<(sizeof(RS232_Buff)-1)))
00693             {
00694                 RS232_Buff[0][RS232_Idx[0]++] = Val;
00695             }
00696         }
00697     }
00698         
00699         
00700     while(RS232_1.readable())
00701     {
00702         Val = RS232_1.getc();
00703         
00704         if(Val == 0x03)
00705         {
00706             if(RS232_Idx[1]>0)
00707             {
00708                 RS232_Buff[1][RS232_Idx[1]++] = 0;
00709                 PC.printf("P:1:%s\r\n",&RS232_Buff[1][0]);
00710                 ResetRS232_Response(1);
00711                 break;
00712             }
00713         }
00714         else
00715         { 
00716             if((Val>0x020) && (Val <0x7F) && (RS232_Idx[1]<(sizeof(RS232_Buff)-1)))
00717             {
00718                 RS232_Buff[1][RS232_Idx[1]++] = Val;
00719             }
00720         }
00721     }
00722 }
00723 
00724 
00725 void TerminalCmd_P0B(char *arg)
00726 {
00727     int Baud = 0;
00728     if(sscanf(arg,"%d",&Baud) == 1)
00729     {
00730          RS232_0.baud(Baud);
00731          PC.printf("Port  0 baud changed to %d",Baud);
00732     }
00733  }
00734 
00735 void TerminalCmd_P1B(char *arg)
00736 {
00737     int Baud = 0;
00738     if(sscanf(arg,"%d",&Baud) == 1)
00739     {
00740          RS232_1.baud(Baud);
00741          PC.printf("Port  1 baud changed to %d",Baud);
00742     }
00743  }
00744 
00745 void TerminalCmd_MFCI(char *arg)
00746 {
00747     int Channel = -1;
00748     float Data;
00749     
00750     if(sscanf(arg,"%d",&Channel) == 1)
00751     {
00752         if(Channel>=0 && Channel <=6)
00753         {
00754             Data =  ReadMFC_AnalogInput(Channel);
00755             PC.printf("MFCI:%d:%.3f",Channel,Data);
00756         }
00757         else
00758         {
00759             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 6",Channel);
00760         }
00761     }
00762     else
00763     {
00764         for(Channel = 0; Channel<=6; Channel++)
00765         {
00766             Data =  ReadMFC_AnalogInput(Channel);
00767             PC.printf("MFCI:%d:%.3f\r\n",Channel,Data);
00768         }    
00769     }
00770 }
00771 
00772 void TerminalCmd_MFCON(char *arg)
00773 {
00774     EnableMFC_Power();
00775 }
00776 
00777 
00778 void TerminalCmd_MFCOFF(char *arg)
00779 {
00780     DisableMFC_Power();
00781 }
00782 
00783 
00784 void TerminalCmd_MFCO(char *arg)
00785 {
00786     int Channel = -1;
00787     float Data = 0.0;
00788     
00789     if(sscanf(arg,"%d %f",&Channel,&Data) == 2)
00790     {
00791         if(Channel>=0 && Channel <=7)
00792         {
00793             WriteMFC_AnalogOut(Channel,Data);
00794         }
00795         else
00796         {
00797             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 1",Channel);
00798         }
00799     }
00800     else
00801     {
00802         PC.printf("Bad argument... %s.  Channel should be an integer between 0 and 7 and value should be a float between 0.0 and 5.0. i.e. MFCO 2 4.45",arg);
00803     }
00804 }
00805 
00806 void TerminalCmd_AOUT(char *arg)
00807 {
00808     int Channel = -1;
00809     float Data = 0.0;
00810     
00811     if(sscanf(arg,"%d %f",&Channel,&Data) == 2)
00812     {
00813         if(Channel>=0 && Channel <=3)
00814         {
00815             WriteMISC_AnalogOut(Channel,Data);
00816         }
00817         else
00818         {
00819             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 3",Channel);
00820         }
00821     }
00822     else
00823     {
00824         PC.printf("Bad argument... %s.  Channel should be an integer between 0 and 7 and value should be a float between 0.0 and 5.0.   i.e. AOUT 1 1.25",arg);
00825     }
00826 }
00827 
00828 
00829 void TerminalCmd_BPOUT(char *arg)
00830 {
00831     float Data = 0.0;
00832     
00833     if(sscanf(arg,"%f",&Data) == 1)
00834     {
00835           WriteBP_AnalogOut(Data);
00836     }
00837     else
00838     {
00839         PC.printf("Bad argument... %s.  value should be a float between 0.0 and 10.0.   i.e. BPOUT 1.25",arg);
00840     }
00841 }
00842 
00843 void TerminalCmd_BPIN(char *arg)
00844 {
00845     float Data;
00846     Data =   ReadBP_AnalogInput();
00847     PC.printf("BPIN:%.3f",Data);
00848 }
00849 
00850 void TerminalCmd_4TO20(char *arg)
00851 {
00852     int Channel = -1;
00853     float Data;
00854     
00855     if(sscanf(arg,"%d",&Channel) == 1)
00856     {
00857         if(Channel>=0 && Channel <=1)
00858         {
00859             Data =  Read4to20(Channel);
00860             PC.printf("4TO20:%d:%.3f",Channel,Data);
00861         }
00862         else
00863         {
00864             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 1",Channel);
00865         }
00866     }
00867     else
00868     {
00869       
00870         for(Channel = 0;Channel<=1;Channel++)
00871         {
00872             Data =  Read4to20(Channel);
00873             PC.printf("4TO20:%d:%.5f\r\n",Channel,Data);
00874         }
00875       
00876     }
00877 
00878 
00879 }
00880 
00881 void TerminalCmd_AIN(char *arg)
00882 {
00883     int Channel = -1;
00884     float Data;
00885     
00886     if(sscanf(arg,"%d",&Channel) == 1)
00887     {
00888         if(Channel>=0 && Channel <=3)
00889         {
00890             Data =  ReadMISC_AnalogInput(Channel);
00891             PC.printf("AIN:%d:%.3f",Channel,Data);
00892         }
00893         else
00894         {
00895             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 3",Channel);
00896         }
00897     }
00898     else
00899     {
00900         for(Channel = 0;Channel<=3;Channel++)
00901         {
00902             Data =  ReadMISC_AnalogInput(Channel);
00903             PC.printf("AIN:%d:%.3f\r\n",Channel,Data);
00904         }
00905     }
00906 }
00907 
00908 
00909 
00910 void TerminalCmd_EnableHeater(char *arg)
00911 {
00912     int Channel = -1;
00913     
00914     if(sscanf(arg,"%d",&Channel) == 1)
00915     {
00916         if(Channel>=0 && Channel <=7)
00917         {
00918             EnableHeater(Channel);
00919         }
00920         else
00921         {
00922             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 7",Channel);
00923         }
00924     }
00925     else
00926     {
00927         PC.printf("Bad argument... %s.  Should be integer between 0 and 7",arg);
00928     }
00929 }
00930 
00931 void TerminalCmd_DisableHeater(char *arg)
00932 {
00933 int Channel = -1;
00934     
00935     if(sscanf(arg,"%d",&Channel) == 1)
00936     {
00937         if(Channel>=0 && Channel <=7)
00938         {
00939             DisableHeater(Channel);
00940         }
00941         else
00942         {
00943             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 7",Channel);
00944         }
00945     }
00946     else
00947     {
00948         PC.printf("Bad argument... %s.  Should be integer between 0 and 7",arg);
00949     }
00950 
00951 }
00952 
00953 void TerminalCmd_EnableSolenoidValve(char *arg)
00954 {
00955 
00956 int Channel = -1;
00957     
00958     if(sscanf(arg,"%d",&Channel) == 1)
00959     {
00960         if(Channel>=0 && Channel <=11)
00961         {
00962             EnableSolenoidValve(Channel);
00963         }
00964         else
00965         {
00966             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 11",Channel);
00967         }
00968     }
00969     else
00970     {
00971         PC.printf("Bad argument... %s.  Should be integer between 0 and 11",arg);
00972     }
00973 }
00974 
00975 void TerminalCmd_DisableSolenoidValue(char *arg)
00976 {
00977 int Channel = -1;
00978 
00979    if(sscanf(arg,"%d",&Channel) == 1)
00980     {
00981         if( Channel >= 0 && Channel <= 11)
00982         {
00983             DisableSolenoidValue(Channel);
00984         }
00985         else
00986         {
00987             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 11",Channel);
00988         }
00989     }
00990     else
00991     {
00992         PC.printf("Bad argument... %s.  Should be integer between 0 and 11",arg);
00993     }
00994 
00995 }
00996 void TerminalCmd_DisableAllHeatersAndSolenoids(char *arg)
00997 {
00998     
00999     DisableAllHeatersAndSolenoids();
01000 
01001 }
01002 
01003 void TerminalCmd_EnableMiscDigitalOutput(char *arg)
01004 {
01005 int Channel = -1;
01006 
01007   if(sscanf(arg,"%d",&Channel) == 1)
01008     {
01009         if(Channel>=0 && Channel <=3)
01010         {
01011             EnableMiscDigitalOutput(Channel);
01012         }
01013         else
01014         {
01015             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 3",Channel);
01016         }
01017     }
01018     else
01019     {
01020         PC.printf("Bad argument... %s.  Should be integer between 0 and 3",arg);
01021     }
01022 
01023 }
01024 
01025 void TerminalCmd_DisableMiscDigitalOutput(char *arg)
01026 {
01027 int Channel = -1;
01028 
01029   if(sscanf(arg,"%d",&Channel) == 1)
01030     {
01031         if(Channel>=0 && Channel <=3)
01032         {
01033            DisableMiscDigitalOutput(Channel);
01034         }
01035         else
01036         {
01037             PC.printf("%d is an invalid channel.   Channel should be integer between 0 and 3",Channel);
01038         }
01039     }
01040     else
01041     {
01042         PC.printf("Bad argument... %s.  Should be integer between 0 and 3",arg);
01043     }
01044 
01045 }
01046 
01047 void TerminalCmd_FlushDigitalIO(char *arg)
01048 {
01049     FlushDigitalIO();
01050 }
01051 
01052 void TerminalCmd_FanOn(char *arg)
01053 {
01054      SetFanSpeed(100);   //PWMing the FANs doesn't work with the ME40100V1 models!   WE will just on or off
01055      MBED_LED1 = 1;
01056 }
01057 
01058 void TerminalCmd_FanOff(char *arg)
01059 {
01060      SetFanSpeed(0);   //PWMing the FANs doesn't work with the ME40100V1 models!   WE will just on or off
01061       MBED_LED1 = 0;
01062 }
01063 
01064 void TerminalCmd_Fan(char *arg)
01065 {
01066 int Speed = -1;
01067 
01068  if(sscanf(arg,"%d",&Speed) == 1)
01069     {
01070         if(Speed>=0 && Speed<=100)
01071         {
01072            SetFanSpeed(Speed);
01073         }
01074         else
01075         {
01076             PC.printf("%d is an invalid speed.   Speed should be between 0 and 100",Speed);
01077         }
01078     }
01079     else
01080     {
01081         PC.printf("Bad argument... %s.  Should be integer between 0 and 100",arg);
01082     }
01083 
01084 }
01085 
01086 
01087 void TerminalCmd_T(char *arg)
01088 {
01089     float Temp = 0;
01090     int Channel = -1;
01091     int Status = 0;
01092     
01093      if(sscanf(arg,"%d",&Channel) == 1)
01094         {
01095                 Temp = ReadThermocouple(Channel);
01096                 
01097                 if(ReadThermocouple_FAULT() & (1<<Channel))
01098                 {
01099                     Status = 1;
01100                 }
01101                 else
01102                 {
01103                     Status = 0;
01104                 }
01105                 
01106                  PC.printf("TEMP:%d:%.2f:%d\r\n",Channel,Temp,Status);
01107         }
01108         else
01109         {
01110             for(Channel = 0; Channel<12;Channel++)
01111             {
01112                  Temp = ReadThermocouple(Channel);
01113                  
01114                  if(ReadThermocouple_FAULT() & (1<<Channel))
01115                  {
01116                     Status = 1;
01117                  }
01118                  else
01119                  {
01120                     Status = 0;
01121                  }
01122                  
01123                   PC.printf("TEMP:%d:%.2f:%d\r\n",Channel,Temp,Status);
01124             }
01125         }
01126 }
01127 
01128 void TerminalCmd_Buzz(char *arg)
01129 {
01130  
01131  float T = -1.0;
01132 
01133  if(sscanf(arg,"%f",&T) == 1)
01134     {
01135         if(T>=0.0 && T<=5.0)
01136         {
01137            Buzz(T);
01138         }
01139         else
01140         {
01141             PC.printf("%f is an invalid time period for buzz.   Time should be between 0.0 and 5.0 seconds",T);
01142         }
01143     }
01144     else
01145     {
01146         PC.printf("Bad argument... %s.  Should be float between 0.0 and 5.0",arg);
01147     }
01148 
01149 }
01150 
01151 
01152 
01153 
01154 //*****************************************************************
01155 //Plumbing.....
01156 //*****************************************************************
01157 
01158 #define NUM_TERMINAL_COMMANDS  (sizeof(MyTerminalCallbackRecords)/sizeof(TerminalCallbackRecord))
01159 
01160 char TerminalLineBuf[MAX_TERMINAL_LINE_CHARS];
01161 uint8_t TerminalPos;
01162 char TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1];
01163 char TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS];
01164 uint8_t NextCharIn;
01165 uint8_t CmdFound;
01166  
01167 void TerminalBootMsg()
01168 {
01169 
01170 PC.printf("\r\n\r\n"); 
01171 PC.printf("***********************************\r\n"); 
01172 PC.printf("CHEM Control Box                   \r\n");
01173 PC.printf("API Version %s \r\n",API_VERSION);
01174 PC.printf("Copyright (C) <2013>  Eli Hughes\r\n");
01175 PC.printf("Wavenumber LLC\r\n"); 
01176 PC.printf("***********************************\r\n\r\n>"); 
01177 
01178 }
01179 
01180 void InitTerminal()
01181 {
01182 
01183     PC.baud(115200);
01184     TerminalPos = 0;
01185     CmdFound = 0;
01186     TerminalBootMsg();
01187 }
01188 
01189 void TerminalCmd_Help(char *arg)
01190 {
01191     uint8_t i;
01192 
01193     PC.printf("\r\n\r\nCommand List:\r\n");
01194     PC.printf("----------------------\r\n");
01195 
01196     for(i=0;i<NUM_TERMINAL_COMMANDS;i++)
01197     {
01198          PC.printf("%s  ---->  %s\r\n\r\n",MyTerminalCallbackRecords[i].CommandString,MyTerminalCallbackRecords[i].HelpString);    
01199     }
01200 
01201     PC.printf("\r\n\r\n");
01202 }
01203 
01204 void TerminalCmd_Reboot(char *arg)
01205 {
01206       TerminalBootMsg();
01207 }
01208 
01209 void ProcessTerminal()
01210 {
01211      uint8_t i,j;
01212      uint8_t ArgsFound;
01213         
01214     if(PC.readable())
01215     {
01216        NextCharIn = PC.getc();
01217        
01218         switch(NextCharIn)
01219         {
01220             case '\r':
01221              
01222              TerminalLineBuf[TerminalPos++] = 0x0;
01223              
01224              if(TerminalEcho)
01225              {
01226                  PC.putc(NextCharIn);
01227              }
01228              
01229              if(TerminalPos > 1)
01230              {
01231                  //find the command
01232                  i=0;
01233                  while(TerminalLineBuf[i]>0x20 &&  TerminalLineBuf[i]<0x7f)
01234                  {
01235                       TerminalCmdBuf[i] = TerminalLineBuf[i];
01236                       i++;
01237     
01238                     if(i==MAX_TERMINAL_CMD_CHARS)
01239                         {
01240                          break;
01241                         }
01242                  }
01243                     
01244                 TerminalCmdBuf[i] = 0;
01245                 TerminalCmdBuf[i+1] = 0;
01246                 
01247                 
01248                 ArgsFound = TRUE;
01249                 memset(TerminalArgs,0x00,sizeof(TerminalArgs));
01250                 //scan for num terminator or next non whitespace
01251                 while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS))
01252                 {
01253                     if(TerminalLineBuf[i] == 0x00)
01254                     {
01255                     
01256                         //if we find a NULL terminator before a non whitespace character they flag for no arguments
01257                         ArgsFound = FALSE;
01258                         break;
01259                     }   
01260                     i++; 
01261                 }
01262                 
01263                 if(ArgsFound == TRUE)
01264                 {
01265                     strcpy(TerminalArgs,&TerminalLineBuf[i]);
01266                     
01267                     //trim trailing whitespace
01268                     i = sizeof(TerminalArgs)-1;
01269                     
01270                     while((TerminalArgs[i]<0x21) && (i>0))
01271                     {
01272                         TerminalArgs[i]= 0x00;
01273                         i--;
01274                     }       
01275                 }
01276                 
01277                 CmdFound = FALSE;
01278                 for(j=0;j<NUM_TERMINAL_COMMANDS;j++)
01279                 {           
01280                     if(strcmp(TerminalCmdBuf,MyTerminalCallbackRecords[j].CommandString) == 0)
01281                     {
01282                         PC.printf("\r\n");
01283                         if(MyTerminalCallbackRecords[j].Callback != NULL)
01284                             MyTerminalCallbackRecords[j].Callback(TerminalArgs);
01285                     
01286                         CmdFound = TRUE;
01287                         break;
01288                     }             
01289                 }        
01290                 if(CmdFound == FALSE)
01291                 {
01292                   PC.printf("\r\n%s command not recognized.\r\n\r\n",TerminalCmdBuf);
01293                   TerminalCmd_Help("no arg");
01294                   
01295                 }
01296               }    
01297              PC.printf("\r\n");
01298              TerminalPos = 0;
01299             
01300             break;
01301             
01302             case '\b':
01303                 if(TerminalPos > 0)
01304                 {
01305                     TerminalPos--;  
01306                     if(TerminalEcho)
01307                     {  
01308                         PC.putc(NextCharIn);
01309                     }
01310                 }
01311             break;
01312             
01313             default:
01314                 
01315                 if(TerminalPos == 0 && NextCharIn == 0x020)
01316                 {
01317                      //Do nothing if space bar is pressed at beginning of line    
01318                 }
01319                    else if(NextCharIn >= 0x20 && NextCharIn<0x7F)
01320                 {
01321                     
01322                     if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1)
01323                     {
01324                          TerminalLineBuf[TerminalPos++] = NextCharIn;
01325                          if(TerminalEcho)
01326                          {
01327                             PC.putc(NextCharIn);
01328                          }
01329                     }
01330                 }
01331             
01332             break;
01333         
01334         }
01335     }
01336  
01337 }
01338 
01339 
01340 
01341