Plz
Dependencies: mbed CANMsg Adafruit_LEDBackpack
main.cpp
- Committer:
- fconboy
- Date:
- 2019-08-20
- Revision:
- 11:6d6e8aea3112
- Parent:
- 10:ea96b4c09854
File content as of revision 11:6d6e8aea3112:
#include "mbed.h" #include "CANMsg.h" #include "Adafruit_LEDBackpack.h" Ticker ticker; Ticker ticker2; Timer timer; AnalogIn currentPot(p15); float curr_val = 0; float curr_reading = 0; AnalogIn speedPot(p16); float speed_val = 0; float speed_reading = 0; float speed_reading_ms = 0; float speed_reading_kmh = 0; DigitalIn ignition(p21); DigitalIn regen(p22); DigitalIn rev(p23); DigitalIn brake(p24); DigitalIn accel(p25); float maxBusCurrent = 1.0; float actualSpeedms = 0; float actualSpeedrpm = 0; float actualSpeedkmh = 0; I2C i2c(p28,p27); Adafruit_LEDBackpack display(&i2c); DigitalOut debug1(LED1); DigitalOut debug2(LED2); DigitalOut debug3(LED3); DigitalOut debug4(LED4); //CAN can1(p9, p10); CAN can1(p30, p29); const uint16_t SIGNAL_ID = 0x501; const uint16_t BUS_ID = 0x502; const uint16_t TRITIUM_ID = 0x603; const uint8_t DISPLAY_ADDR = 0x70; char counter = 0; uint8_t dig1 = 0; uint8_t dig2 = 0; Serial pc(USBTX, USBRX); // tx, rx CANMsg driverControls; CANMsg busCurrent; CANMsg msgReceived; //==================================================================== void printMsg(CANMessage& msg) { pc.printf("-------------------------------------\r\n"); pc.printf(" ID = 0x%.3x\r\n", msg.id); pc.printf(" Type = %d\r\n", msg.type); pc.printf(" Format = %d\r\n", msg.format); pc.printf(" Length = %d\r\n", msg.len); pc.printf(" Data ="); pc.printf("-------------------------------------\r\n"); for(int i = 0; i < msg.len; i++) pc.printf(" 0x%.2X", msg.data[i]); pc.printf("\r\n"); } //===================================================================== void onCanReceived() { can1.read(msgReceived); // pc.printf("-------------------------------------\r\n"); // pc.printf("CAN message received\r\n"); // pc.printf("-------------------------------------\r\n"); //printMsg(msgReceived); //wait(1); if (msgReceived.id == TRITIUM_ID) { // extract data from the received CAN message // in the same order as it was added on the transmitter side // pc.printf(" counter = %d\r\n", counter); // pc.printf(" voltage = %e V\r\n", voltage); debug3 = !debug3; //printMsg(msgReceived); msgReceived >> actualSpeedrpm; //pc.printf("speed in m/s %f\r\n", actualSpeedms); msgReceived >> actualSpeedms; } //timer.start(); // to transmit next message in main } //====================================================================== void displayDigit(uint8_t digit, uint8_t position) { // if (position > 4) // {} //printf("digit = %d\t position = %d\r\n", digit, position); if (digit > 9) { display.displaybuffer[position] = 0; } else if (digit == 0) { display.displaybuffer[position] = 63; } else if (digit == 1) { display.displaybuffer[position] = 48; } else if (digit == 2) { display.displaybuffer[position] = 91; } else if (digit == 3) { display.displaybuffer[position] = 79; } else if (digit == 4) { display.displaybuffer[position] = 102; } else if (digit == 5) { display.displaybuffer[position] = 109; } else if (digit == 6) { display.displaybuffer[position] = 125; } else if (digit == 7) { display.displaybuffer[position] = 7; } else if (digit == 8) { display.displaybuffer[position] = 127; } else if (digit == 9) { display.displaybuffer[position] = 103; } //timer.start(); display.writeDisplay(); //timer.stop(); //printf("Time to writeDisplay() is %dus\r\n", timer.read_us()); //timer.reset(); } void displayNumber(uint8_t number, bool position) { //timer.start(); for (int n = 0; n < 100; (n = n + 10)) { if (number >= n && number < n + 10) { dig1 = n/10; dig2 = number - n; } } if (number > 99) {dig1 = 0; dig2 = 0;} if (position) { displayDigit(dig1, 3); displayDigit(dig2, 4); } else if (!position) { displayDigit(dig1, 0); displayDigit(dig2, 1); } //timer.stop(); //printf("time taken to print number %d is %dus\r\n", number, timer.read_us()); //timer.reset(); } void setDriverControls() { driverControls.clear(); driverControls.id = SIGNAL_ID; driverControls << speed_val; driverControls << curr_val; busCurrent.clear(); busCurrent.id = BUS_ID; busCurrent << 0; busCurrent << maxBusCurrent; } void sendCAN() { setDriverControls(); //printMsg(driverControls); //printMsg(busCurrent); if(can1.write(driverControls)) { debug1 = !debug1; } else { //wait(0.5); } if(can1.write(busCurrent)) { debug2 = !debug2; } else { //wait(0.5); } } void dispSpeed() { actualSpeedkmh = abs(actualSpeedms) * 3.6; displayNumber( (uint8_t) actualSpeedkmh , 1); displayNumber( (uint8_t) speed_reading_kmh , 0); } int main() { msgReceived = CANMsg(); pc.baud(115200); can1.frequency(1000000); ticker.attach(&sendCAN, 0.1); ticker2.attach(&dispSpeed, 0.5); can1.attach(&onCanReceived); ignition.mode(PullUp); regen.mode(PullUp); rev.mode(PullUp); brake.mode(PullUp); accel.mode(PullUp); display.begin(DISPLAY_ADDR); display.setBrightness(10); //pc.printf("-------------------------------------\r\n"); //printf("Attempting to send a CAN message\n"); //printf("Current and Speed: %f and %f\n", currentPot.read(), speedPot.read()); //pc.printf("-------------------------------------\r\n"); while(1) { //curr_val = 0.2; //speed_val = 5.0; curr_reading = currentPot.read(); speed_reading = speedPot.read(); speed_reading_ms = speed_reading * 30; speed_reading_kmh = speed_reading_ms*3.6; //displayNumber(1,1); //displayNumber(1,0); bool ignition_reading = ignition.read(); bool regen_reading = regen.read(); bool rev_reading = rev.read(); bool brake_reading = brake.read(); bool accel_reading = accel.read(); //pc.printf("Current reading: %f\r\n", curr_reading); //pc.printf("Speed reading: %f\r\n", speed_reading); //pc.printf("Ignition reading: %d\r\n", ignition_reading); //pc.printf("Regen reading: %d\r\n", regen_reading); //pc.printf("Forward/reverse reading: %d\r\n", rev_reading); //pc.printf("Brake reading: %d\r\n", brake_reading); //pc.printf("Accelerator reading: %d\r\n\r\n", accel_reading); //wait(2); if (ignition) { curr_val = 0; speed_val = 0; } else { if (!brake && !regen) { speed_val = 0; curr_val = curr_reading; } else if(!brake && regen) { speed_val = 0; curr_val = 0; } else { if (rev) { speed_val = (-1)*speed_reading_ms; } else { speed_val = speed_reading_ms; } if (!accel) { curr_val = curr_reading; } else { curr_val = 0; } } } //pc.printf("speed_val: %f\r\n", speed_val); //pc.printf("curr_val: %f\r\n\r\n", curr_val); //sendCAN(); //pc.printf("\r\n\r\n"); //wait(3); } }