First Publish
Dependencies: BridgeDriver2 FrontPanelButtons MAX31855 MCP23017 SDFileSystem TextLCD mbed
main.cpp
- Committer:
- mehatfie
- Date:
- 2014-11-10
- Revision:
- 1:9954bf6d7d25
- Parent:
- 0:20e78c9d2ea9
File content as of revision 1:9954bf6d7d25:
#include "mbed.h" #include "BridgeDriver.h" #include "FrontPanelButtons.h" #include "SDFileSystem.h" #include "LocalPinNames.h" #include "TextLCD.h" #include "max31855.h" #include <string> #include <stdio.h> using std::string; #include "DS18S20.h" #include "DS18B20.h" #include "OneWireDefs.h" #define THERMOMETER DS18B20 // device( crcOn, useAddress, parasitic, mbed pin ) THERMOMETER device(true, true, false, p25); Serial pc(USBTX, USBRX); Timer timer; // general purpose timer I2C i2c( P0_10, P0_11 ); // I2C bus (SDA, SCL) //TextLCD_I2C lcd( &i2c, MCP23008_SA0, TextLCD::lcd20x4 ); // lcd FrontPanelButtons buttons( &i2c ); // front panel buttons Timer debounceTimer; Timer avgCycTimer; DigitalIn signal(DIO0, PullUp); CAN can(p9, p10); //SPI Interfaces SPI testSPI(P0_9, P0_8, P0_7); // mosi(out), miso(in), sclk(clock) //SPI Bus //SPI testSPI(P0_9, DIO3, DIO1); // mosi(out), miso(in), sclk(clock) //SPI Bus CANMessage readBuffer; int numBuffMsg = 0; float totaltime = 0; int cycleCount = 1; int numCycles = 1000; float currTemp = 0; //Float value to hold temperature returned //Function Definitions void waitSwitch(char [], int); void waitSwitchRelease(char [], int); void waitLatch(char [], int); int checkLatchStatus(); float getTemp(); /******************************************************************************/ /************ CAN Commands *************/ /******************************************************************************/ void openDoorCommand(char dataBytes[]){ dataBytes[3] = 0x03; can.write(CANMessage(534, dataBytes, 4)); // open the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE } void closeDoorCommand(char dataBytes[]){ dataBytes[3] = 0x02; can.write(CANMessage(534, dataBytes, 4)); // close the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE } /******************************************************************************/ /************ Receieve *************/ /******************************************************************************/ void receive(){ CANMessage msg; if (can.read(msg)){ if (msg.id == 534){ readBuffer = msg; numBuffMsg = 1; } } } /******************************************************************************/ /************ Full Init *************/ /******************************************************************************/ void fullInit(){ // i2c.frequency(1000000); // lcd.setBacklight(TextLCD::LightOn); // wait(.6); // lcd.cls(); //clear the display can.frequency(500000); can.attach(&receive, CAN::RxIrq); //********* Init the Thermocouple **********// while (!device.initialize()); // keep calling until it works device.setResolution(nineBit); } /******************************************************************************/ /************ waitSwitch *************/ /******************************************************************************/ void waitSwitch(char dataBytes[], int openTimeout){ int openComplete = 0; while (!openComplete){ openDoorCommand(dataBytes); //send CAN message to open the door timer.reset(); timer.start(); int flag = 0; while (!flag){ if (signal.read() == 0){ while (!flag){ debounceTimer.reset(); debounceTimer.start(); while (debounceTimer.read_ms() < 40); if ( signal.read() == 0){ flag = 1; openComplete = 1; } } } else if (timer.read() >= openTimeout) flag = 1; } timer.stop(); // timeout on opening if (timer.read() >= openTimeout){ avgCycTimer.stop(); //pause dataBytes[3] = 0x01; can.write(CANMessage(534, dataBytes, 4)); // stop the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE //Error Message // pc.setAddress ( 0, 1 ); pc.printf( "<Press Button to Resume>\r\n" ); // pc.setAddress( 0, 2 ); pc.printf( "ERROR Open Timeout\r\n" ); while (!buttons.readSel()); //Do nothing until the button is selected avgCycTimer.start(); //start //Remove Error Message // pc.cls(); //clear the display // pc.setAddress( 0, 0 ); pc.printf( "Cycle %d of %3d\r\n", cycleCount, numCycles ); // pc.setAddress( 0, 1 ); pc.printf( "Avg t(sec): %1.3f\r\n", (totaltime / cycleCount)); // pc.setAddress( 0, 2 ); pc.printf( "STATUS: OPENING\r\n"); } } } /******************************************************************************/ /************ Close Door / Switch Release *************/ /******************************************************************************/ void waitSwitchRelease(char dataBytes[], int switchReleaseTimeout){ int switchReleaseComplete = 0; while (!switchReleaseComplete){ closeDoorCommand(dataBytes); //send CAN message to close the door timer.reset(); timer.start(); int flag = 0; while (!flag){ if (signal.read() == 1){ while (!flag){ debounceTimer.reset(); debounceTimer.start(); while (debounceTimer.read_ms() < 40); if ( signal.read() == 1){ flag = 1; switchReleaseComplete = 1; } } } else if (timer.read() >= switchReleaseTimeout) flag = 1; } timer.stop(); // timeout on switch release if (timer.read() >= switchReleaseTimeout){ avgCycTimer.stop(); //pause dataBytes[3] = 0x01; can.write(CANMessage(534, dataBytes, 4)); // stop the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE //Error Message // pc.setAddress ( 0, 1 ); pc.printf( "<Press Sel to Resume>\r\n" ); // pc.setAddress( 0, 2 ); pc.printf( "ERROR Release Switch Timeout\r\n" ); while (!buttons.readSel()); //Do nothing until the button is selected avgCycTimer.start(); //start //Remove Error Message // pc.cls(); //clear the display // pc.setAddress( 0, 0 ); pc.printf( "Cycle %d of %3d\r\n", cycleCount, numCycles ); // pc.setAddress( 0, 1 ); pc.printf( "Avg t(sec): %1.3f\r\n", (totaltime / cycleCount)); // pc.setAddress( 0, 2 ); pc.printf( "STATUS: SWITCH\r\n"); } } } /******************************************************************************/ /************ Close Door to Latch *************/ /******************************************************************************/ void waitLatch(char dataBytes[], int closeTimeout){ //Loop through the close sequence until the latch is closed int closeComplete = 0; while (!closeComplete){ closeDoorCommand(dataBytes); //send CAN message to close the door timer.reset(); timer.start(); int flag = 0; while (!flag){ if (checkLatchStatus()){ flag = 1; closeComplete = 1; } //if the timer goes off else if (timer.read() >= closeTimeout) flag = 1; } timer.stop(); // timeout on closing if (timer.read() >= closeTimeout){ avgCycTimer.stop(); //pause //Error Message // pc.setAddress ( 0, 1 ); pc.printf( "<Press Sel to Resume>\r\n" ); // pc.setAddress( 0, 2 ); pc.printf( "ERROR Close Timeout\r\n" ); dataBytes[3] = 0x01; can.write(CANMessage(534, dataBytes, 4)); // stop the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE while (!buttons.readSel()); //Do nothing until the button is selected avgCycTimer.start(); //start //Remove Error Message // pc.cls(); //clear the display // pc.setAddress( 0, 0 ); pc.printf( "Cycle %d of %3d\r\n", cycleCount, numCycles ); // pc.setAddress( 0, 1 ); pc.printf( "Avg t(sec): %1.3f\r\n", (totaltime / cycleCount)); // pc.setAddress( 0, 2 ); pc.printf( "STATUS: CLOSING\r\n"); } } } /******************************************************************************/ /************ Check Latch Status *************/ /******************************************************************************/ // Returns 1 if latch is closed, 0 if it is not closed int checkLatchStatus(){ //convert the data array into a single 64 bit value so that we can grab the range of bits we desire, no matter where they're located long long allData = 0; for (int j = 0; j < 8; j++){ long long tempData1 = (long long)readBuffer.data[j]; tempData1 <<= (8 * j); //shift data bits into there proper position in the 64 bit long long allData |= tempData1; } int _startBitValue = 4, _numBitsValue = 4; //get the latch status bits //isolate the desired range of bits for comparison // (_numBitsValue - 1) makes it so the following, startBit = 13, numBites = 5 would mean you want up to bit 17, but (13 + 5) brings you to 18, therefore do (numBits - 1) int compareBits = (allData >> _startBitValue) & ~(~0 << ((_startBitValue+(_numBitsValue-1))-_startBitValue+1)); int compareValue = 0; //value to watch (i.e. 0 for latch closed) //if the latch is closed if (compareBits == compareValue) return 1; return 0; } /******************************************************************************/ /************ getTemp *************/ /******************************************************************************/ float getTemp(){ return device.readTemperature(); } /******************************************************************************/ /************ Main *************/ /******************************************************************************/ int main() { fullInit(); int openTimeout = 10; //10sec timeout int switchReleaseTimeout = 2; int closeTimeout = 10; char dataBytes[4]; dataBytes[0] = 0x00; dataBytes[1] = 0x00; dataBytes[2] = 0x00; // pc.setAddress ( 0, 3 ); pc.printf( "<Press Button to start>\r\n" ); // while (!buttons.readSel()){ // if(buttons.readUp() && numCycles < 999999 ){ // numCycles = numCycles + 100; // wait(0.2); // } // else if (buttons.readDown() && numCycles > 0 ){ // numCycles = numCycles - 100; // wait(0.2); // } // pc.setAddress ( 0, 0 ); // pc.printf( "<Num Cycles:%5d >" , numCycles ); // } // pc.cls(); //clear the display // while(1){ // currTemp = getTemp(); // printf("%f",currTemp); // wait(1); // } /******************************************************************************/ /************ Cycle Loop *************/ /******************************************************************************/ while (cycleCount <= numCycles){ // pc.setAddress( 0, 0 ); pc.printf( "Cycle %d of %3d\r\n", cycleCount, numCycles ); avgCycTimer.reset(); avgCycTimer.start(); /******************************************************************************/ /************ Open *************/ /******************************************************************************/ openDoorCommand(dataBytes); // pc.setAddress( 0, 2 ); pc.printf( "STATUS: OPENING\r\n"); waitSwitch(dataBytes, openTimeout); /******************************************************************************/ /************ waitSwitchRelease *************/ /******************************************************************************/ closeDoorCommand(dataBytes); // pc.setAddress( 0, 2 ); pc.printf( "STATUS: SWITCH\r\n"); waitSwitchRelease(dataBytes, switchReleaseTimeout); /******************************************************************************/ /************ waitSwitchRelease *************/ /******************************************************************************/ // pc.setAddress( 0, 2 ); pc.printf( "STATUS: CLOSING\r\n"); waitLatch(dataBytes, closeTimeout); /******************************************************************************/ /************ End Cycle *************/ /******************************************************************************/ totaltime += avgCycTimer.read(); // pc.setAddress( 0, 1 ); pc.printf( "Avg t(sec): %1.3f\r\n", (totaltime / cycleCount)); wait(0.2); cycleCount++; } } /* pc.setAddress ( 0, 0 ); pc.printf( "^ Up = Open" ); pc.setAddress ( 0, 1 ); pc.printf( "v Down = Close" ); pc.setAddress ( 0, 2 ); pc.printf( "> Right = Stop" ); while(1){ if (buttons.readUp()){ dataBytes[3] = 0x03; can.write(CANMessage(534, dataBytes, 4)); // open the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE } else if (buttons.readDown()){ dataBytes[3] = 0x02; can.write(CANMessage(534, dataBytes, 4)); // close the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE } else if (buttons.readRight()){ dataBytes[3] = 0x01; can.write(CANMessage(534, dataBytes, 4)); // stop the door wait(0.1); dataBytes[3] = 0x00; can.write(CANMessage(534, dataBytes, 4)); // Set to IDLE } }*/ /* while (1){ //convert the data array into a single 64 bit value so that we can grab the range of bits we desire, no matter where they're located long long allData = 0; //((long long)*readMsg[k].data); for (int j = 0; j < 8; j++){ long long tempData1 = (long long)readBuffer.data[j]; tempData1 <<= (8 * j); //shift data bits into there proper position in the 64 bit long long allData |= tempData1; } int _startBitValue = 4, _numBitsValue = 4; //get the latch status bits //isolate the desired range of bits for comparison // (_numBitsValue - 1) makes it so the following, startBit = 13, numBites = 5 would mean you want up to bit 17, but (13 + 5) brings you to 18, therefore do (numBits - 1) int compareBits = (allData >> _startBitValue) & ~(~0 << ((_startBitValue+(_numBitsValue-1))-_startBitValue+1)); int compareValue = 0; //value to watch (i.e. 0 for latch closed) //if the latch is closed if (compareBits == compareValue){ pc.setAddress ( 0, 0 ); pc.printf( "Latch: Closed " ); } else{ pc.setAddress ( 0, 0 ); pc.printf( "Latch: Not Closed " ); } }*/