Eli Hughes
/
CHEM_CONTROL
Example project for the Rioux Chem control box
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Sun Jul 24 2022 04:18:19 by 1.7.2