![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Has base BMU code but sends dummy temperature and voltage readings to test CAN
Dependencies: CUER_CAN DS1820 LTC2943 LTC6804 mbed
Fork of BMS_BMUCore_Max by
Diff: main.cpp
- Revision:
- 14:e0e88a009f4c
- Parent:
- 13:7b42af989cd1
- Child:
- 15:e901aff1f5b3
--- a/main.cpp Wed Jun 28 16:56:33 2017 +0000 +++ b/main.cpp Sun Jul 02 01:45:39 2017 +0000 @@ -10,7 +10,6 @@ #include "SPI_I2C_Parser.h" - using namespace CAN_IDs; // Function definitions @@ -18,20 +17,28 @@ void read_temperature_sensors(BMU_data &measurements); void update_SOC(); void init(); +void interruptHandler(); +void CANDataSentCallback(); void write_SOC_EEPROM(BMU_data &measurements,uint16_t start_address); uint16_t read_EEPROM_startup(BMU_data &measurements); uint32_t check_measurements(BMU_data &measurements); void take_measurements(BMU_data &measurements); +void test_read_CAN_buffer(); bool test_read_voltage_CAN(uint16_t readings[], int can_ids[]); void test_CAN_send(); void test_CAN_read(); CAN can(CAN_READ_PIN, CAN_WRITE_PIN); //Create a CAN object to handle CAN comms +CANMessage buffer[CAN_BUFFER_SIZE]; //CAN receive buffer +bool safe_to_write[CAN_BUFFER_SIZE]; //Semaphore bit indicating that it's safe to write to the software buffer +bool CAN_data_sent = false; + uint16_t eeprom_start_address; //the initial address where we store/read SoC values Timeout loop_delay; bool delay_finished = false; + void loop_delay_callback(void) { delay_finished = true; @@ -46,7 +53,7 @@ int can_ids[9]; - while(true) + /**while(true) { for (int i = 0; i < 9; ++i) { while(!test_read_voltage_CAN(&volt_readings[(i*4)], &can_ids[i])); @@ -59,7 +66,7 @@ } printf("\r\n"); - } + } */ init(); @@ -90,7 +97,10 @@ */ // CAN bus - transmit_data(measurements,status); + CAN_data_sent = false;//Currently does nothing, adding this line in more places then using + //while(!CAN_data_sent); in order to ensure sending completes + //transmit_data(measurements,status); + test_read_CAN_buffer(); /* // Conserve power - enter a low powered mode @@ -132,11 +142,17 @@ } //Transmitting all of the individual probes: - for(int i = 0; i < NO_TEMPERATURE_SENSORS; i++) + //for(uint8_t i = 0; i < devices_found; i++) REPLACED BY DUMMY LOOP + for(uint8_t i = 0; i < 10; i++) { - individual_temperature reading = measurements.temperature_measurements[i]; - msg = createTemperatureTelemetry(i, reading.ID, reading.measurement); - can.write(msg); + individual_temperature tempreading = measurements.temperature_measurements[i]; + msg = createTemperatureTelemetry(i, &tempreading.ROMID[0], tempreading.measurement); + if(can.write(msg)) + printf("Message sent succesfully \r\n"); + else + printf("message failed to send \r\n"); + individual_temperature testOut = decodeTemperatureTelemetry(msg); + printf("ID[6] is %d and temp is %f \r\n",testOut.ROMID[6],testOut.measurement); wait(0.1); } @@ -230,12 +246,13 @@ isotherm_12V_pin = 0; min_temperature = probe[0]->temperature('C'); max_temperature = min_temperature; // Initially set the max and min temperature equal - for (int i=0; i<devices_found; i++) { - //The ID seems to be set arbitrarily here, might make sense to change - //to a constant ID for each sensor to more easily recover the reading. - measurements.temperature_measurements[i].ID = i; + /**for (int i=0; i<devices_found; i++) { + for(int j = 0; j < 7; j++) + measurements.temperature_measurements[i].ROMID[j] = probe[i]->ROM[j]; measurements.temperature_measurements[i].measurement = probe[i] ->temperature('C'); - + + + if(measurements.temperature_measurements[i].measurement > max_temperature) { max_temperature = measurements.temperature_measurements[i].measurement; } else if (measurements.temperature_measurements[i].measurement < min_temperature) { @@ -243,7 +260,22 @@ } printf("Device %d temperature is %3.3f degrees Celcius.\r\n",i+1 ,probe[i]->temperature('C')); + }ABOVE BLOCK REPLACED BY DUMMY MEASUREMENTS */ + //Dummy data goes here + for(int i = 0; i < 10; i++) + { + for(int j = 0; j < 7; j++) + measurements.temperature_measurements[i].ROMID[j] = j; + + measurements.temperature_measurements[i].measurement = 22.7 + (float) i; + + if(measurements.temperature_measurements[i].measurement > max_temperature) { + max_temperature = measurements.temperature_measurements[i].measurement; + } else if (measurements.temperature_measurements[i].measurement < min_temperature) { + min_temperature = measurements.temperature_measurements[i].measurement; + } } + //There is also a CMU # component of this struct, currently unfilled, perhaps not needed at all. measurements.max_cell_temp.temperature = max_temperature; measurements.min_cell_temp.temperature = min_temperature; @@ -282,14 +314,18 @@ //TODO Use LTC6804_acquireVoltage to fill this array, and then properly format //it to be sent over CAN - LTC6804_acquireVoltage(cellvoltages); - + //LTC6804_acquireVoltage(cellvoltages); REPLACED BY DUMMY DATA + for(int i = 0; i < NO_CMUS; i++) + { + for(int j = 0; j < 12; j++) + cellvoltages[i][j] = i*j; //Just to have some data variation + } for(int i=0; i<NO_CMUS; i++){ for(int j=0; j<12; j++){ - measurements.cell_voltages[i].voltages[j] = cellvoltages[i][j] / 10; - printf("Cellvoltage[%d][%d] = %d \r\n",i,j,cellvoltages[i][j] /10); + measurements.cell_voltages[i].voltages[j] = cellvoltages[i][j]; // / 10; REMOVED FOR DUMMY DATA + //printf("Cellvoltage[%d][%d] = %d \r\n",i,j,cellvoltages[i][j]); // SAME AS ABOVE /10); } - } + } //Add code to take all temperature measurements and add it to measurements struct. read_temperature_sensors(measurements); @@ -304,8 +340,68 @@ { temperature_init(); // Initialise the temperature sensors LTC2943_initialise(); //Initialises the fixed parameters of the LTC2943 + + for(int i=0; i<CAN_BUFFER_SIZE; i++) + { + buffer[i].id = BLANK_ID; + //("%d",buffer[i].id); + safe_to_write[i]= true; + } + + //Initialise CAN stuff, attach CAN interrupt handlers + can.frequency(CAN_BIT_RATE); //set transmission rate to agreed bit rate (ELEC-006) + can.reset(); // (FUNC-018) + can.attach(&interruptHandler, CAN::RxIrq); //receive interrupt handler + can.attach(&CANDataSentCallback, CAN::TxIrq); //send interrupt handler + +} + +void CANDataSentCallback(void) { + CAN_data_sent = true; + printf("Some CAN was sent \r\n"); } +void interruptHandler() +{ + CANMessage msg; + if(can.read(msg)) + printf("interrupt reached with id %d \r\n",msg.id); + else + printf("reading failed \r\n"); + for(int i=0; i<CAN_BUFFER_SIZE; i++) { + if((buffer[i].id == msg.id || buffer[i].id==BLANK_ID) && safe_to_write[i]) { + //("id %d added to buffer \r\n", msg.id); + buffer[i] = msg; + //return required so that only first blank buffer entry is converted to incoming message ID each time new message ID is encountered + return; + } + } +} + +void test_read_CAN_buffer() +{ + //Import the data from the buffer into a non-volatile, more usable format + CAN_Data can_data[CAN_BUFFER_SIZE]; //container for all of the raw data + int received_CAN_IDs[CAN_BUFFER_SIZE]; //needed to keep track of which IDs we've received so far + for (int i = 0; i<CAN_BUFFER_SIZE; ++i) + { + safe_to_write[i] = false; + can_data[i].importCANData(buffer[i]); + received_CAN_IDs[i] = buffer[i].id; + safe_to_write[i] = true; + } + + for(int i = 0; i < CAN_BUFFER_SIZE; i++) + { + individual_temperature testpoint; + if(!(buffer[i].id == BLANK_ID) && buffer[i].id < 10) + { + testpoint = decodeTemperatureTelemetry(buffer[i]); + printf("Temperature is %f and ID[5] is %d \r\n", testpoint.measurement, testpoint.ROMID[5]); + }else if(buffer[i].id == 1538) + printf("id 1538 was recieved\r\n"); + } +} bool test_read_voltage_CAN(uint16_t readings[], int can_ids[]) { CANMessage msg;