De hoofdcontroller van het TLS2 project.

Dependencies:   RPCInterface mbed

Files at this revision

API Documentation at this revision

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