hi

Dependencies:   CANMsg

Revision:
0:69bbc94cae9a
Child:
1:983b2e230859
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Nov 14 03:20:27 2019 +0000
@@ -0,0 +1,463 @@
+#include "mbed.h"
+#include "canIds.h"
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+
+// #define BOARD1          // Comment this for one board, BOARD1 sends
+
+#define CHAR16                      3
+#define CHAR32                      5
+#define NUM_VOLTAGE_READINGS        31
+#define NUM_TEMP_READINGS           62
+
+
+#define MPPT_BASE_R     0x710 // MPPT Base ID (Request)
+#define MPPT_BASE_A     0x770 // MPPT Base ID (Answer)
+#define MPPT_OFF        0xF //MPPT Offset ID (set by DIP switch on board)
+ 
+Serial          pc(USBTX, USBRX);
+// CAN             can(PA_11, PA_12);       // L432KC
+CAN             can(PD_0, PD_1);            // 429ZI
+DigitalOut      led(LED1);
+CANMessage      msg;
+int counter = 0;
+#ifdef BOARD1
+    int CanID = 0x0000001;
+#else
+    int CanID = 0x0000002;
+#endif
+ 
+// 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;
+}
+
+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;
+} 
+ 
+// TODO: use snprintf to convert int, uint16_t stuff into char array for can message
+// sprintf(&voltagesChar[6*i], "%d", voltages[i]); 
+void generateValues() {
+    // state of charge (SOC)
+    //uint32_t socData = (rand() % (100 - 0 + 1)) + 0;
+    float socData = (rand() % (100000 - 0 + 1)) + 0;
+    socData = socData / 1000.0;
+    uint8_t socDataBytes[4];                 // TODO: make separate ones once we thread
+    float2Bytes(socData, &socDataBytes[0]);
+    if(can.write(CANMessage(SOC_DATA, (char*)(socDataBytes), 4))) {
+        pc.printf("Sent SOC_DATA: %f\n", socData);    
+    } else {
+        printf("Cannot write to CAN\n");
+        NVIC_SystemReset();
+    }
+    
+//    // current data, 50-60A (while moving) fixed point, 32 bits
+//    // num = (rand() % (upper - lower + 1)) + lower
+    float currentData = (rand() % (60000 - 50000 + 1)) + 50000;
+    currentData = currentData / 1000.0;
+    uint8_t bytes[4];
+    float2Bytes(currentData, &bytes[0]);
+    
+    if(can.write(CANMessage(CURRENT_DATA, (char*)(bytes), 4))) {
+        pc.printf("Sent CURRENT_DATA: %f\n", currentData);    
+    } else {
+        pc.printf("Cannot write to CAN\n");
+        NVIC_SystemReset();
+    }
+    
+    // voltage data, fixed point 2.7-4V
+    // 16 bit
+    float voltages[NUM_VOLTAGE_READINGS];
+    for (int i = 0; i < NUM_VOLTAGE_READINGS; i++) {
+        float voltageData = (rand() % (40000 - 27000 + 1)) + 27000;   
+        voltageData = voltageData / 1000.0;
+        //uint8_t bytes[4];
+        float2Bytes(voltageData, &bytes[0]);
+        
+        uint8_t data[5];
+        data[0] = i;
+        data[1] = bytes[0];
+        data[2] = bytes[1];
+        data[3] = bytes[2];
+        data[4] = bytes[3];
+        if(can.write(CANMessage(VOLTAGE_DATA, (char*)(data), 5))) {
+            pc.printf("Sent VOLTAGE_DATA: %f\n", voltageData); 
+        } else {
+            printf("Cannot write to CAN\n");
+            NVIC_SystemReset();
+        }
+        wait(0.1);
+    }
+    
+    // temperature data, 0-100C fixed point res 0.01
+    // 16 bit
+    float temperatures[NUM_TEMP_READINGS];
+    
+    for (int i = 0; i < NUM_TEMP_READINGS; i++) {
+        float tempData = (rand() % (73000 - 0 + 1)) + 0;
+        tempData = tempData / 1000.0;
+        float2Bytes(tempData, &bytes[0]);
+        
+        uint8_t data[5];
+        data[0] = i;
+        data[1] = bytes[0];
+        data[2] = bytes[1];
+        data[3] = bytes[2];
+        data[4] = bytes[3];
+        
+        if(can.write(CANMessage(TEMPERATURE_DATA, (char*)(data), 5))) {
+            pc.printf("Sent TEMP_DATA: %f\n", tempData);
+        } else {
+            printf("Cannot write to CAN\n");
+            NVIC_SystemReset();
+        }
+        wait(0.1);
+    }
+    
+    // TODO: if these flags are not at the bottom of the function, it will skip values. figure this out.
+    // bps trip always 0
+    uint8_t bpsTrip = 0;
+    if(can.write(CANMessage(BPS_TRIP, (char*)&bpsTrip, 1))) {
+        pc.printf("Sent BPS_TRIP: %d\n", bpsTrip);    
+    } else {
+        printf("Cannot write to CAN\n");
+        NVIC_SystemReset();
+    }
+    
+    // bps all clear always 1
+    uint8_t bpsClear = 1;
+    if(can.write(CANMessage(BPS_ALL_CLEAR, (char*)&bpsClear, 1))) {
+        pc.printf("Sent BPS_CLEAR: %d\n", bpsClear);    
+    } else {
+        printf("Cannot write to CAN\n");
+        NVIC_SystemReset();
+    }
+    
+    // bps off always 0
+    uint8_t bpsOff = 0;
+    if(can.write(CANMessage(BPS_OFF, (char*)&bpsOff, 1))) {
+        pc.printf("Sent BPS_OFF: %d\n", bpsOff);    
+    } else {
+        printf("Cannot write to CAN\n");
+        NVIC_SystemReset();
+    }
+    
+    // watchdog triggered, 0 always
+    uint8_t wdog = 0;
+    if(can.write(CANMessage(WDOG_TRIGGERED, (char*)&wdog, 1))) {
+        pc.printf("Sent WDOG_TRIGGERED: %d\n", wdog);    
+    } else {
+        printf("Cannot write to CAN\n");
+        NVIC_SystemReset();
+    }
+    
+    // TODO: can error, bps command message?
+    //wait(1.0);
+} 
+
+float receiveCan(void) {
+    uint32_t received;
+    /*
+    int cansuccess = 0;
+    float data[2];
+    data[1] = 0.0;
+    int id = MPPT_BASE_R + MPPT_OFF;
+ 
+    if (!can.write(CANMessage(id, (char*)data, 8)))
+        printf("Request to MPPT failed \n\r");
+    */
+    if (can.read(msg)) {
+        received = *((uint32_t*) msg.data);
+    } else {
+        return -1;
+    } 
+    pc.printf("-----------------------\r\n");
+    
+    /*
+    if(msg.id == (MPPT_BASE_A+MPPT_OFF) ) {
+        
+        AnalogIn Vtemp1(PA_3); // RTD temperature sensor (pin A2)
+AnalogIn Vtemp2(PA_4); // RTD temperature sensor (pin A3)
+        
+        double tempmeas1;
+    double tempmeas2;
+    double tempoff1 = -1.8; // Offset in deg C to calibrate RTD 1
+    double tempoff2 = -1.8; // Offset in deg C to calibrate RTD 2
+    double slope1 = 1.25; // Slope correction to RTD
+    double slope2 = 1.25; // Slope correction to RTD
+    double avgval;
+    int n = 0;
+    
+    float vscale = 150.49; // Input voltage scale factor, mV/LSB (Drivetek datasheet)
+    float vscaleout = 208.79; // Output voltage scale factor, mV/LSB (Drivetek datasheet)
+    float iscale = 8.72; // Input current scale factor, mA/LSB (Drivetek datasheet)
+    float mpptpwr;
+   
+    cansuccess = 1;
+    int involtmsb = msg.data[0] & 0x3; // Bit 0 and Bit 1 of Byte 1 are MSB Uin
+    int involtlsb = msg.data[1]; // Byte 2 is LSB of Uin
+    int involt = (involtmsb<<8)|(involtlsb);    
+    int outvoltmsb = msg.data[4] & 0x3; // Bit 0 and Bit 1 of Byte 5 are MSB Uout
+    int outvoltlsb = msg.data[5]; // Byte 6 is LSB of Uout
+    int outvolt = (outvoltmsb<<8)|(outvoltlsb);    
+    int incurmsb = msg.data[2] & 0x3; // Bit 0 and Bit 1 of Byte 3 are MSB Uin
+    int incurlsb = msg.data[3]; // Byte 4 is LSB of Iin
+    int incur = (incurmsb<<8)|(incurlsb);
+    mpptpwr = (involt*vscale/1000.0)*(incur*iscale/1000.0);
+   
+    avgval = 0.0;
+    n=0;
+    while(n<100){
+        tempmeas1 = Vtemp1.read()*3.3;
+        avgval=avgval+tempmeas1;
+        n++;
+        }
+    tempmeas1 = tempoff1 + slope1*(avgval/100.0)*150.0/2.92;
+    avgval = 0.0;
+    n=0;
+    while(n<100){
+        tempmeas2 = Vtemp2.read()*3.3;
+        avgval=avgval+tempmeas2;
+        n++;
+        }
+    tempmeas2 = tempoff2 + slope2*(avgval/100.0)*150.0/2.92;
+    printf("Array Temperature 1 = %.1f", tempmeas1);
+    printf(" deg C   ");
+    printf("Array Temperature 2 = %.1f", tempmeas2);
+    printf(" deg C \r\n");
+    printf("MPPT In Vol = %.1f", involt*vscale/1000.0);
+    printf("V Out Vol = %.1f", outvolt*vscaleout/1000.0);
+    printf("V Input Cur = %.1f", incur*iscale/1000.0);
+    printf("A In Pwr = %.2f", mpptpwr);
+    printf("W \r\n");
+    }
+    */
+    if (msg.id == DC_BUS_CURRENT){
+        float DCbuscur = bytes2Float(msg.data);
+        pc.printf("DC bus current is %f\n", DCbuscur);
+        return DCbuscur;
+    } else if (msg.id == DC_BUS_VOLTAGE){
+        float DCbusvolt = bytes2Float(msg.data);
+        pc.printf("DC bus voltage is %f\n", DCbusvolt);
+        return DCbusvolt;
+    } else if (msg.id == PHASE_B_CURRENT){
+        float phaseBcurrent = bytes2Float(msg.data);
+        pc.printf("Phase B current is %f\n", phaseBcurrent);
+        return phaseBcurrent;
+    } else if (msg.id == PHASE_C_CURRENT){
+        float phaseCcurrent = bytes2Float(msg.data);
+        pc.printf("Phase C current is %f\n", phaseCcurrent);
+        return phaseCcurrent;
+    } else if (msg.id == VEHICLE_VELOCITY){
+        float vehicleVel = bytes2Float(msg.data);
+        pc.printf("Vehicle velocity is %f\n", vehicleVel);
+        return vehicleVel;
+    } else if (msg.id == MOTOR_VELOCITY){
+        float motorVel = bytes2Float(msg.data);
+        pc.printf("Motor velocity is %f\n", motorVel);
+        return motorVel;
+    } else if (msg.id == VD){
+        float vd = bytes2Float(msg.data);
+        pc.printf("Velocity vector D is %f\n", vd);
+        return vd;
+    } else if (msg.id == VQ){
+        float vq = bytes2Float(msg.data);
+        pc.printf("Velocity vector Q is %f\n", vq);
+        return vq;
+    }  else if (msg.id == ID){
+        float Id = bytes2Float(msg.data);
+        pc.printf("Current vector D is %f\n", Id);
+        return Id;
+    } else if (msg.id == IQ){
+        float Iq = bytes2Float(msg.data);
+        pc.printf("Current vector Q is %f\n", Iq);
+        return Iq;
+    } else if (msg.id == BEMFD){
+        float BEMFd = bytes2Float(msg.data);
+        pc.printf("BackEMF Measurement D is %f\n", BEMFd);
+        return BEMFd;
+    } else if (msg.id == BEMFQ){
+        float BEMFq = bytes2Float(msg.data);
+        pc.printf("BackEMF Measurement Q is %f\n", BEMFq);
+        return BEMFq;
+    } else if (msg.id == HEAT_SINK_TEMPERATURE){
+        float heatSinkTemp = bytes2Float(msg.data);
+        pc.printf("Heat sink temperature is %f\n", heatSinkTemp);
+        return heatSinkTemp;
+    } else if (msg.id == MOTOR_TEMPERATURE){
+        float motorTemp = bytes2Float(msg.data);
+        pc.printf("Motor temperature is %f\n", motorTemp);
+        return motorTemp;
+    } else if (msg.id == DC_BUS_AMP_HOURS){
+        float DCBusAmpHours = bytes2Float(msg.data);
+        pc.printf("DC Bus AmpHours is %f\n", DCBusAmpHours);
+        return DCBusAmpHours;
+    } else if (msg.id == ODOMETER){
+        float odometerValue = bytes2Float(msg.data);
+        pc.printf("Odomoter value is %f\n", odometerValue);
+        return odometerValue;
+    } 
+    
+    // BPS
+    if (msg.id == BPS_TRIP) {
+        received = msg.data[0];
+        pc.printf("BPS Trip is %d\n", received);
+    } else if (msg.id == BPS_ALL_CLEAR) {
+        received = msg.data[0];
+        pc.printf("BPS All Clear is %d\n", received);
+    } else if (msg.id == BPS_OFF) {
+        received = msg.data[0];
+        // sd card stuff
+        pc.printf("BPS Off is %d\n", received);    
+    } else if (msg.id == WDOG_TRIGGERED) {
+        received = msg.data[0];
+        pc.printf("WDOG Triggered is %d\n", received);    
+    } else if (msg.id == CAN_ERROR) {
+        received = msg.data[0];
+        pc.printf("CAN Error is %d\n", received);    
+    } else if (msg.id == VOLTAGE_DATA) {
+        // voltage
+        float voltage = bytes2Float(&msg.data[1]);
+        pc.printf("Voltage is %.3fV from array index %d\n", voltage, msg.data[0]);
+        return voltage;
+    } else if (msg.id == TEMPERATURE_DATA){
+        // temperature   
+        float temp = bytes2Float(&msg.data[1]);
+        pc.printf("Temp is %.3f from array index %d\n", temp, msg.data[0]);  
+        return temp;
+    } else if(msg.id == SOC_DATA){
+        // state of charge
+        float soc = bytes2Float(msg.data);
+        pc.printf("SoC is %.3f%%\n", soc);
+        return received;
+    } else if(msg.id == CURRENT_DATA){
+        // current
+        float current = bytes2Float(msg.data);
+        pc.printf("Current is %.3fA\n", current); 
+        return current;
+    }
+    
+    // Motor controller
+    /*
+    else if (msg.id == DC_BUS_CURRENT){
+        float DCbuscur = bytes2Float(msg.data);
+        pc.printf("DC bus current is %f\n", DCbuscur);
+        return DCbuscur;
+    } else if (msg.id == DC_BUS_VOLTAGE){
+        float DCbusvolt = bytes2Float(msg.data);
+        pc.printf("DC bus voltage is %f\n", DCbusvolt);
+        return DCbusvolt;
+    } else if (msg.id == PHASE_B_CURRENT){
+        float phaseBcurrent = bytes2Float(msg.data);
+        pc.printf("Phase B current is %f\n", phaseBcurrent);
+        return phaseBcurrent;
+    } else if (msg.id == PHASE_C_CURRENT){
+        float phaseCcurrent = bytes2Float(msg.data);
+        pc.printf("Phase C current is %f\n", phaseCcurrent);
+        return phaseCcurrent;
+    } else if (msg.id == VEHICLE_VELOCITY){
+        float vehicleVel = bytes2Float(msg.data);
+        pc.printf("Vehicle velocity is %f\n", vehicleVel);
+        return vehicleVel;
+    } else if (msg.id == MOTOR_VELOCITY){
+        float motorVel = bytes2Float(msg.data);
+        pc.printf("Motor velocity is %f\n", motorVel);
+        return motorVel;
+    } else if (msg.id == VD){
+        float vd = bytes2Float(msg.data);
+        pc.printf("Velocity vector D is %f\n", vd);
+        return vd;
+    } else if (msg.id == VQ){
+        float vq = bytes2Float(msg.data);
+        pc.printf("Velocity vector Q is %f\n", vq);
+        return vq;
+    }  else if (msg.id == ID){
+        float Id = bytes2Float(msg.data);
+        pc.printf("Current vector D is %f\n", Id);
+        return Id;
+    } else if (msg.id == IQ){
+        float Iq = bytes2Float(msg.data);
+        pc.printf("Current vector Q is %f\n", Iq);
+        return Iq;
+    } else if (msg.id == BEMFD){
+        float BEMFd = bytes2Float(msg.data);
+        pc.printf("BackEMF Measurement D is %f\n", BEMFd);
+        return BEMFd;
+    } else if (msg.id == BEMFQ){
+        float BEMFq = bytes2Float(msg.data);
+        pc.printf("BackEMF Measurement Q is %f\n", BEMFq);
+        return BEMFq;
+    } else if (msg.id == HEAT_SINK_TEMPERATURE){
+        float heatSinkTemp = bytes2Float(msg.data);
+        pc.printf("Heat sink temperature is %f\n", heatSinkTemp);
+        return heatSinkTemp;
+    } else if (msg.id == MOTOR_TEMPERATURE){
+        float motorTemp = bytes2Float(msg.data);
+        pc.printf("Motor temperature is %f\n", motorTemp);
+        return motorTemp;
+    } else if (msg.id == DC_BUS_AMP_HOURS){
+        float DCBusAmpHours = bytes2Float(msg.data);
+        pc.printf("DC Bus AmpHours is %f\n", DCBusAmpHours);
+        return DCBusAmpHours;
+    } else if (msg.id == ODOMETER){
+        float odometerValue = bytes2Float(msg.data);
+        pc.printf("Odomoter value is %f\n", odometerValue);
+        return odometerValue;
+    } 
+    */
+    
+    
+    pc.printf("-----------------------\r\n");
+    //wait(0.5);
+    return -1;
+} 
+
+int main() {
+    pc.baud(9600);          // set serial speed
+    can.frequency(125000); // max 1Mbps, usually 150000
+    pc.printf("-----------------\r\n");
+    pc.printf("    main loop    \r\n");
+    pc.printf("this is board %d \r\n", CanID);
+    pc.printf("-----------------\r\n");
+    CANMessage msg;
+    led = 0;
+    
+    while(1) {
+       // Write CAN, comment for one board
+       #ifdef BOARD1
+        generateValues();
+       #else
+       // Read CAN, comment for the other
+        receiveCan();
+       #endif
+       
+        // comment for push
+         // wait(1.0);
+       
+    }
+}