De hoofdcontroller van het TLS2 project.
Dependencies: RPCInterface mbed
Revision 4:02a2cfa49219, committed 2016-11-17
- Comitter:
- RichardHoekstra
- Date:
- Thu Nov 17 17:18:58 2016 +0000
- Parent:
- 3:45e5d4a8a5f7
- Child:
- 5:846191af84ae
- Commit message:
- Added commands. Update variables only when things have changed for i2c stuff
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Nov 16 18:52:03 2016 +0000 +++ b/main.cpp Thu Nov 17 17:18:58 2016 +0000 @@ -2,12 +2,71 @@ #include "mbed_rpc.h" #include "SerialRPCInterface.h" +enum command_t{ //SENSORCONTROLLER COMMANDS + SET_MODE = 1, + SET_CONSTANT_PRESSURE, + SET_CONSTANT_FLOW, + SET_CONSTANT_SPEED, + SET_MIN, + SET_MAX, + SET_FREQUENCY, + RECEIVE_PRESSURE, + RECEIVE_FLOW, + //MOTORCONTROLLER COMMANDS + //Pressure sensor commands + SET_SENSOR_PRESSURE_1_SAMPLE_RATE = 13, + SET_SENSOR_PRESSURE_1_MVA, + SET_RESPONSE_SENSOR_PRESSURE_1, + SET_SENSOR_PRESSURE_2_SAMPLE_RATE, + SET_SENSOR_PRESSURE_2_MVA, + SET_RESPONSE_SENSOR_PRESSURE_2, + //Temperature sensor commands + SET_SENSOR_TEMPERATURE_1_SAMPLE_RATE, + SET_SENSOR_TEMPERATURE_1_MVA, + SET_RESPONSE_SENSOR_TEMPERATURE_1, + SET_SENSOR_TEMPERATURE_2_SAMPLE_RATE, + SET_SENSOR_TEMPERATURE_2_MVA, + SET_RESPONSE_SENSOR_TEMPERATURE_2, + //Flow sensor commands + SET_SENSOR_FLOW_SAMPLE_RATE, + SET_SENSOR_FLOW_MVA, + SET_RESPONSE_SENSOR_FLOW, + //Motor sensor + //Note: currently not used + SET_SENSOR_SPEED_SAMPLE_RATE, + SET_SENSOR_SPEED_MVA, + SET_RESPONSE_SENSOR_SPEED + } command; + //Labview Communication Variables/Settings float brightness = 0; +float sensor_pressure_1 = 0; +float sensor_pressure_2 = 0; +float sensor_temperature_1 = 0; +float sensor_temperature_2 = 0; +float sensor_flow = 0; +float pressure1_update_period_s = 1; +float pressure2_update_period_s = 1; +float temperature1_update_period_s = 1; +float temperature2_update_period_s = 1; +float flow_update_period_s = 1; RPCVariable<float> RPCbrightness(&brightness, "brightness"); +RPCVariable<float> RPCsensor_pressure_1(&sensor_pressure_1, "sensor_pressure_1"); +RPCVariable<float> RPCsensor_pressure_2(&sensor_pressure_2, "sensor_pressure_2"); +RPCVariable<float> RPCsensor_temperature_1(&sensor_temperature_1, "sensor_temperature_1"); +RPCVariable<float> RPCsensor_temperature_2(&sensor_temperature_2, "sensor_temperature_2"); +RPCVariable<float> RPCsensor_flow(&sensor_flow, "sensor_flow"); + +RPCVariable<float> RPCpressure1_update_period_s(&pressure1_update_period_s, "pressure1_update_period_s"); +RPCVariable<float> RPCpressure2_update_period_s(&pressure2_update_period_s, "pressure2_update_period_s"); +RPCVariable<float> RPCtemperature1_update_period_s(&temperature1_update_period_s, "temperature1_update_period_s"); +RPCVariable<float> RPCtemperature2_update_period_s(&temperature2_update_period_s, "temperature2_update_period_s"); +RPCVariable<float> RPCflow_update_period_s(&flow_update_period_s, "flow_update_period_s"); + Serial pc(USBTX, USBRX); //Enable USB communication + //I2C settings #define SDA D14 #define SCL D15 @@ -31,23 +90,124 @@ pc.printf("%s\n", outbuf); } //Split an integer into two char -void int_to_2_char(char* arr, int val, int first_element = 0){ +void int_to_2char(char* arr, int val, int first_element = 0){ arr[first_element] = val>>8; arr[first_element+1] = val&255; } //Join two char to make an integer. -int 2_char_to_int(char* arr, int first_element = 0){ +int char2_to_int(char* arr, int first_element = 0){ return (arr[first_element]<<8)+arr[first_element+1]; } +void updatePressure1(){ + //Request data from sensor controller + //Immediately send it back to the motor controller + char buffer[3] = {0}; + buffer[0] = SET_RESPONSE_SENSOR_PRESSURE_1; + master.write(sensor_addr,buffer,1); + buffer[0] = 0; //clear buffer again + master.read(sensor_addr,buffer,2); + //Update the pressure value for LabView + sensor_pressure_1 = char2_to_int(buffer,0); + //Move the received data over one spot to make place for a command byte + buffer[2] = buffer[1]; + buffer[1] = buffer[0]; + buffer[0] = RECEIVE_PRESSURE; + //Update motor controller + master.write(motor_addr,buffer,2); +} + +void updatePressure2(){ + //For comments see 'updatePressure1()' + char buffer[3] = {0}; + buffer[0] = SET_RESPONSE_SENSOR_PRESSURE_2; + master.write(sensor_addr,buffer,1); + buffer[0] = 0; + master.read(sensor_addr,buffer,2); + sensor_pressure_2 = char2_to_int(buffer,0); +} + + +void updateTemperature1(){ + //For comments see 'updatePressure1()' + char buffer[3] = {0}; + buffer[0] = SET_RESPONSE_SENSOR_TEMPERATURE_1; + master.write(sensor_addr,buffer,1); + buffer[0] = 0; + master.read(sensor_addr,buffer,2); + sensor_temperature_1 = char2_to_int(buffer,0); +} + +void updateTemperature2(){ + //For comments see 'updatePressure1()' + char buffer[3] = {0}; + buffer[0] = SET_RESPONSE_SENSOR_TEMPERATURE_2; + master.write(sensor_addr,buffer,1); + buffer[0] = 0; + master.read(sensor_addr,buffer,2); + sensor_temperature_2 = char2_to_int(buffer,0); +} + +void updateFlow(){ + //For comments see 'updatePressure1()' + char buffer[3] = {0}; + buffer[0] = SET_RESPONSE_SENSOR_FLOW; + master.write(sensor_addr,buffer,1); + buffer[0] = 0; + master.read(sensor_addr,buffer,2); + sensor_flow = char2_to_int(buffer,0); + buffer[2] = buffer[1]; + buffer[1] = buffer[0]; + buffer[0] = RECEIVE_FLOW; + master.write(motor_addr,buffer,2); +} + +Timer t; + +Ticker tick_pressure1, + tick_pressure2, + tick_temperature1, + tick_temperature2, + tick_flow; + +void updateI2Cstuff(){ + //Only update when the variable has actually changed + static float old_pressure1_update_period_s, + old_pressure2_update_period_s, + old_temperature1_update_period_s, + old_temperature2_update_period_s, + old_flow_update_period_s; + if(old_pressure1_update_period_s != pressure1_update_period_s){ + tick_pressure1.attach(&updatePressure1,pressure1_update_period_s); + old_pressure1_update_period_s = pressure1_update_period_s; + } + if(old_pressure2_update_period_s != pressure2_update_period_s){ + tick_pressure2.attach(&updatePressure2,pressure2_update_period_s); + old_pressure2_update_period_s = pressure2_update_period_s; + } + if(old_temperature1_update_period_s != temperature1_update_period_s){ + tick_temperature1.attach(&updateTemperature1,temperature1_update_period_s); + old_temperature1_update_period_s = temperature1_update_period_s; + } + if(old_temperature2_update_period_s != temperature2_update_period_s){ + tick_temperature2.attach(&updateTemperature2,temperature2_update_period_s); + old_temperature2_update_period_s = temperature2_update_period_s; + } + if(old_flow_update_period_s != flow_update_period_s){ + tick_flow.attach(&updateFlow,flow_update_period_s); + old_flow_update_period_s = flow_update_period_s; + } + +} + int main() { - char buf[I2C_BUFFER_SIZE]; + t.start(); while(1) { RPC_routine(); - //I2C Routine - //Take info from sensor - //Prepare for RPC - //Send info to motorcontroller + if(t.read() > 1){ + //Only update the tickers every second + updateI2Cstuff(); + } wait_ms(1); } } \ No newline at end of file