De sensorcontroller van het TLS2 project.

Dependencies:   mbed

Revision:
3:8e50fc7b82b7
Parent:
2:4c5952cf26d0
Child:
4:512492f73e90
--- a/main.cpp	Mon Nov 14 18:39:42 2016 +0000
+++ b/main.cpp	Wed Nov 16 18:44:24 2016 +0000
@@ -1,24 +1,12 @@
 #include "mbed.h"
 
+//I2C settings
+    #define SDA D10
+    #define SCL D11
+    #define sensor_addr 0x93
+    #define I2C_BUFFER_SIZE 10
+    I2CSlave slave(SDA,SCL);
 
-/* De sensor controller heeft de volgende taken
-    1. Sensoren uitlezen
-        1. De frequentie moet per sensor aanpasbaar zijn.
-    2. Reageren op I2C data requests
-    3. Indien mogelijk meerdere samples nemen van de hoogste prioriteit sensor
-    
-    De volgende 'dingen' moeten kunnen worden ingesteld
-        1. 'Hoofd'sensor
-        2. Sample rate _per_ sensor
-        3. Moving Average van 'Hoofd'sensor
-*/
-
-
-void i2c_request(){
-    //To be written    
-}
-
-        
 float sensorVal[3] = {0}; 
 //Index 0: druksensor waarde
 //Index 1: flowsensor waarde
@@ -30,14 +18,6 @@
 bool pressure_is_main = true; //Determine the most important sensor as in, on which value is the motor controller regulating
 bool smoothing = true; //Determine to activate the moving average         
 
-
-//In: nieuwe waarde en hoeveel samples er worden gebruikt
-//Out: moving average van x elementen
-//Explanation:  deze functie 'smooth' de waardes die binnenkomen van
-//              bijvoorbeeld de druksensor. Zoals een condensator,
-//              de smoothing factor kan worden ingesteld door de hoeveelheid 
-//              samples in de moving average aan te passen.
-//              Met maximaal 100 samples.
 float calc_moving_average(float val, int samples = 10){
     static float sample_arr[100] = {0}; //[0] is the newest
     float moving_average = 0;
@@ -57,7 +37,15 @@
         return 3.1415926; //Improv error code 
     }
 }
-
+//Split an integer into two char
+void int_to_2_char(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 char2_to_int(char* arr, int first_element = 0){
+    return ((arr[first_element]<<8)+arr[first_element+1]);
+}
 int main() {
     //Pins
     AnalogIn drukSensor(A0);
@@ -77,7 +65,61 @@
     t_druk.start();
     t_flow.start();
     t_temp.start();
+    int respondSensor = 0;
+    char buffer[I2C_BUFFER_SIZE] = {0}; //Create the buffer for I2C
+    bool buffer_changed = false;
+    char data[2];
+    slave.address(sensor_addr);
     while(1) {
+        //I2C time
+        int i = slave.receive();        
+        switch (i) {
+            case I2CSlave::ReadAddressed:
+                //Received a request to be read
+                //Irrelevant for now
+                switch(respondSensor){
+                    case 1: //Druksensor
+                        int_to_2_char(data,((int)(sensorVal[0]*65535)));
+                        break;
+                    case 2: //Flowsensor
+                        int_to_2_char(data,((int)(sensorVal[1]*65535)));
+                        break;
+                    case 3://Temperatuursensor
+                        int_to_2_char(data,((int)(sensorVal[2]*65535)));
+                        break;                   
+                }
+                slave.write(data,2);
+                break;
+            case I2CSlave::WriteGeneral:
+                //Received a request to be written to
+                slave.read(buffer,I2C_BUFFER_SIZE);
+                buffer_changed = true;
+                break;
+            case I2CSlave::WriteAddressed:
+                //Received a request to be written to a specific location
+                slave.read(buffer,I2C_BUFFER_SIZE);
+                buffer_changed = true;
+                break;
+        }
+        if(buffer_changed == true){
+            for(int i=0;i<I2C_BUFFER_SIZE;i++){
+                buffer[i] = 0;   
+            }
+            int command = buffer[0];
+            switch(command){
+                case 0:
+                    //Command is recognized
+                    //Write what the command is going to do
+                    break;
+                case 1:
+                    //Command is recognized
+                    //Write what the command is going to do
+                    break;
+                default:
+                    //Command is not recognied
+                    break;                
+            }               
+        }        
         if(t_druk.read_ms() >= tick_ms_druksensor){
             //Lees de druksensor uit            
             if(pressure_is_main == true && smoothing == true){