University of Texas Solar Vehicles Team / Mbed 2 deprecated motor-control

Dependencies:   mbed

Revision:
3:f282664610ba
Parent:
2:2a4822c7c91a
Child:
4:7d027ceba0a0
--- a/main.cpp	Sat Nov 09 18:35:01 2019 +0000
+++ b/main.cpp	Sat Nov 09 18:50:12 2019 +0000
@@ -1,554 +1,417 @@
+// Motor Control Board Program
+// This program operates the Tritium controller and also sends data
+// over the separate car CAN.
+
 #include "mbed.h"
-#include "shared_values.h"
 
+// CAN base address and offsets (Tritium)
 #define DC_BASE 0x220  // Driver controls base address
 #define DC_DRIVE 0x01  // Offset for motor drive command
 #define DC_POWER 0x02  // Offset for motor power command
 #define DC_RESET 0x03  // Offset for reset command
 #define DC_SWITCH 0x04 // Offset for phase current measurement
 
-#define MC_BASE 0x240    // Motor controls base address
-#define MC_BUS 0x02      // Bus measurement offset
-#define MC_VEL 0x03      // Velocity measurement offset
-#define MC_PHCUR 0x04    // Phase Current offset
-#define MC_VOVEC 0x05    // Voltage Vector offset
-#define MC_CUVEC 0x06    // current vector offset
-#define MC_BEMF 0x07     // back emf offset
-#define MC_TEMP 0x0B     // heat sink and motor temp offset
-#define MC_AMPH 0x0E     // odometer and bus amp ohours measuremeant
+#define MC_BASE 0x240 // Motor controls base address
+#define MC_BUS 0x02   // Bus measurement offset
+#define MC_VEL 0x03   // Velocity measurement offset
+#define MC_PHCUR 0x04 // Phase Current offset
+#define MC_VOVEC 0x05 // Voltage Vector offset
+#define MC_CUVEC 0x06 // current vector offset
+#define MC_BEMF 0x07  // back emf offset
+#define MC_TEMP 0x0B  // heat sink and motor temp offset
+#define MC_AMPH 0x0E  // odometer and bus amp ohours measuremeant
 #define MAX_VELOCITY 100 // motor velocity in m/s
 #define MAX_CURRENT 1.0  // desired motor current as percentage of max current
 
-#define DC_BUS_CURRENT 0x600
-#define DC_BUS_VOLTAGE 0x601
-#define PHASE_B_CURRENT 0x602
-#define PHASE_C_CURRENT 0x603
-#define VEHICLE_VELOCITY 0x604
-#define MOTOR_VELOCITY 0x605
-#define VD 0x606
-#define VQ 0x607
-#define ID 0x608
-#define IQ 0x609
-#define BEMFD 0x60A
-#define BEMFQ 0x60B
-#define HEAT_SINK_TEMPERATURE 0x60C
-#define MOTOR_TEMPERATURE 0x60D
-#define DC_BUS_AMP_HOURS 0x60E
-#define ODOMETER 0x60F
+#define DC_BUS_CURRENT 0x900
+#define DC_BUS_VOLTAGE 0x901
+#define PHASE_B_CURRENT 0x902
+#define PHASE_C_CURRENT 0x903
+#define VEHICLE_VELOCITY 0x904
+#define MOTOR_VELOCITY 0x905
+#define VD 0x906
+#define VQ 0x907
+#define ID 0x908
+#define IQ 0x909
+#define BEMFD 0x90A
+#define BEMFQ 0x90B
+#define HEAT_SINK_TEMPERATURE 0x90C
+#define MOTOR_TEMPERATURE 0x90D
+#define DC_BUS_AMP_HOURS 0x90E
+#define ODOMETER 0x90F
 
-float current = MAX_CURRENT;
-float velocity = MAX_VELOCITY;
-float bus_current = MAX_CURRENT;
-double pedal_position;
-double avgval;
-float data[2];
-float data2[2];
-float meas = 0;
-int n;
-int dummy;
-int alive;
-
-int id = DC_BASE + DC_DRIVE;
-int id2 = DC_BASE + DC_POWER;
-int id3 = MC_BASE + DC_POWER;
-
-CAN can1(PD_0, PD_1 /*, 125000*/); // can1 is car CAN  (Rx, Tx, speed)
-CAN can2(PB_5, PB_6 /*, 50000*/);  // can2 is motor controller CAN  (Rx, Tx, speed)
-AnalogIn poop(PB_0);
+CAN can1(PD_0,PD_1,125000); // can1 is car CAN  (Rx, Tx, speed)
+CAN can2(PB_5,PB_6,50000); // can2 is motor controller CAN  (Rx, Tx, speed)
 Serial pc(USBTX, USBRX);
 
-// https://stackoverflow.com/questions/24420246/c-function-to-convert-float-to-byte-array
-void float2Bytes(float val, uint8_t *bytes_array)
-{
-    uint8_t temp;
-    // Create union of shared memory space
-    union {
-        float float_variable;
-        uint8_t temp_array[4];
-    } u;
-    // Overite bytes of union with float variable
-    u.float_variable = val;
-    // Assign bytes to input array
-    memcpy(bytes_array, u.temp_array, 4);
-    temp = bytes_array[3];
-    bytes_array[3] = bytes_array[0];
-    bytes_array[0] = temp;
-    temp = bytes_array[2];
-    bytes_array[2] = bytes_array[1];
-    bytes_array[1] = temp;
-}
+AnalogIn ain(PB_0);
+
+DigitalOut LED8(PF_2);
+DigitalOut LED7(PA_7);
+DigitalOut LED6(PF_10);
+DigitalOut LED5(PF_5);
+DigitalOut LED4a(PF_3);
+DigitalOut LED3a(PC_3);
+DigitalOut LED2a(PC_0);
+DigitalOut LED1a(PA_3);
+
+#define MAX_VELOCITY 100 // motor velocity in m/s
+#define MAX_CURRENT 1.0 // desired motor current as percentage of max current
+
+int main() {
+  float current = MAX_CURRENT;
+  float velocity = MAX_VELOCITY;
+  float bus_current = MAX_CURRENT;
+  float DCbuscur;
+  float DCbusvolt;
+  double pedal_position;
+  float data[2];
+  float data2[2];
+  float meas;
+  double avgval;
+  int n;
+  int dummy;
+  int alive;
 
-float bytes2Float(uint8_t *bytes_array)
-{
-    union {
-        float f;
-        uint8_t b[4];
-    } u;
-    u.b[3] = bytes_array[0];
-    u.b[2] = bytes_array[1];
-    u.b[1] = bytes_array[2];
-    u.b[0] = bytes_array[3];
-    return u.f;
-}
-
-union {
-    char rcvdata[4];
-    float rxdata;
-} urxdata;
+  // other ids we need to read
+  float phaseBcurrent;
+  float phaseCcurrent;
+  float vehicleVel;
+  float motorVel;
+  float vd;
+  float vq;
+  float Id;
+  float Iq;
+  float BEMFd;
+  float BEMFq;
+  float heatSinkTemp;
+  float motorTemp;
+  float DCBusAmpHours;
+  float odometerValue;
 
-CANMessage msg;
-char rdata[8];
-char rdata2[8];
+  //char const * serial = "0002173";
+  // can1.frequency(500000);
+  int id;
+  int id2;
+  int id3;
+  char rdata[8];
+  char rdata2[8];
+  char rdata3[8];
+  char rdata4[8];
+  char rdata5[8];
+  char rdata6[8];
+  char rdata7[8];
+  char rdata8[8];
+  char rdata9[8];
 
-void pedal()
-{
-    while (1)
-    {
-        n = 0;
-        avgval = 0.0;
-        while (n < 100)
-        {
-            meas = poop.read();
-            avgval = avgval + meas;
-            n++;
-        }
-        pedal_position = avgval / 100.0;
-
-        current = MAX_CURRENT * pedal_position;
-        velocity = 9.0;
+  CANMessage msg;
+  dummy = 0;
+  alive = 0;
 
-        data[1] = current; // Flipped because of endianness
-        data[0] = velocity;
+    union {
+      char rcvdata[4];
+      float rxdata;
+    } urxdata;
 
-        if (!can2.write(CANMessage(id, (char *)data, 8))) // send current and velocity to Tritum
-            printf("Drive failed \n\r");
+  id = DC_BASE + DC_DRIVE;
+  id2 = DC_BASE + DC_POWER;
+  id3 = MC_BASE + DC_POWER;
 
-        data2[1] = bus_current;
-        data2[0] = 0.0;
-        if (!can2.write(CANMessage(id2, (char *)data2, 8)))
-            dummy = 0;
-
-        wait_ms(10); // Need message every 250ms to maintain operation
+  while (1) {
+    n = 0;
+    avgval = 0.0;
+    while(n < 100) {
+        meas = ain.read();
+        avgval = avgval + meas;
+        n++ ;
     }
-}
+    pedal_position = avgval/100.0;
 
-void receiveCAN()
-{
-    can1.frequency(125000);
-    can2.frequency(50000);
-    while (1)
-    {
-        pc.printf("inside thread \r\n");
-        if (can2.read(msg) && msg.id == (MC_BASE + MC_VEL))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata[i] = msg.data[i];
-            }
-            urxdata.rcvdata[3] = rdata[7];
-            urxdata.rcvdata[2] = rdata[6];
-            urxdata.rcvdata[1] = rdata[5];
-            urxdata.rcvdata[0] = rdata[4];
-            //DCbuscur = urxdata.rxdata;
-            vehicleVel = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata[3];
-            urxdata.rcvdata[2] = rdata[2];
-            urxdata.rcvdata[1] = rdata[1];
-            urxdata.rcvdata[0] = rdata[0];
-            //DCbusvolt = urxdata.rxdata;
-            motorVel = urxdata.rxdata;
-        }
-        else if (can2.read(msg) && msg.id == (MC_BASE + MC_BUS))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata2[i] = msg.data[i];
-            }
-            
-            urxdata.rcvdata[3] = rdata2[7];
-            urxdata.rcvdata[2] = rdata2[6];
-            urxdata.rcvdata[1] = rdata2[5];
-            urxdata.rcvdata[0] = rdata2[4];
-            //vehicleVel = urxdata.rxdata;
-            DCbuscur = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata2[3];
-            urxdata.rcvdata[2] = rdata2[2];
-            urxdata.rcvdata[1] = rdata2[1];
-            urxdata.rcvdata[0] = rdata2[0];
-            //motorVel = urxdata.rxdata;
-            DCbusvolt = urxdata.rxdata;
+    if(pedal_position > 0.005)
+        LED1a = 1;
+    else
+        LED1a = 0;
+    if(pedal_position > 0.01)
+        LED2a = 1;
+    else
+        LED2a = 0;
+    if(pedal_position > 0.015)
+        LED3a = 1;
+    else
+        LED3a = 0;
+    if(pedal_position > 0.02)
+        LED4a = 1;
+    else
+        LED4a = 0;
+    if(pedal_position > 0.025)
+        LED5 = 1;
+    else
+        LED5 = 0;
+    if(pedal_position > 0.03)
+        LED6 = 1;
+    else
+        LED6 = 0;
+    if(pedal_position > 0.035)
+        LED7 = 1;
+    else
+        LED7 = 0;
+
+    current = MAX_CURRENT * pedal_position;
+    velocity = 9.0;
+
+    data[1] = current;  // Flipped because of endianness
+    data[0] = velocity;
+
+    if (!can2.write(CANMessage(id, (char*)data, 8))) // send current and velocity to Tritum
+        printf("Drive failed \n\r");
+
+    data2[1] = bus_current;
+    data2[0] = 0.0;
+    if (!can2.write(CANMessage(id2, (char*)data2, 8)))
+        dummy = 0;
+
+   wait_ms(10);  // Need message every 250ms to maintain operation
+
+   // WE ARE READING STUFFF HERE //
+    if(can2.read(msg) && msg.id == id3 ) { // Tritium Bus
+        for(int i = 0; i < msg.len; i++) {
+          rdata[i] = msg.data[i];
         }
 
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x242, (char*) rdata, 8))) {
+          pc.printf("Cannot write to CAN\n");
+        }
+        wait(0.1);
+
+        urxdata.rcvdata[3] = rdata[7];
+        urxdata.rcvdata[2] = rdata[6];
+        urxdata.rcvdata[1] = rdata[5];
+        urxdata.rcvdata[0] = rdata[4];
+        DCbuscur = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata[3];
+        urxdata.rcvdata[2] = rdata[2];
+        urxdata.rcvdata[1] = rdata[1];
+        urxdata.rcvdata[0] = rdata[0];
+        DCbusvolt = urxdata.rxdata;
+        }
+
+
+        // reading vehicle and motor velocity
+    else if(can2.read(msg) && msg.id == (MC_BASE+MC_VEL)) {
+        for (int i = 0; i < msg.len; i++) {
+          rdata2[i] = msg.data[i];
+        }
+
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x243, (char*) rdata2, 8))) {
+          pc.printf("Cannot write to CAN\n");
+        }
+        wait(0.1);
+
+        urxdata.rcvdata[3] = rdata2[7];
+        urxdata.rcvdata[2] = rdata2[6];
+        urxdata.rcvdata[1] = rdata2[5];
+        urxdata.rcvdata[0] = rdata2[4];
+        vehicleVel = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata2[3];
+        urxdata.rcvdata[2] = rdata2[2];
+        urxdata.rcvdata[1] = rdata2[1];
+        urxdata.rcvdata[0] = rdata2[0];
+        motorVel = urxdata.rxdata;
+    }
+
         // reading phase currents
-        else if (can2.read(msg) && msg.id == (MC_BASE + MC_PHCUR))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata[i] = msg.data[i];
-            }
-            urxdata.rcvdata[3] = rdata[7];
-            urxdata.rcvdata[2] = rdata[6];
-            urxdata.rcvdata[1] = rdata[5];
-            urxdata.rcvdata[0] = rdata[4];
-            phaseCcurrent = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata[3];
-            urxdata.rcvdata[2] = rdata[2];
-            urxdata.rcvdata[1] = rdata[1];
-            urxdata.rcvdata[0] = rdata[0];
-            phaseBcurrent = urxdata.rxdata;
+    else if(can2.read(msg) && msg.id == (MC_BASE+MC_PHCUR)) {
+        for (int i = 0; i < msg.len; i++) {
+          rdata3[i] = msg.data[i];
+        }
+
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x244, (char*) rdata3, 8))) {
+          pc.printf("Cannot write to CAN\n");
+        }
+        wait(0.1);
+
+        urxdata.rcvdata[3] = rdata3[7];
+        urxdata.rcvdata[2] = rdata3[6];
+        urxdata.rcvdata[1] = rdata3[5];
+        urxdata.rcvdata[0] = rdata3[4];
+        phaseCcurrent = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata3[3];
+        urxdata.rcvdata[2] = rdata3[2];
+        urxdata.rcvdata[1] = rdata3[1];
+        urxdata.rcvdata[0] = rdata3[0];
+        phaseBcurrent = urxdata.rxdata;
         }
 
         // reading motor voltage vector
-        else if (can2.read(msg) && msg.id == (MC_BASE + MC_VOVEC))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata[i] = msg.data[i];
-            }
-            urxdata.rcvdata[3] = rdata[7];
-            urxdata.rcvdata[2] = rdata[6];
-            urxdata.rcvdata[1] = rdata[5];
-            urxdata.rcvdata[0] = rdata[4];
-            vd = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata[3];
-            urxdata.rcvdata[2] = rdata[2];
-            urxdata.rcvdata[1] = rdata[1];
-            urxdata.rcvdata[0] = rdata[0];
-            vq = urxdata.rxdata;
-        }
-
-        // reading current vector
-        else if (can2.read(msg) && msg.id == (MC_BASE + MC_CUVEC))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata[i] = msg.data[i];
-            }
-            urxdata.rcvdata[3] = rdata[7];
-            urxdata.rcvdata[2] = rdata[6];
-            urxdata.rcvdata[1] = rdata[5];
-            urxdata.rcvdata[0] = rdata[4];
-            Id = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata[3];
-            urxdata.rcvdata[2] = rdata[2];
-            urxdata.rcvdata[1] = rdata[1];
-            urxdata.rcvdata[0] = rdata[0];
-            Iq = urxdata.rxdata;
+    else if(can2.read(msg) && msg.id == (MC_BASE+MC_VOVEC)) {
+        for (int i = 0; i < msg.len; i++) {
+          rdata4[i] = msg.data[i];
         }
 
-        // reading back emf
-        else if (can2.read(msg) && msg.id == (MC_BASE + MC_BEMF))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata[i] = msg.data[i];
-            }
-            urxdata.rcvdata[3] = rdata[7];
-            urxdata.rcvdata[2] = rdata[6];
-            urxdata.rcvdata[1] = rdata[5];
-            urxdata.rcvdata[0] = rdata[4];
-            BEMFd = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata[3];
-            urxdata.rcvdata[2] = rdata[2];
-            urxdata.rcvdata[1] = rdata[1];
-            urxdata.rcvdata[0] = rdata[0];
-            BEMFq = urxdata.rxdata;
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x245, (char*) rdata4, 8))) {
+          pc.printf("Cannot write to CAN\n");
         }
+        wait(0.1);
 
-        // reading heatsink and motor temp
-        else if (can2.read(msg) && msg.id == (MC_BASE + MC_TEMP))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata[i] = msg.data[i];
-            }
-            urxdata.rcvdata[3] = rdata[7];
-            urxdata.rcvdata[2] = rdata[6];
-            urxdata.rcvdata[1] = rdata[5];
-            urxdata.rcvdata[0] = rdata[4];
-            heatSinkTemp = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata[3];
-            urxdata.rcvdata[2] = rdata[2];
-            urxdata.rcvdata[1] = rdata[1];
-            urxdata.rcvdata[0] = rdata[0];
-            motorTemp = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata4[7];
+        urxdata.rcvdata[2] = rdata4[6];
+        urxdata.rcvdata[1] = rdata4[5];
+        urxdata.rcvdata[0] = rdata4[4];
+        vd = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata4[3];
+        urxdata.rcvdata[2] = rdata4[2];
+        urxdata.rcvdata[1] = rdata4[1];
+        urxdata.rcvdata[0] = rdata4[0];
+        vq = urxdata.rxdata;
+    }
+
+        // reading current vector
+    else if(can2.read(msg) && msg.id == (MC_BASE+MC_CUVEC)) {
+        for (int i = 0; i < msg.len; i++) {
+          rdata5[i] = msg.data[i];
         }
 
-        // reading odometer and bus amp ohours measuremeant
-        else if (can2.read(msg) && msg.id == (MC_BASE + MC_AMPH))
-        {
-            for (int i = 0; i < msg.len; i++)
-            {
-                rdata[i] = msg.data[i];
-            }
-            urxdata.rcvdata[3] = rdata[7];
-            urxdata.rcvdata[2] = rdata[6];
-            urxdata.rcvdata[1] = rdata[5];
-            urxdata.rcvdata[0] = rdata[4];
-            DCBusAmpHours = urxdata.rxdata;
-            urxdata.rcvdata[3] = rdata[3];
-            urxdata.rcvdata[2] = rdata[2];
-            urxdata.rcvdata[1] = rdata[1];
-            urxdata.rcvdata[0] = rdata[0];
-            odometerValue = urxdata.rxdata;
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x246, (char*) rdata5, 8))) {
+          pc.printf("Cannot write to CAN\n");
+        }
+        wait(0.1);
+
+        urxdata.rcvdata[3] = rdata5[7];
+        urxdata.rcvdata[2] = rdata5[6];
+        urxdata.rcvdata[1] = rdata5[5];
+        urxdata.rcvdata[0] = rdata5[4];
+        Id = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata5[3];
+        urxdata.rcvdata[2] = rdata5[2];
+        urxdata.rcvdata[1] = rdata5[1];
+        urxdata.rcvdata[0] = rdata5[0];
+        Iq = urxdata.rxdata;
+    }
+
+    // reading back emf
+    else if(can2.read(msg) && msg.id == (MC_BASE+MC_BEMF)) {
+        for (int i = 0; i < msg.len; i++) {
+          rdata6[i] = msg.data[i];
         }
 
-        if (alive % 100 == 0)
-        {
-
-            printf("Motor board is running");
-            printf("\r\n");
-            //printf(" Requested Motor Current: %f\n\r", current);
-            //printf(" Requested Motor Velocity: %f\n\r", velocity);
-            printf(" DC Bus Current (A) = %f", DCbuscur);
-            printf("\r\n");
-            printf(" DC Bus Voltage (V) = %f", DCbusvolt);
-            printf("\r\n");
-
-            // Printing other values
-            printf(" Vehicle Velocity (RPM) = %f", vehicleVel);
-            printf("\r\n");
-            printf(" Motor Velocity (V) = %f", motorVel);
-            printf("\r\n");
-            printf(" Phase B Current (A-rms) = %f", phaseBcurrent);
-            printf("\r\n");
-            printf(" Phase C Current (A-rms) = %f", phaseCcurrent);
-            printf("\r\n");
-            printf(" Vd (V) = %f", vd);
-            printf("\r\n");
-            printf(" Vq (V) = %f", vq);
-            printf("\r\n");
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x247, (char*) rdata6, 8))) {
+          pc.printf("Cannot write to CAN\n");
+        }
+        wait(0.1);
 
-            printf(" Id (A) = %f", Id);
-            printf("\r\n");
-            printf(" Iq (A) = %f", Iq);
-            printf("\r\n");
-            printf(" BEMFd (V) = %f", BEMFd);
-            printf("\r\n");
-            printf(" BEMFq (V) = %f", BEMFq);
-            printf("\r\n");
-            printf(" Heat Sink Temperature (Celsius) = %f", heatSinkTemp);
-            printf("\r\n");
-            printf(" Motor Temperature (Celsius) = %f", motorTemp);
-            printf("\r\n");
-            printf(" DC Bus (Ah) = %f", DCBusAmpHours);
-            printf("\r\n");
-            printf(" Odometer (Distance) (m) = %f", odometerValue);
-            printf("\r\n");
-        }
+        urxdata.rcvdata[3] = rdata6[7];
+        urxdata.rcvdata[2] = rdata6[6];
+        urxdata.rcvdata[1] = rdata6[5];
+        urxdata.rcvdata[0] = rdata6[4];
+        BEMFd = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata6[3];
+        urxdata.rcvdata[2] = rdata6[2];
+        urxdata.rcvdata[1] = rdata6[1];
+        urxdata.rcvdata[0] = rdata6[0];
+        BEMFq = urxdata.rxdata;
     }
-}
-
-int counter = 0;
-int CAN_FLAG = 0;
 
-void sendCAN()
-{
-    while (1)
-    {
-        uint8_t bytes1[4];
-        float2Bytes(DCbuscur, &bytes1[0]);
-        if (can1.write(CANMessage(DC_BUS_CURRENT, (char *)(bytes1), 4)))
-        {
-            //pc.printf("Sent DC Bus Current");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes2[4];
-        float2Bytes(DCbusvolt, &bytes2[0]);
-        if (can1.write(CANMessage(DC_BUS_VOLTAGE, (char *)(bytes2), 4)))
-        {
-            //pc.printf("Sent DC Bus Voltage");
-        }
-        else
-        {
-            //pc.printf("Cannot write to CAN\n");
+    // reading heatsink and motor temp
+    else if(can2.read(msg) && msg.id == (MC_BASE+MC_TEMP)) {
+        for (int i = 0; i < msg.len; i++) {
+          rdata7[i] = msg.data[i];
         }
 
-        
-        uint8_t bytes3[4];
-        float2Bytes(vehicleVel, &bytes3[0]);
-        if (can1.write(CANMessage(VEHICLE_VELOCITY, (char *)(bytes3), 4)))
-        {
-            //pc.printf("Sent Vehicle Velocity (RPM)");
-        }
-        else
-        {
-            //pc.printf("Cannot write to CAN\n");
-        }
-
-        
-        uint8_t bytes4[4];
-        float2Bytes(motorVel, &bytes4[0]);
-        if (can1.write(CANMessage(MOTOR_VELOCITY, (char *)(bytes4), 4)))
-        {
-            //pc.printf("Sent Motor Velocity (V)");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-        
-
-        uint8_t bytes5[4];
-        float2Bytes(phaseBcurrent, &bytes5[0]);
-        if (can1.write(CANMessage(PHASE_B_CURRENT, (char *)(bytes5), 4)))
-        {
-           // pc.printf("Sent Phase B Current");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes6[4];
-        float2Bytes(phaseCcurrent, &bytes6[0]);
-        if (can1.write(CANMessage(PHASE_C_CURRENT, (char *)(bytes6), 4)))
-        {
-           // pc.printf("Sent Phase C Current");
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x24B, (char*) rdata7, 8))) {
+          pc.printf("Cannot write to CAN\n");
         }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes7[4];
-        float2Bytes(vd, &bytes7[0]);
-        if (can1.write(CANMessage(VD, (char *)(bytes7), 4)))
-        {
-            //pc.printf("Sent Vd (V)");
-        }
-        else
-        {
-            //pc.printf("Cannot write to CAN\n");
-        }
+        wait(0.1);
 
-        uint8_t bytes8[4];
-        float2Bytes(vq, &bytes8[0]);
-        if (can1.write(CANMessage(VQ, (char *)(bytes8), 4)))
-        {
-           // pc.printf("Sent Vq (V)");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
+        urxdata.rcvdata[3] = rdata7[7];
+        urxdata.rcvdata[2] = rdata7[6];
+        urxdata.rcvdata[1] = rdata7[5];
+        urxdata.rcvdata[0] = rdata7[4];
+        heatSinkTemp = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata7[3];
+        urxdata.rcvdata[2] = rdata7[2];
+        urxdata.rcvdata[1] = rdata7[1];
+        urxdata.rcvdata[0] = rdata7[0];
+        motorTemp = urxdata.rxdata;
+        wait_ms(10);  // wait to reset
+    }
 
-        uint8_t bytes9[4];
-        float2Bytes(Id, &bytes9[0]);
-        if (can1.write(CANMessage(ID, (char *)(bytes9), 4)))
-        {
-            //pc.printf("Sent Id (A)");
-        }
-        else
-        {
-            //pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes10[4];
-        float2Bytes(Iq, &bytes10[0]);
-        if (can1.write(CANMessage(IQ, (char *)(bytes10), 4)))
-        {
-           // pc.printf("Sent Iq (A)");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
+    // reading odometer and bus amp ohours measuremeant
+    else if(can2.read(msg) && msg.id == (MC_BASE+MC_AMPH)) {
+        for (int i = 0; i < msg.len; i++) {
+          rdata8[i] = msg.data[i];
         }
 
-        uint8_t bytes11[4];
-        float2Bytes(BEMFd, &bytes11[0]);
-        if (can1.write(CANMessage(BEMFD, (char *)(bytes11), 4)))
-        {
-            //pc.printf("Sent BEMFd");
-        }
-        else
-        {
-            //pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes12[4];
-        float2Bytes(BEMFq, &bytes12[0]);
-        if (can1.write(CANMessage(BEMFQ, (char *)(bytes12), 4)))
-        {
-            //pc.printf("Sent BEMFq");
-        }
-        else
-        {
-            //pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes13[4];
-        float2Bytes(heatSinkTemp, &bytes13[0]);
-        if (can1.write(CANMessage(HEAT_SINK_TEMPERATURE, (char *)(bytes13), 4)))
-        {
-           // pc.printf("Sent Heat Sink Temperature (Celsius)");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes14[4];
-        float2Bytes(motorTemp, &bytes14[0]);
-        if (can1.write(CANMessage(MOTOR_TEMPERATURE, (char *)(bytes14), 4)))
-        {
-           // pc.printf("Sent Motor Temperature (Celsius)");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes15[4];
-        float2Bytes(DCBusAmpHours, &bytes15[0]);
-        if (can1.write(CANMessage(DC_BUS_AMP_HOURS, (char *)(bytes15), 4)))
-        {
-           // pc.printf("Sent DC Bus (Ah)");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-
-        uint8_t bytes16[4];
-        float2Bytes(odometerValue, &bytes16[0]);
-        if (can1.write(CANMessage(ODOMETER, (char *)(bytes16), 4)))
-        {
-           // pc.printf("Sent Odometer (Distance) (m)");
-        }
-        else
-        {
-           // pc.printf("Cannot write to CAN\n");
-        }
-    }
-}
-
-int main()
-{
-    Thread recc(receiveCAN);
-    wait(1);
-    Thread Indicators(pedal);
-    wait(2);
-    Thread send(sendCAN);
-
-    while (1)
-    {
-        //pc.printf("main\r\n");
-        /*
-        uint8_t bytes1[4];
-        float foo = 42.0;
-        //float2Bytes(foo, &bytes1[0]);
-        if (can1.write(CANMessage(MC_BASE + MC_VEL, (char*)rdata2, 8))) {
-            pc.printf("Sent Velocity = %f", foo);
-        }
-        else {
-            pc.printf("Cannot write to CAN\n");
+        // sending value to CAR can
+        if (!can1.write(CANMessage(0x24E, (char*) rdata8, 8))) {
+          pc.printf("Cannot write to CAN\n");
         }
         wait(0.1);
-        */
+
+        urxdata.rcvdata[3] = rdata8[7];
+        urxdata.rcvdata[2] = rdata8[6];
+        urxdata.rcvdata[1] = rdata8[5];
+        urxdata.rcvdata[0] = rdata8[4];
+        DCBusAmpHours = urxdata.rxdata;
+        urxdata.rcvdata[3] = rdata8[3];
+        urxdata.rcvdata[2] = rdata8[2];
+        urxdata.rcvdata[1] = rdata8[1];
+        urxdata.rcvdata[0] = rdata8[0];
+        odometerValue = urxdata.rxdata;
     }
-}
+
+       if(alive % 100 == 0){
+       printf("Motor board is running \n\r");
+       printf(" Requested Motor Current: %f\n\r", current);
+       printf(" Requested Motor Velocity: %f\n\r", velocity);
+       printf(" DC Bus Current (A) = %f",DCbuscur);
+       printf("\r\n");
+       printf(" DC Bus Voltage (V) = %f",DCbusvolt);
+       printf("\r\n");
+
+       // Printing other values
+         printf(" Vehicle Velocity (RPM) = %f",vehicleVel);
+       printf("\r\n");
+       printf(" Motor Velocity (V) = %f",motorVel);
+       printf("\r\n");
+       printf(" Phase B Current (A-rms) = %f",phaseBcurrent);
+       printf("\r\n");
+       printf(" Phase C Current (A-rms) = %f",phaseCcurrent);
+       printf("\r\n");
+       printf(" Vd (V) = %f",vd);
+       printf("\r\n");
+       printf(" Vq (V) = %f",vq);
+       printf("\r\n");
+
+       printf(" Id (A) = %f",Id);
+       printf("\r\n");
+       printf(" Iq (A) = %f",Iq);
+       printf("\r\n");
+       printf(" BEMFd (V) = %f",BEMFd);
+       printf("\r\n");
+       printf(" BEMFq (V) = %f",BEMFq);
+       printf("\r\n");
+       printf(" Heat Sink Temperature (Celsius) = %f",heatSinkTemp);
+       printf("\r\n");
+       printf(" Motor Temperature (Celsius) = %f",motorTemp);
+       printf("\r\n");
+       printf(" DC Bus (Ah) = %f",DCBusAmpHours);
+       printf("\r\n");
+       printf(" Odometer (Distance) (m) = %f",odometerValue);
+       printf("\r\n");
+
+
+       // blinking LED
+       LED8 = !LED8;
+       if (!can1.write(CANMessage(id, (char*)data, 8))) //send current and velocity over car CAN
+              printf("Car CAN failed \n\r");
+       }
+       alive++;
+  }
+}
\ No newline at end of file