KIT Solar Car Project / Mbed 2 deprecated BMS_v1

Dependencies:   mbed INA226

Committer:
takuma1
Date:
Sat Nov 30 07:24:22 2019 +0000
Revision:
3:a1368cd4b0a9
Parent:
2:f6f76dde7e1d
Child:
4:e57b023e41f3
BMS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
APS_Lab 0:f06ed53310a3 1
APS_Lab 0:f06ed53310a3 2 #include "mbed.h"
APS_Lab 0:f06ed53310a3 3 #include "bms.h"
APS_Lab 0:f06ed53310a3 4 #include "LTC681x.h"
APS_Lab 0:f06ed53310a3 5 #include "LTC6811.h"
APS_Lab 0:f06ed53310a3 6
APS_Lab 0:f06ed53310a3 7 #define UI_BUFFER_SIZE 64
APS_Lab 0:f06ed53310a3 8 #define SERIAL_TERMINATOR '\n'
APS_Lab 0:f06ed53310a3 9
APS_Lab 0:f06ed53310a3 10 #define ENABLED 1
APS_Lab 0:f06ed53310a3 11 #define DISABLED 0
APS_Lab 0:f06ed53310a3 12
APS_Lab 0:f06ed53310a3 13 #define DATALOG_ENABLED 1
APS_Lab 0:f06ed53310a3 14 #define DATALOG_DISABLED 0
takuma1 2:f6f76dde7e1d 15
takuma1 2:f6f76dde7e1d 16 Ticker ticker;
APS_Lab 0:f06ed53310a3 17 DigitalOut led1(LED1);
APS_Lab 0:f06ed53310a3 18 Serial pc(USBTX, USBRX);
takuma1 2:f6f76dde7e1d 19 CAN BMS_CAN(p9,p10);
takuma1 2:f6f76dde7e1d 20
APS_Lab 0:f06ed53310a3 21
APS_Lab 0:f06ed53310a3 22 void run_command(uint32_t cmd);
APS_Lab 0:f06ed53310a3 23 void measurement_loop(uint8_t datalog_en);
takuma1 2:f6f76dde7e1d 24 //void print_menu();
APS_Lab 0:f06ed53310a3 25 void print_cells(uint8_t datalog_en);
APS_Lab 0:f06ed53310a3 26 void print_open();
APS_Lab 0:f06ed53310a3 27 void print_aux(uint8_t datalog_en);
APS_Lab 0:f06ed53310a3 28 void print_stat();
APS_Lab 0:f06ed53310a3 29 void print_config();
APS_Lab 0:f06ed53310a3 30 void print_rxconfig();
APS_Lab 0:f06ed53310a3 31 void print_pec(void);
APS_Lab 0:f06ed53310a3 32 void serial_print_hex(uint8_t data);
APS_Lab 0:f06ed53310a3 33 void check_error(int error);
takuma1 2:f6f76dde7e1d 34 void wakeup();
takuma1 2:f6f76dde7e1d 35 void cell_read();
takuma1 2:f6f76dde7e1d 36 void spi_error();
takuma1 3:a1368cd4b0a9 37 void ic_check();
takuma1 3:a1368cd4b0a9 38 void spi_check();
takuma1 3:a1368cd4b0a9 39 void print_CAN(uint8_t datalog_en);
takuma1 3:a1368cd4b0a9 40 void print_math();
takuma1 2:f6f76dde7e1d 41
APS_Lab 0:f06ed53310a3 42 //char get_char();
APS_Lab 0:f06ed53310a3 43 //void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
APS_Lab 0:f06ed53310a3 44
APS_Lab 0:f06ed53310a3 45 /**********************************************************
APS_Lab 0:f06ed53310a3 46 Setup Variables
APS_Lab 0:f06ed53310a3 47 The following variables can be modified to
APS_Lab 0:f06ed53310a3 48 configure the software.
APS_Lab 0:f06ed53310a3 49
APS_Lab 0:f06ed53310a3 50 ***********************************************************/
takuma1 3:a1368cd4b0a9 51 const uint8_t TOTAL_IC = 2;//!<number of ICs in the daisy chain
APS_Lab 0:f06ed53310a3 52 char ui_buffer[UI_BUFFER_SIZE];
APS_Lab 0:f06ed53310a3 53
APS_Lab 0:f06ed53310a3 54
APS_Lab 0:f06ed53310a3 55 //ADC Command Configurations
APS_Lab 0:f06ed53310a3 56 //const uint8_t ADC_OPT = ADC_OPT_DISABLED; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 57 const uint8_t ADC_CONVERSION_MODE = MD_7KHZ_3KHZ;//MD_7KHZ_3KHZ; //MD_26HZ_2KHZ;//MD_7KHZ_3KHZ; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 58 const uint8_t ADC_DCP = DCP_DISABLED; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 59 const uint8_t CELL_CH_TO_CONVERT = CELL_CH_ALL; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 60 const uint8_t AUX_CH_TO_CONVERT = AUX_CH_ALL; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 61 const uint8_t STAT_CH_TO_CONVERT = STAT_CH_ALL; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 62
APS_Lab 0:f06ed53310a3 63 const uint16_t MEASUREMENT_LOOP_TIME = 500;//milliseconds(mS)
APS_Lab 0:f06ed53310a3 64
APS_Lab 0:f06ed53310a3 65 //Under Voltage and Over Voltage Thresholds
takuma1 2:f6f76dde7e1d 66 const uint16_t OV_THRESHOLD = 41000; //
takuma1 2:f6f76dde7e1d 67 const uint16_t UV_THRESHOLD = 30000; //
APS_Lab 0:f06ed53310a3 68
APS_Lab 0:f06ed53310a3 69 //Loop Measurement Setup These Variables are ENABLED or DISABLED Remember ALL CAPS
APS_Lab 0:f06ed53310a3 70 const uint8_t WRITE_CONFIG = DISABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 71 const uint8_t READ_CONFIG = DISABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 72 const uint8_t MEASURE_CELL = ENABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 73 const uint8_t MEASURE_AUX = DISABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 74 const uint8_t MEASURE_STAT = DISABLED; //This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 75 const uint8_t PRINT_PEC = DISABLED; //This is ENABLED or DISABLED
takuma1 3:a1368cd4b0a9 76 short n =0;
APS_Lab 0:f06ed53310a3 77
APS_Lab 0:f06ed53310a3 78 // Read data from the serial interface into the ui_buffer buffer
APS_Lab 0:f06ed53310a3 79 uint8_t read_data();
APS_Lab 0:f06ed53310a3 80
APS_Lab 0:f06ed53310a3 81 // Read a float value from the serial interface
APS_Lab 0:f06ed53310a3 82 float read_float();
APS_Lab 0:f06ed53310a3 83
APS_Lab 0:f06ed53310a3 84 int32_t read_int();
takuma1 2:f6f76dde7e1d 85 int kaisuu;
takuma1 3:a1368cd4b0a9 86 unsigned short BAT_MIN, BAT_MAX, BAT_AVG;
takuma1 3:a1368cd4b0a9 87 unsigned long BAT_SUM;
takuma1 3:a1368cd4b0a9 88 unsigned short BAT_CELL[23];
takuma1 3:a1368cd4b0a9 89
APS_Lab 0:f06ed53310a3 90 char *read_string();
APS_Lab 0:f06ed53310a3 91
takuma1 3:a1368cd4b0a9 92
APS_Lab 0:f06ed53310a3 93 int8_t read_char();
APS_Lab 0:f06ed53310a3 94
APS_Lab 0:f06ed53310a3 95 /************************************
APS_Lab 0:f06ed53310a3 96 END SETUP
APS_Lab 0:f06ed53310a3 97 *************************************/
APS_Lab 0:f06ed53310a3 98
APS_Lab 0:f06ed53310a3 99 /******************************************************
APS_Lab 0:f06ed53310a3 100 *** Global Battery Variables received from 681x commands
APS_Lab 0:f06ed53310a3 101 These variables store the results from the LTC6811
APS_Lab 0:f06ed53310a3 102 register reads and the array lengths must be based
APS_Lab 0:f06ed53310a3 103 on the number of ICs on the stack
APS_Lab 0:f06ed53310a3 104 ******************************************************/
APS_Lab 0:f06ed53310a3 105
APS_Lab 0:f06ed53310a3 106 cell_asic bms_ic[TOTAL_IC];
APS_Lab 0:f06ed53310a3 107
APS_Lab 0:f06ed53310a3 108 int main(void)
APS_Lab 0:f06ed53310a3 109 {
APS_Lab 0:f06ed53310a3 110 uint32_t user_command;
APS_Lab 0:f06ed53310a3 111
APS_Lab 0:f06ed53310a3 112 pc.baud(115200);
takuma1 3:a1368cd4b0a9 113 //spi_enable();
takuma1 3:a1368cd4b0a9 114 //LTC681x_init_cfg(TOTAL_IC, bms_ic);
takuma1 3:a1368cd4b0a9 115 //LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
takuma1 3:a1368cd4b0a9 116 //LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
takuma1 3:a1368cd4b0a9 117 //ic_check();
takuma1 3:a1368cd4b0a9 118 //wakeup();
takuma1 3:a1368cd4b0a9 119
takuma1 3:a1368cd4b0a9 120
takuma1 3:a1368cd4b0a9 121 //print_menu();
takuma1 3:a1368cd4b0a9 122
takuma1 3:a1368cd4b0a9 123
takuma1 3:a1368cd4b0a9 124 while(1) {
takuma1 3:a1368cd4b0a9 125
takuma1 3:a1368cd4b0a9 126
takuma1 3:a1368cd4b0a9 127 unsigned short BAT_MIN = 0;
takuma1 3:a1368cd4b0a9 128 unsigned short BAT_MAX = 0;
takuma1 3:a1368cd4b0a9 129 //spi_error();
takuma1 3:a1368cd4b0a9 130 //pc.printf("check 00\n");
takuma1 3:a1368cd4b0a9 131 //while(!pc.readable()) {
takuma1 3:a1368cd4b0a9 132 //wait(0.3);
takuma1 3:a1368cd4b0a9 133 // pc.printf("check 001\n");
takuma1 3:a1368cd4b0a9 134 //} // Check for user input
takuma1 3:a1368cd4b0a9 135 //pc.printf("check 01\n");
takuma1 3:a1368cd4b0a9 136 //user_command = read_int();
takuma1 3:a1368cd4b0a9 137 //run_command(user_command);
takuma1 3:a1368cd4b0a9 138
takuma1 3:a1368cd4b0a9 139 ic_check();
takuma1 3:a1368cd4b0a9 140 }
takuma1 3:a1368cd4b0a9 141 }
takuma1 3:a1368cd4b0a9 142 void ic_check(){ //1
takuma1 3:a1368cd4b0a9 143
takuma1 3:a1368cd4b0a9 144 pc.baud(115200);
APS_Lab 0:f06ed53310a3 145 spi_enable();
APS_Lab 0:f06ed53310a3 146 LTC681x_init_cfg(TOTAL_IC, bms_ic);
APS_Lab 0:f06ed53310a3 147 LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 148 LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
takuma1 2:f6f76dde7e1d 149 wakeup_sleep(TOTAL_IC);
takuma1 2:f6f76dde7e1d 150 LTC6811_wrcfg(TOTAL_IC,bms_ic);
takuma1 2:f6f76dde7e1d 151 print_config();
takuma1 3:a1368cd4b0a9 152 spi_check();
takuma1 3:a1368cd4b0a9 153
takuma1 3:a1368cd4b0a9 154 }
takuma1 3:a1368cd4b0a9 155
takuma1 3:a1368cd4b0a9 156 void spi_check(){ //2
takuma1 3:a1368cd4b0a9 157 int countup;
takuma1 3:a1368cd4b0a9 158 int8_t error = 0;
takuma1 3:a1368cd4b0a9 159
takuma1 2:f6f76dde7e1d 160 wakeup_sleep(TOTAL_IC);
takuma1 2:f6f76dde7e1d 161 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
takuma1 2:f6f76dde7e1d 162 check_error(error);
takuma1 2:f6f76dde7e1d 163 print_rxconfig();
takuma1 3:a1368cd4b0a9 164 spi_error();
takuma1 3:a1368cd4b0a9 165
takuma1 3:a1368cd4b0a9 166 }
takuma1 3:a1368cd4b0a9 167
takuma1 3:a1368cd4b0a9 168
takuma1 3:a1368cd4b0a9 169 void wakeup(){ //3
takuma1 3:a1368cd4b0a9 170 int countup;
takuma1 3:a1368cd4b0a9 171 int8_t error = 0;
takuma1 3:a1368cd4b0a9 172 uint32_t conv_time = 0;
takuma1 2:f6f76dde7e1d 173
takuma1 3:a1368cd4b0a9 174
takuma1 3:a1368cd4b0a9 175 wakeup_sleep(TOTAL_IC);
takuma1 2:f6f76dde7e1d 176 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
takuma1 2:f6f76dde7e1d 177 conv_time = LTC6811_pollAdc();
takuma1 3:a1368cd4b0a9 178 // pc.printf("cell conversion completed in:");
takuma1 3:a1368cd4b0a9 179 //pc.printf("%.1f",((float)conv_time/1000));
takuma1 3:a1368cd4b0a9 180 //pc.printf("mS\n");
takuma1 3:a1368cd4b0a9 181 cell_read();
takuma1 2:f6f76dde7e1d 182 }
takuma1 2:f6f76dde7e1d 183
takuma1 2:f6f76dde7e1d 184
takuma1 2:f6f76dde7e1d 185 void spi_error(){
takuma1 2:f6f76dde7e1d 186
takuma1 2:f6f76dde7e1d 187 int8_t error = 0;
takuma1 2:f6f76dde7e1d 188 int countup;
takuma1 3:a1368cd4b0a9 189 /*
takuma1 2:f6f76dde7e1d 190 if(error = -1 ){
takuma1 3:a1368cd4b0a9 191 for(countup = 0; countup <= 2; countup++){
takuma1 3:a1368cd4b0a9 192 spi_check();
takuma1 3:a1368cd4b0a9 193 if(error =1){
takuma1 2:f6f76dde7e1d 194 break;
takuma1 3:a1368cd4b0a9 195 }
takuma1 3:a1368cd4b0a9 196 }
takuma1 2:f6f76dde7e1d 197 }
takuma1 3:a1368cd4b0a9 198 if(error = 1){
takuma1 3:a1368cd4b0a9 199 wakeup();
takuma1 2:f6f76dde7e1d 200 }
takuma1 3:a1368cd4b0a9 201 */
takuma1 3:a1368cd4b0a9 202
takuma1 3:a1368cd4b0a9 203 wakeup();
takuma1 3:a1368cd4b0a9 204
takuma1 2:f6f76dde7e1d 205
takuma1 2:f6f76dde7e1d 206 }
takuma1 3:a1368cd4b0a9 207
takuma1 3:a1368cd4b0a9 208 void cell_read(){ //4 電圧読み取り
APS_Lab 0:f06ed53310a3 209
APS_Lab 0:f06ed53310a3 210 int8_t error = 0;
APS_Lab 0:f06ed53310a3 211 uint32_t conv_time = 0;
APS_Lab 0:f06ed53310a3 212 int8_t readIC=0;
takuma1 2:f6f76dde7e1d 213
takuma1 3:a1368cd4b0a9 214 wakeup_sleep(TOTAL_IC);
takuma1 3:a1368cd4b0a9 215 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 216 check_error(error);
takuma1 3:a1368cd4b0a9 217 //print_cells(DATALOG_DISABLED);
takuma1 3:a1368cd4b0a9 218 print_CAN(DATALOG_DISABLED);
takuma1 3:a1368cd4b0a9 219
takuma1 3:a1368cd4b0a9 220 ic_check();
takuma1 3:a1368cd4b0a9 221 }
takuma1 3:a1368cd4b0a9 222
takuma1 3:a1368cd4b0a9 223
APS_Lab 0:f06ed53310a3 224
takuma1 3:a1368cd4b0a9 225
takuma1 3:a1368cd4b0a9 226 void print_CAN(uint8_t datalog_en){
takuma1 3:a1368cd4b0a9 227
takuma1 3:a1368cd4b0a9 228 short n =0;
takuma1 3:a1368cd4b0a9 229 long BAT_SUM = 0;
takuma1 3:a1368cd4b0a9 230 unsigned short BAT_MIN = 55000;
takuma1 3:a1368cd4b0a9 231 //unsigned short BTA_MAX = 0;
takuma1 3:a1368cd4b0a9 232
takuma1 3:a1368cd4b0a9 233 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
takuma1 3:a1368cd4b0a9 234
takuma1 3:a1368cd4b0a9 235 //if (datalog_en == 0) {
takuma1 3:a1368cd4b0a9 236 pc.printf("IC%d, ", current_ic+1);
takuma1 3:a1368cd4b0a9 237 //for(n = 0; n <= 12; n++){
takuma1 3:a1368cd4b0a9 238 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 3:a1368cd4b0a9 239
takuma1 3:a1368cd4b0a9 240 BAT_CELL[n] = bms_ic[current_ic].cells.c_codes[i];
takuma1 3:a1368cd4b0a9 241
takuma1 3:a1368cd4b0a9 242
takuma1 3:a1368cd4b0a9 243 pc.printf("C%d:", i+1);
takuma1 3:a1368cd4b0a9 244 pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 3:a1368cd4b0a9 245 BAT_SUM = bms_ic[current_ic].cells.c_codes[i] + BAT_SUM;
takuma1 3:a1368cd4b0a9 246
takuma1 3:a1368cd4b0a9 247 if(bms_ic[current_ic].cells.c_codes[i] > 10000){
takuma1 3:a1368cd4b0a9 248 if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
takuma1 3:a1368cd4b0a9 249 BAT_MIN = bms_ic[current_ic].cells.c_codes[i];
takuma1 3:a1368cd4b0a9 250 }
takuma1 3:a1368cd4b0a9 251 }
takuma1 3:a1368cd4b0a9 252 //unsigned short BTA_MAX = 0;
takuma1 3:a1368cd4b0a9 253 if( bms_ic[current_ic].cells.c_codes[i] > BAT_MAX){
takuma1 3:a1368cd4b0a9 254 BAT_MAX = bms_ic[current_ic].cells.c_codes[i];
takuma1 3:a1368cd4b0a9 255 }
takuma1 3:a1368cd4b0a9 256
takuma1 3:a1368cd4b0a9 257
takuma1 3:a1368cd4b0a9 258
takuma1 3:a1368cd4b0a9 259
takuma1 3:a1368cd4b0a9 260
takuma1 3:a1368cd4b0a9 261 // BAT_SUM = BAT_CELL[n] + BAT_SUM;
takuma1 3:a1368cd4b0a9 262 // if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
takuma1 3:a1368cd4b0a9 263 // BAT_MIN = BAT_CELL[n];
takuma1 3:a1368cd4b0a9 264 // }
APS_Lab 0:f06ed53310a3 265 }
takuma1 3:a1368cd4b0a9 266
takuma1 3:a1368cd4b0a9 267
takuma1 3:a1368cd4b0a9 268
takuma1 3:a1368cd4b0a9 269
takuma1 3:a1368cd4b0a9 270
takuma1 3:a1368cd4b0a9 271 //BAT_CELL[n] = bms_ic[current_ic].cells.c_codes[i]*0.0001;
takuma1 3:a1368cd4b0a9 272 // BAT_CELL[n] = BAT_CELL[n]*0.0001;
takuma1 3:a1368cd4b0a9 273 // pc.printf("C%d:", i+1);
takuma1 3:a1368cd4b0a9 274 // pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]);
takuma1 3:a1368cd4b0a9 275 // pc.printf("%d, ",BAT_CELL[n]);
takuma1 3:a1368cd4b0a9 276 //}
takuma1 3:a1368cd4b0a9 277 // }
takuma1 2:f6f76dde7e1d 278
takuma1 3:a1368cd4b0a9 279 // else {
takuma1 3:a1368cd4b0a9 280 // pc.printf("Cells, ");
takuma1 3:a1368cd4b0a9 281 // for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 3:a1368cd4b0a9 282 // pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 3:a1368cd4b0a9 283
takuma1 3:a1368cd4b0a9 284 //}
takuma1 3:a1368cd4b0a9 285 // }
takuma1 2:f6f76dde7e1d 286 }
takuma1 3:a1368cd4b0a9 287
takuma1 3:a1368cd4b0a9 288 //print_math();
takuma1 3:a1368cd4b0a9 289 pc.printf("\n");
takuma1 3:a1368cd4b0a9 290 pc.printf("SUM");
takuma1 3:a1368cd4b0a9 291 pc.printf("%f, ",BAT_SUM*0.0001);
takuma1 3:a1368cd4b0a9 292 BAT_AVG = BAT_SUM / 20;
takuma1 3:a1368cd4b0a9 293 pc.printf("AVG");
takuma1 3:a1368cd4b0a9 294 pc.printf("%.4f, ",BAT_AVG*0.0001);
takuma1 3:a1368cd4b0a9 295 pc.printf("MIN");
takuma1 3:a1368cd4b0a9 296 pc.printf("%.4f, ",BAT_MIN*0.0001);
takuma1 3:a1368cd4b0a9 297 pc.printf("MAX");
takuma1 3:a1368cd4b0a9 298 pc.printf("%.4f, ",BAT_MAX*0.0001);
takuma1 3:a1368cd4b0a9 299 pc.printf("\n");
takuma1 3:a1368cd4b0a9 300 pc.printf("\n");
takuma1 3:a1368cd4b0a9 301
takuma1 3:a1368cd4b0a9 302 }
takuma1 2:f6f76dde7e1d 303
APS_Lab 0:f06ed53310a3 304
APS_Lab 0:f06ed53310a3 305 void measurement_loop(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 306 {
APS_Lab 0:f06ed53310a3 307 int8_t error = 0;
APS_Lab 0:f06ed53310a3 308 if (WRITE_CONFIG == ENABLED) {
APS_Lab 0:f06ed53310a3 309 wakeup_sleep(TOTAL_IC);
APS_Lab 0:f06ed53310a3 310 LTC6811_wrcfg(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 311 print_config();
APS_Lab 0:f06ed53310a3 312 }
APS_Lab 0:f06ed53310a3 313
APS_Lab 0:f06ed53310a3 314 if (READ_CONFIG == ENABLED) {
APS_Lab 0:f06ed53310a3 315 wakeup_sleep(TOTAL_IC);
APS_Lab 0:f06ed53310a3 316 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 317 check_error(error);
APS_Lab 0:f06ed53310a3 318 print_rxconfig();
APS_Lab 0:f06ed53310a3 319 }
APS_Lab 0:f06ed53310a3 320
APS_Lab 0:f06ed53310a3 321 if (MEASURE_CELL == ENABLED) {
APS_Lab 0:f06ed53310a3 322 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 323 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
APS_Lab 0:f06ed53310a3 324 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 325 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 326 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 327 check_error(error);
APS_Lab 0:f06ed53310a3 328 print_cells(datalog_en);
APS_Lab 0:f06ed53310a3 329
APS_Lab 0:f06ed53310a3 330 }
APS_Lab 0:f06ed53310a3 331
APS_Lab 0:f06ed53310a3 332 if (MEASURE_AUX == ENABLED) {
APS_Lab 0:f06ed53310a3 333 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 334 LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_ALL);
APS_Lab 0:f06ed53310a3 335 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 336 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 337 error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
APS_Lab 0:f06ed53310a3 338 check_error(error);
APS_Lab 0:f06ed53310a3 339 print_aux(datalog_en);
APS_Lab 0:f06ed53310a3 340 }
APS_Lab 0:f06ed53310a3 341
APS_Lab 0:f06ed53310a3 342 if (MEASURE_STAT == ENABLED) {
APS_Lab 0:f06ed53310a3 343 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 344 LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL);
APS_Lab 0:f06ed53310a3 345 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 346 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 347 error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
APS_Lab 0:f06ed53310a3 348 check_error(error);
APS_Lab 0:f06ed53310a3 349 print_stat();
APS_Lab 0:f06ed53310a3 350 }
APS_Lab 0:f06ed53310a3 351
APS_Lab 0:f06ed53310a3 352 if (PRINT_PEC == ENABLED) {
APS_Lab 0:f06ed53310a3 353 print_pec();
APS_Lab 0:f06ed53310a3 354 }
APS_Lab 0:f06ed53310a3 355
APS_Lab 0:f06ed53310a3 356 }
APS_Lab 0:f06ed53310a3 357
takuma1 2:f6f76dde7e1d 358 /*
APS_Lab 0:f06ed53310a3 359 void print_menu()
APS_Lab 0:f06ed53310a3 360 {
APS_Lab 0:f06ed53310a3 361 pc.printf("Please enter LTC6811 Command\n");
APS_Lab 0:f06ed53310a3 362 pc.printf("Write Configuration: 1 | Reset PEC Counter: 11\n");
APS_Lab 0:f06ed53310a3 363 pc.printf("Read Configuration: 2 | Run ADC Self Test: 12\n");
APS_Lab 0:f06ed53310a3 364 pc.printf("Start Cell Voltage Conversion: 3 | Set Discharge: 13\n");
APS_Lab 0:f06ed53310a3 365 pc.printf("Read Cell Voltages: 4 | Clear Discharge: 14\n");
APS_Lab 0:f06ed53310a3 366 pc.printf("Start Aux Voltage Conversion: 5 | Clear Registers: 15\n");
APS_Lab 0:f06ed53310a3 367 pc.printf("Read Aux Voltages: 6 | Run Mux Self Test: 16\n");
APS_Lab 0:f06ed53310a3 368 pc.printf("Start Stat Voltage Conversion: 7 | Run ADC overlap Test: 17\n");
APS_Lab 0:f06ed53310a3 369 pc.printf("Read Stat Voltages: 8 | Run Digital Redundancy Test: 18\n");
APS_Lab 0:f06ed53310a3 370 pc.printf("loop Measurements: 9 | Run Open Wire Test: 19\n");
APS_Lab 0:f06ed53310a3 371 pc.printf("Read PEC Errors: 10 | Loop measurements with datalog output: 20\n");
APS_Lab 0:f06ed53310a3 372 pc.printf("\n");
APS_Lab 0:f06ed53310a3 373 pc.printf("Please enter command:\n");
APS_Lab 0:f06ed53310a3 374 pc.printf("\n");
APS_Lab 0:f06ed53310a3 375 }
takuma1 2:f6f76dde7e1d 376 */
takuma1 3:a1368cd4b0a9 377
APS_Lab 0:f06ed53310a3 378 void print_cells(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 379 {
APS_Lab 0:f06ed53310a3 380 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 381
APS_Lab 0:f06ed53310a3 382 if (datalog_en == 0) {
APS_Lab 0:f06ed53310a3 383 pc.printf("IC%d, ", current_ic+1);
takuma1 3:a1368cd4b0a9 384 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
APS_Lab 0:f06ed53310a3 385 pc.printf("C%d:", i+1);
APS_Lab 0:f06ed53310a3 386 pc.printf("%.4f, ", bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 3:a1368cd4b0a9 387 }
takuma1 3:a1368cd4b0a9 388
APS_Lab 0:f06ed53310a3 389 pc.printf("\n");
takuma1 3:a1368cd4b0a9 390 }
takuma1 3:a1368cd4b0a9 391
takuma1 3:a1368cd4b0a9 392 else {
APS_Lab 0:f06ed53310a3 393 pc.printf("Cells, ");
APS_Lab 0:f06ed53310a3 394 for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 3:a1368cd4b0a9 395 pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 3:a1368cd4b0a9 396
APS_Lab 0:f06ed53310a3 397 }
APS_Lab 0:f06ed53310a3 398 }
takuma1 3:a1368cd4b0a9 399
APS_Lab 0:f06ed53310a3 400 }
APS_Lab 0:f06ed53310a3 401 pc.printf("\n");
APS_Lab 0:f06ed53310a3 402 }
APS_Lab 0:f06ed53310a3 403
APS_Lab 0:f06ed53310a3 404 /*!****************************************************************************
APS_Lab 0:f06ed53310a3 405 \brief Prints Open wire test results to the serial port
APS_Lab 0:f06ed53310a3 406 *****************************************************************************/
APS_Lab 0:f06ed53310a3 407 void print_open()
APS_Lab 0:f06ed53310a3 408 {
APS_Lab 0:f06ed53310a3 409 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 410 if (bms_ic[current_ic].system_open_wire == 0) {
APS_Lab 0:f06ed53310a3 411 pc.printf("No Opens Detected on IC%d\n", current_ic+1);
APS_Lab 0:f06ed53310a3 412 } else {
APS_Lab 0:f06ed53310a3 413 for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++) {
APS_Lab 0:f06ed53310a3 414 if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0) {
APS_Lab 0:f06ed53310a3 415 pc.printf("There is an open wire on IC%d Channel: %d\n", current_ic + 1, cell);
APS_Lab 0:f06ed53310a3 416 }
APS_Lab 0:f06ed53310a3 417 }
APS_Lab 0:f06ed53310a3 418 }
APS_Lab 0:f06ed53310a3 419 }
APS_Lab 0:f06ed53310a3 420 }
APS_Lab 0:f06ed53310a3 421
APS_Lab 0:f06ed53310a3 422 /*!****************************************************************************
APS_Lab 0:f06ed53310a3 423 \brief Prints GPIO voltage codes and Vref2 voltage code onto the serial port
APS_Lab 0:f06ed53310a3 424 *****************************************************************************/
APS_Lab 0:f06ed53310a3 425 void print_aux(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 426 {
APS_Lab 0:f06ed53310a3 427
APS_Lab 0:f06ed53310a3 428 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 429 if (datalog_en == 0) {
APS_Lab 0:f06ed53310a3 430 pc.printf(" IC%d", current_ic+1);
APS_Lab 0:f06ed53310a3 431 for (int i=0; i < 5; i++) {
APS_Lab 0:f06ed53310a3 432 pc.printf(" GPIO-%d:%.4f,", i+1, bms_ic[current_ic].aux.a_codes[i]*0.0001);
APS_Lab 0:f06ed53310a3 433 }
APS_Lab 0:f06ed53310a3 434 pc.printf("Vref2:%.4f\n", bms_ic[current_ic].aux.a_codes[5]*0.0001);
APS_Lab 0:f06ed53310a3 435 } else {
APS_Lab 0:f06ed53310a3 436 pc.printf("AUX, ");
APS_Lab 0:f06ed53310a3 437 for (int i=0; i < 6; i++) {
APS_Lab 0:f06ed53310a3 438 pc.printf("%.4f,", bms_ic[current_ic].aux.a_codes[i]*0.0001);
APS_Lab 0:f06ed53310a3 439 }
APS_Lab 0:f06ed53310a3 440 }
APS_Lab 0:f06ed53310a3 441 }
APS_Lab 0:f06ed53310a3 442 pc.printf("\n");
APS_Lab 0:f06ed53310a3 443 }
APS_Lab 0:f06ed53310a3 444
APS_Lab 0:f06ed53310a3 445 /*!****************************************************************************
APS_Lab 0:f06ed53310a3 446 \brief Prints Status voltage codes and Vref2 voltage code onto the serial port
APS_Lab 0:f06ed53310a3 447 *****************************************************************************/
APS_Lab 0:f06ed53310a3 448 void print_stat()
APS_Lab 0:f06ed53310a3 449 {
APS_Lab 0:f06ed53310a3 450
APS_Lab 0:f06ed53310a3 451 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 452 pc.printf("IC%d", current_ic+1);
APS_Lab 0:f06ed53310a3 453 pc.printf(" SOC:%.4f,", bms_ic[current_ic].stat.stat_codes[0]*0.0001*20);
APS_Lab 0:f06ed53310a3 454 pc.printf(" Itemp:%.4f,", bms_ic[current_ic].stat.stat_codes[1]*0.0001);
APS_Lab 0:f06ed53310a3 455 pc.printf(" VregA:%.4f,", bms_ic[current_ic].stat.stat_codes[2]*0.0001);
APS_Lab 0:f06ed53310a3 456 pc.printf(" VregD:%.4f\n", bms_ic[current_ic].stat.stat_codes[3]*0.0001);
APS_Lab 0:f06ed53310a3 457 }
APS_Lab 0:f06ed53310a3 458
APS_Lab 0:f06ed53310a3 459 pc.printf("\n");
APS_Lab 0:f06ed53310a3 460 }
APS_Lab 0:f06ed53310a3 461
APS_Lab 0:f06ed53310a3 462 /*!******************************************************************************
APS_Lab 0:f06ed53310a3 463 \brief Prints the configuration data that is going to be written to the LTC6811
APS_Lab 0:f06ed53310a3 464 to the serial port.
APS_Lab 0:f06ed53310a3 465 ********************************************************************************/
APS_Lab 0:f06ed53310a3 466 void print_config()
APS_Lab 0:f06ed53310a3 467 {
APS_Lab 0:f06ed53310a3 468 int cfg_pec;
APS_Lab 0:f06ed53310a3 469
takuma1 3:a1368cd4b0a9 470 //pc.printf("Written Configuration: \n");
APS_Lab 0:f06ed53310a3 471 for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
takuma1 3:a1368cd4b0a9 472 //pc.printf(" IC ");
takuma1 3:a1368cd4b0a9 473 //pc.printf("%d", current_ic+1);
takuma1 3:a1368cd4b0a9 474 // pc.printf(": ");
takuma1 3:a1368cd4b0a9 475 //pc.printf("0x");
APS_Lab 0:f06ed53310a3 476 serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
takuma1 3:a1368cd4b0a9 477 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 478 serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
takuma1 3:a1368cd4b0a9 479 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 480 serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
takuma1 3:a1368cd4b0a9 481 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 482 serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
takuma1 3:a1368cd4b0a9 483 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 484 serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
takuma1 3:a1368cd4b0a9 485 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 486 serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
takuma1 3:a1368cd4b0a9 487 //pc.printf(", Calculated PEC: 0x");
APS_Lab 0:f06ed53310a3 488 cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
APS_Lab 0:f06ed53310a3 489 serial_print_hex((uint8_t)(cfg_pec>>8));
takuma1 3:a1368cd4b0a9 490 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 491 serial_print_hex((uint8_t)(cfg_pec));
takuma1 3:a1368cd4b0a9 492 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 493 }
takuma1 3:a1368cd4b0a9 494 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 495 }
APS_Lab 0:f06ed53310a3 496
APS_Lab 0:f06ed53310a3 497 /*!*****************************************************************
APS_Lab 0:f06ed53310a3 498 \brief Prints the configuration data that was read back from the
APS_Lab 0:f06ed53310a3 499 LTC6811 to the serial port.
APS_Lab 0:f06ed53310a3 500 *******************************************************************/
APS_Lab 0:f06ed53310a3 501 void print_rxconfig()
APS_Lab 0:f06ed53310a3 502 {
takuma1 3:a1368cd4b0a9 503 //pc.printf("Received Configuration ");
APS_Lab 0:f06ed53310a3 504 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
takuma1 3:a1368cd4b0a9 505 // pc.printf(" IC ");
takuma1 3:a1368cd4b0a9 506 // pc.printf("%d", current_ic+1);
takuma1 3:a1368cd4b0a9 507 //pc.printf(": 0x");
APS_Lab 0:f06ed53310a3 508 serial_print_hex(bms_ic[current_ic].config.rx_data[0]);
takuma1 3:a1368cd4b0a9 509 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 510 serial_print_hex(bms_ic[current_ic].config.rx_data[1]);
takuma1 3:a1368cd4b0a9 511 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 512 serial_print_hex(bms_ic[current_ic].config.rx_data[2]);
takuma1 3:a1368cd4b0a9 513 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 514 serial_print_hex(bms_ic[current_ic].config.rx_data[3]);
takuma1 3:a1368cd4b0a9 515 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 516 serial_print_hex(bms_ic[current_ic].config.rx_data[4]);
takuma1 3:a1368cd4b0a9 517 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 518 serial_print_hex(bms_ic[current_ic].config.rx_data[5]);
takuma1 3:a1368cd4b0a9 519 //pc.printf(", Received PEC: 0x");
APS_Lab 0:f06ed53310a3 520 serial_print_hex(bms_ic[current_ic].config.rx_data[6]);
takuma1 3:a1368cd4b0a9 521 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 522 serial_print_hex(bms_ic[current_ic].config.rx_data[7]);
takuma1 3:a1368cd4b0a9 523 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 524 }
APS_Lab 0:f06ed53310a3 525 pc.printf("\n");
APS_Lab 0:f06ed53310a3 526 }
APS_Lab 0:f06ed53310a3 527
APS_Lab 0:f06ed53310a3 528 void print_pec()
APS_Lab 0:f06ed53310a3 529 {
APS_Lab 0:f06ed53310a3 530 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 531 pc.printf("\n%d", bms_ic[current_ic].crc_count.pec_count);
APS_Lab 0:f06ed53310a3 532 pc.printf(" : PEC Errors Detected on IC");
APS_Lab 0:f06ed53310a3 533 pc.printf("%d\n", current_ic+1);
APS_Lab 0:f06ed53310a3 534 }
APS_Lab 0:f06ed53310a3 535 }
APS_Lab 0:f06ed53310a3 536
APS_Lab 0:f06ed53310a3 537
APS_Lab 0:f06ed53310a3 538 void serial_print_hex(uint8_t data)
APS_Lab 0:f06ed53310a3 539 {
takuma1 3:a1368cd4b0a9 540 /*
APS_Lab 0:f06ed53310a3 541 if (data < 16) {
takuma1 3:a1368cd4b0a9 542 //pc.printf("0x0%X", data);
APS_Lab 0:f06ed53310a3 543 } else
takuma1 3:a1368cd4b0a9 544 pc.printf("0x%X", data);
takuma1 3:a1368cd4b0a9 545 */
APS_Lab 0:f06ed53310a3 546 }
APS_Lab 0:f06ed53310a3 547
APS_Lab 0:f06ed53310a3 548 //Function to check error flag and print PEC error message
APS_Lab 0:f06ed53310a3 549 void check_error(int error)
APS_Lab 0:f06ed53310a3 550 {
APS_Lab 0:f06ed53310a3 551 if (error == -1) {
APS_Lab 0:f06ed53310a3 552 pc.printf("A PEC error was detected in the received data");
APS_Lab 0:f06ed53310a3 553 }
APS_Lab 0:f06ed53310a3 554 }
APS_Lab 0:f06ed53310a3 555
APS_Lab 0:f06ed53310a3 556
APS_Lab 0:f06ed53310a3 557 // hex conversion constants
APS_Lab 0:f06ed53310a3 558 char hex_digits[16]= {
APS_Lab 0:f06ed53310a3 559 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
APS_Lab 0:f06ed53310a3 560 };
APS_Lab 0:f06ed53310a3 561
APS_Lab 0:f06ed53310a3 562 // global variables
APS_Lab 0:f06ed53310a3 563
APS_Lab 0:f06ed53310a3 564 char hex_to_byte_buffer[5]= {
APS_Lab 0:f06ed53310a3 565 '0', 'x', '0', '0', '\0'
APS_Lab 0:f06ed53310a3 566 }; // buffer for ASCII hex to byte conversion
APS_Lab 0:f06ed53310a3 567 char byte_to_hex_buffer[3]= {
APS_Lab 0:f06ed53310a3 568 '\0','\0','\0'
APS_Lab 0:f06ed53310a3 569 };
APS_Lab 0:f06ed53310a3 570
takuma1 2:f6f76dde7e1d 571 // シリアル インターフェイスから ui_バッファへのデータの読み取り
APS_Lab 0:f06ed53310a3 572 uint8_t read_data()
APS_Lab 0:f06ed53310a3 573 {
takuma1 2:f6f76dde7e1d 574 uint8_t index = 0; // 内の現在の場所を保持するインデックス
takuma1 2:f6f76dde7e1d 575 int c; // 着信キーストロークの格納に使用される単一の文字
APS_Lab 0:f06ed53310a3 576 //pc.printf("check 1\n");
APS_Lab 0:f06ed53310a3 577 while (index < UI_BUFFER_SIZE-1) {
APS_Lab 0:f06ed53310a3 578 //pc.printf("check 2\n");
APS_Lab 0:f06ed53310a3 579 c = pc.getc(); //read one character
APS_Lab 0:f06ed53310a3 580 //return c;
APS_Lab 0:f06ed53310a3 581 //pc.printf("check 3\n");
APS_Lab 0:f06ed53310a3 582
takuma1 2:f6f76dde7e1d 583 if (((char) c == '\r') || ((char) c == '\n')) break; // キャリッジ リターンまたはラインフィードの場合は、データを停止して返します。
APS_Lab 0:f06ed53310a3 584 if ( ((char) c == '\x7F') || ((char) c == '\x08') ) { // remove previous character (decrement index) if Backspace/Delete key pressed index--;
APS_Lab 0:f06ed53310a3 585 if (index > 0) index--;
APS_Lab 0:f06ed53310a3 586 } else if (c >= 0) {
APS_Lab 0:f06ed53310a3 587 ui_buffer[index++]=(char) c; // put character into ui_buffer
APS_Lab 0:f06ed53310a3 588 }
APS_Lab 0:f06ed53310a3 589 //pc.printf("check 4\n");
APS_Lab 0:f06ed53310a3 590
APS_Lab 0:f06ed53310a3 591 }
APS_Lab 0:f06ed53310a3 592 ui_buffer[index]='\0'; // terminate string with NULL
APS_Lab 0:f06ed53310a3 593
APS_Lab 0:f06ed53310a3 594 if ((char) c == '\r') { // if the "last" character was a carriage return, also clear linefeed if it is next character
APS_Lab 0:f06ed53310a3 595 wait_ms(1);
APS_Lab 0:f06ed53310a3 596 //pc.printf("check 5\n");
APS_Lab 0:f06ed53310a3 597
APS_Lab 0:f06ed53310a3 598 if (pc.readable()==1) {
APS_Lab 0:f06ed53310a3 599 //pc.printf("check 6\n");
APS_Lab 0:f06ed53310a3 600 pc.getc(); // if linefeed appears, read it and throw it away
APS_Lab 0:f06ed53310a3 601 }
APS_Lab 0:f06ed53310a3 602 //pc.printf("check 7\n");
APS_Lab 0:f06ed53310a3 603
APS_Lab 0:f06ed53310a3 604 }
APS_Lab 0:f06ed53310a3 605 //pc.printf("check 8\n");
APS_Lab 0:f06ed53310a3 606
APS_Lab 0:f06ed53310a3 607 return index; // return number of characters, not including null terminator
APS_Lab 0:f06ed53310a3 608 }
APS_Lab 0:f06ed53310a3 609
APS_Lab 0:f06ed53310a3 610 // Read a float value from the serial interface
APS_Lab 0:f06ed53310a3 611 float read_float()
APS_Lab 0:f06ed53310a3 612 {
APS_Lab 0:f06ed53310a3 613 float data;
APS_Lab 0:f06ed53310a3 614 read_data();
APS_Lab 0:f06ed53310a3 615 data = atof(ui_buffer);
APS_Lab 0:f06ed53310a3 616 return(data);
APS_Lab 0:f06ed53310a3 617 }
APS_Lab 0:f06ed53310a3 618
APS_Lab 0:f06ed53310a3 619 // Read an integer from the serial interface.
APS_Lab 0:f06ed53310a3 620 // The routine can recognize Hex, Decimal, Octal, or Binary
APS_Lab 0:f06ed53310a3 621 // Example:
APS_Lab 0:f06ed53310a3 622 // Hex: 0x11 (0x prefix)
APS_Lab 0:f06ed53310a3 623 // Decimal: 17
APS_Lab 0:f06ed53310a3 624 // Octal: 021 (leading zero prefix)
APS_Lab 0:f06ed53310a3 625 // Binary: B10001 (leading B prefix)
APS_Lab 0:f06ed53310a3 626 int32_t read_int()
APS_Lab 0:f06ed53310a3 627 {
APS_Lab 0:f06ed53310a3 628 int32_t data;
APS_Lab 0:f06ed53310a3 629 read_data();
APS_Lab 0:f06ed53310a3 630 if (ui_buffer[0] == 'm')
APS_Lab 0:f06ed53310a3 631 return('m');
APS_Lab 0:f06ed53310a3 632 if ((ui_buffer[0] == 'B') || (ui_buffer[0] == 'b')) {
APS_Lab 0:f06ed53310a3 633 data = strtol(ui_buffer+1, NULL, 2);
APS_Lab 0:f06ed53310a3 634 } else
APS_Lab 0:f06ed53310a3 635 data = strtol(ui_buffer, NULL, 0);
APS_Lab 0:f06ed53310a3 636 return(data);
APS_Lab 0:f06ed53310a3 637 }
APS_Lab 0:f06ed53310a3 638
APS_Lab 0:f06ed53310a3 639 // Read a string from the serial interface. Returns a pointer to the ui_buffer.
APS_Lab 0:f06ed53310a3 640 char *read_string()
APS_Lab 0:f06ed53310a3 641 {
APS_Lab 0:f06ed53310a3 642 read_data();
APS_Lab 0:f06ed53310a3 643 return(ui_buffer);
APS_Lab 0:f06ed53310a3 644 }
APS_Lab 0:f06ed53310a3 645
APS_Lab 0:f06ed53310a3 646 // Read a character from the serial interface
APS_Lab 0:f06ed53310a3 647 int8_t read_char()
APS_Lab 0:f06ed53310a3 648 {
APS_Lab 0:f06ed53310a3 649 read_data();
APS_Lab 0:f06ed53310a3 650 return(ui_buffer[0]);
APS_Lab 0:f06ed53310a3 651 }