BMS_T2

Dependencies:   INA226

Committer:
takuma1
Date:
Tue Oct 13 06:26:34 2020 +0000
Revision:
2:3bbbe439ec11
Parent:
0:f06ed53310a3
Child:
3:61174d4de67d
BMS_NO_CAN;

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"
takuma1 2:3bbbe439ec11 6 #include "CAN.h"
takuma1 2:3bbbe439ec11 7 #include "INA226.hpp"
takuma1 2:3bbbe439ec11 8 #include "max6675.h"
takuma1 2:3bbbe439ec11 9 #include "max6675_2.h"
takuma1 2:3bbbe439ec11 10
APS_Lab 0:f06ed53310a3 11
APS_Lab 0:f06ed53310a3 12 #define UI_BUFFER_SIZE 64
APS_Lab 0:f06ed53310a3 13 #define SERIAL_TERMINATOR '\n'
APS_Lab 0:f06ed53310a3 14
APS_Lab 0:f06ed53310a3 15 #define ENABLED 1
APS_Lab 0:f06ed53310a3 16 #define DISABLED 0
APS_Lab 0:f06ed53310a3 17
APS_Lab 0:f06ed53310a3 18 #define DATALOG_ENABLED 1
APS_Lab 0:f06ed53310a3 19 #define DATALOG_DISABLED 0
takuma1 2:3bbbe439ec11 20
takuma1 2:3bbbe439ec11 21
takuma1 2:3bbbe439ec11 22
APS_Lab 0:f06ed53310a3 23 DigitalOut led1(LED1);
APS_Lab 0:f06ed53310a3 24 Serial pc(USBTX, USBRX);
takuma1 2:3bbbe439ec11 25 CAN can1(p9,p10);
takuma1 2:3bbbe439ec11 26 CAN can2(p30,p29);
takuma1 2:3bbbe439ec11 27 I2C i2c(p28,p27);
takuma1 2:3bbbe439ec11 28 DigitalOut BAT_MIN_safty(p21);
takuma1 2:3bbbe439ec11 29 DigitalOut BAT_MAX_safty(p22);
takuma1 2:3bbbe439ec11 30 INA226 VCmonitor(i2c);
takuma1 2:3bbbe439ec11 31 SPI spi(p11,p12,p13);
takuma1 2:3bbbe439ec11 32 max6675 max(spi,p18);
takuma1 2:3bbbe439ec11 33 SPI spi_2(p11,p12,p13);
takuma1 2:3bbbe439ec11 34 max6675_2 max_2(spi_2,p21);
takuma1 2:3bbbe439ec11 35
APS_Lab 0:f06ed53310a3 36
APS_Lab 0:f06ed53310a3 37 void run_command(uint32_t cmd);
APS_Lab 0:f06ed53310a3 38 void measurement_loop(uint8_t datalog_en);
takuma1 2:3bbbe439ec11 39 //void print_menu();
APS_Lab 0:f06ed53310a3 40 void print_cells(uint8_t datalog_en);
APS_Lab 0:f06ed53310a3 41 void print_open();
APS_Lab 0:f06ed53310a3 42 void print_aux(uint8_t datalog_en);
APS_Lab 0:f06ed53310a3 43 void print_stat();
APS_Lab 0:f06ed53310a3 44 void print_config();
APS_Lab 0:f06ed53310a3 45 void print_rxconfig();
APS_Lab 0:f06ed53310a3 46 void print_pec(void);
APS_Lab 0:f06ed53310a3 47 void serial_print_hex(uint8_t data);
APS_Lab 0:f06ed53310a3 48 void check_error(int error);
takuma1 2:3bbbe439ec11 49 void wakeup();
takuma1 2:3bbbe439ec11 50 void cell_read();
takuma1 2:3bbbe439ec11 51 void spi_error();
takuma1 2:3bbbe439ec11 52 void ic_check();
takuma1 2:3bbbe439ec11 53 void spi_check();
takuma1 2:3bbbe439ec11 54 void print_CAN(uint8_t datalog_en);
takuma1 2:3bbbe439ec11 55 void print_math();
takuma1 2:3bbbe439ec11 56 void can_sent1();
takuma1 2:3bbbe439ec11 57 void can_sent2();
takuma1 2:3bbbe439ec11 58 void can_sent3();
takuma1 2:3bbbe439ec11 59 void can_sent4();
takuma1 2:3bbbe439ec11 60 //void can_set();
takuma1 2:3bbbe439ec11 61 void can_wait();
takuma1 2:3bbbe439ec11 62 void ic_set();
takuma1 2:3bbbe439ec11 63
takuma1 2:3bbbe439ec11 64
APS_Lab 0:f06ed53310a3 65 //char get_char();
APS_Lab 0:f06ed53310a3 66 //void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
APS_Lab 0:f06ed53310a3 67
takuma1 2:3bbbe439ec11 68 const uint8_t TOTAL_IC = 3;//!<number of ICs in the daisy chain
APS_Lab 0:f06ed53310a3 69 char ui_buffer[UI_BUFFER_SIZE];
APS_Lab 0:f06ed53310a3 70
APS_Lab 0:f06ed53310a3 71
APS_Lab 0:f06ed53310a3 72 //ADC Command Configurations
APS_Lab 0:f06ed53310a3 73 //const uint8_t ADC_OPT = ADC_OPT_DISABLED; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 74 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 75 const uint8_t ADC_DCP = DCP_DISABLED; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 76 const uint8_t CELL_CH_TO_CONVERT = CELL_CH_ALL; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 77 const uint8_t AUX_CH_TO_CONVERT = AUX_CH_ALL; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 78 const uint8_t STAT_CH_TO_CONVERT = STAT_CH_ALL; // See LTC6811_daisy.h for Options
APS_Lab 0:f06ed53310a3 79
takuma1 2:3bbbe439ec11 80 const uint16_t MEASUREMENT_LOOP_TIME = 100;//milliseconds(mS)
APS_Lab 0:f06ed53310a3 81
APS_Lab 0:f06ed53310a3 82 //Under Voltage and Over Voltage Thresholds
takuma1 2:3bbbe439ec11 83 const uint16_t OV_THRESHOLD = 41000; //
takuma1 2:3bbbe439ec11 84 const uint16_t UV_THRESHOLD = 30000; //
APS_Lab 0:f06ed53310a3 85
APS_Lab 0:f06ed53310a3 86 //Loop Measurement Setup These Variables are ENABLED or DISABLED Remember ALL CAPS
APS_Lab 0:f06ed53310a3 87 const uint8_t WRITE_CONFIG = DISABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 88 const uint8_t READ_CONFIG = DISABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 89 const uint8_t MEASURE_CELL = ENABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 90 const uint8_t MEASURE_AUX = DISABLED; // This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 91 const uint8_t MEASURE_STAT = DISABLED; //This is ENABLED or DISABLED
APS_Lab 0:f06ed53310a3 92 const uint8_t PRINT_PEC = DISABLED; //This is ENABLED or DISABLED
takuma1 2:3bbbe439ec11 93 short n =0;
APS_Lab 0:f06ed53310a3 94
APS_Lab 0:f06ed53310a3 95 uint8_t read_data();
APS_Lab 0:f06ed53310a3 96
APS_Lab 0:f06ed53310a3 97 float read_float();
APS_Lab 0:f06ed53310a3 98
takuma1 2:3bbbe439ec11 99
APS_Lab 0:f06ed53310a3 100 int32_t read_int();
APS_Lab 0:f06ed53310a3 101
takuma1 2:3bbbe439ec11 102 int BAT_MIN, BAT_MAX, BAT_AVG;
takuma1 2:3bbbe439ec11 103 double BAT_Current;
takuma1 2:3bbbe439ec11 104 long BAT_SUM;
takuma1 2:3bbbe439ec11 105 unsigned short BAT_CELL[27];
APS_Lab 0:f06ed53310a3 106
takuma1 2:3bbbe439ec11 107 char *read_string();
takuma1 2:3bbbe439ec11 108 int8_t read_char();
APS_Lab 0:f06ed53310a3 109
APS_Lab 0:f06ed53310a3 110 cell_asic bms_ic[TOTAL_IC];
APS_Lab 0:f06ed53310a3 111
APS_Lab 0:f06ed53310a3 112 int main(void)
APS_Lab 0:f06ed53310a3 113 {
APS_Lab 0:f06ed53310a3 114 uint32_t user_command;
APS_Lab 0:f06ed53310a3 115
APS_Lab 0:f06ed53310a3 116 pc.baud(115200);
takuma1 2:3bbbe439ec11 117
takuma1 2:3bbbe439ec11 118 while(1) {
takuma1 2:3bbbe439ec11 119 BAT_MIN = 0;
takuma1 2:3bbbe439ec11 120 BAT_MAX = 0; // 0にする
takuma1 2:3bbbe439ec11 121 ic_set();
takuma1 2:3bbbe439ec11 122 }
takuma1 2:3bbbe439ec11 123 }
takuma1 2:3bbbe439ec11 124
takuma1 2:3bbbe439ec11 125
takuma1 2:3bbbe439ec11 126
takuma1 2:3bbbe439ec11 127 void ic_set(){
takuma1 2:3bbbe439ec11 128
takuma1 2:3bbbe439ec11 129 //__disable_irq();
takuma1 2:3bbbe439ec11 130 ic_check();
takuma1 2:3bbbe439ec11 131 spi_check();
takuma1 2:3bbbe439ec11 132 spi_error();
takuma1 2:3bbbe439ec11 133 wakeup();
takuma1 2:3bbbe439ec11 134 cell_read();
takuma1 2:3bbbe439ec11 135
takuma1 2:3bbbe439ec11 136 }
takuma1 2:3bbbe439ec11 137
takuma1 2:3bbbe439ec11 138 void ic_check(){ //1
takuma1 2:3bbbe439ec11 139
takuma1 2:3bbbe439ec11 140 //__disable_irq();
takuma1 2:3bbbe439ec11 141 pc.baud(115200);
APS_Lab 0:f06ed53310a3 142 spi_enable();
APS_Lab 0:f06ed53310a3 143 LTC681x_init_cfg(TOTAL_IC, bms_ic);
APS_Lab 0:f06ed53310a3 144 LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 145 LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
takuma1 2:3bbbe439ec11 146 wakeup_sleep(TOTAL_IC);
takuma1 2:3bbbe439ec11 147 LTC6811_wrcfg(TOTAL_IC,bms_ic);
takuma1 2:3bbbe439ec11 148 print_config();
takuma1 2:3bbbe439ec11 149 //printf("1");
takuma1 2:3bbbe439ec11 150 //spi_check();
takuma1 2:3bbbe439ec11 151
takuma1 2:3bbbe439ec11 152 }
takuma1 2:3bbbe439ec11 153
takuma1 2:3bbbe439ec11 154 void spi_check(){ //2
APS_Lab 0:f06ed53310a3 155
takuma1 2:3bbbe439ec11 156 __disable_irq();
takuma1 2:3bbbe439ec11 157 int countup;
takuma1 2:3bbbe439ec11 158 int8_t error = 0;
takuma1 2:3bbbe439ec11 159
takuma1 2:3bbbe439ec11 160 wakeup_sleep(TOTAL_IC);
takuma1 2:3bbbe439ec11 161 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
takuma1 2:3bbbe439ec11 162 check_error(error);
takuma1 2:3bbbe439ec11 163 print_rxconfig();
takuma1 2:3bbbe439ec11 164 //printf("2");
takuma1 2:3bbbe439ec11 165 //spi_error();
takuma1 2:3bbbe439ec11 166 }
APS_Lab 0:f06ed53310a3 167
takuma1 2:3bbbe439ec11 168
takuma1 2:3bbbe439ec11 169 void wakeup(){ //3
APS_Lab 0:f06ed53310a3 170
takuma1 2:3bbbe439ec11 171 __disable_irq();
takuma1 2:3bbbe439ec11 172 int countup;
APS_Lab 0:f06ed53310a3 173 int8_t error = 0;
APS_Lab 0:f06ed53310a3 174 uint32_t conv_time = 0;
takuma1 2:3bbbe439ec11 175
takuma1 2:3bbbe439ec11 176
APS_Lab 0:f06ed53310a3 177 wakeup_sleep(TOTAL_IC);
APS_Lab 0:f06ed53310a3 178 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
APS_Lab 0:f06ed53310a3 179 conv_time = LTC6811_pollAdc();
takuma1 2:3bbbe439ec11 180 //printf("3");
takuma1 2:3bbbe439ec11 181 //cell_read();
takuma1 2:3bbbe439ec11 182 }
takuma1 2:3bbbe439ec11 183
takuma1 2:3bbbe439ec11 184
takuma1 2:3bbbe439ec11 185 void spi_error(){
takuma1 2:3bbbe439ec11 186
takuma1 2:3bbbe439ec11 187 //__disable_irq();
takuma1 2:3bbbe439ec11 188
takuma1 2:3bbbe439ec11 189 int8_t error = 0;
takuma1 2:3bbbe439ec11 190 int countup;
takuma1 2:3bbbe439ec11 191 /*
takuma1 2:3bbbe439ec11 192 if(error = -1 ){
takuma1 2:3bbbe439ec11 193 for(countup = 0; countup <= 2; countup++){
takuma1 2:3bbbe439ec11 194 spi_check();
takuma1 2:3bbbe439ec11 195 if(error =1){
takuma1 2:3bbbe439ec11 196 break;
takuma1 2:3bbbe439ec11 197 }
takuma1 2:3bbbe439ec11 198 }
takuma1 2:3bbbe439ec11 199 }
takuma1 2:3bbbe439ec11 200 if(error = 1){
takuma1 2:3bbbe439ec11 201 wakeup();
takuma1 2:3bbbe439ec11 202 }
takuma1 2:3bbbe439ec11 203 */
takuma1 2:3bbbe439ec11 204
takuma1 2:3bbbe439ec11 205 //wakeup();
takuma1 2:3bbbe439ec11 206
takuma1 2:3bbbe439ec11 207
takuma1 2:3bbbe439ec11 208 }
takuma1 2:3bbbe439ec11 209
takuma1 2:3bbbe439ec11 210 void cell_read(){ //4 電圧読み取り
APS_Lab 0:f06ed53310a3 211
takuma1 2:3bbbe439ec11 212 __disable_irq();
takuma1 2:3bbbe439ec11 213 int8_t error = 0;
takuma1 2:3bbbe439ec11 214 uint32_t conv_time = 0;
takuma1 2:3bbbe439ec11 215 int8_t readIC=0;
takuma1 2:3bbbe439ec11 216
takuma1 2:3bbbe439ec11 217 wakeup_sleep(TOTAL_IC);
takuma1 2:3bbbe439ec11 218 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
takuma1 2:3bbbe439ec11 219 check_error(error);
takuma1 2:3bbbe439ec11 220 //print_cells(DATALOG_DISABLED);
takuma1 2:3bbbe439ec11 221 print_CAN(DATALOG_DISABLED);
takuma1 2:3bbbe439ec11 222 //printf("4");
takuma1 2:3bbbe439ec11 223
takuma1 2:3bbbe439ec11 224 }
takuma1 2:3bbbe439ec11 225
takuma1 2:3bbbe439ec11 226
APS_Lab 0:f06ed53310a3 227
takuma1 2:3bbbe439ec11 228
takuma1 2:3bbbe439ec11 229 void print_CAN(uint8_t datalog_en){
takuma1 2:3bbbe439ec11 230
takuma1 2:3bbbe439ec11 231 __disable_irq();
takuma1 2:3bbbe439ec11 232 short n =0;
takuma1 2:3bbbe439ec11 233 int BAT_SUM = 0; // 0にする
takuma1 2:3bbbe439ec11 234 int BAT_MIN = 55876;
takuma1 2:3bbbe439ec11 235 double V,C;
takuma1 2:3bbbe439ec11 236 int BTA_MAX = 0;
takuma1 2:3bbbe439ec11 237 float tempC, sum, sum_2, ave, ave_2;
takuma1 2:3bbbe439ec11 238 int i, j, k, l; //平均化処理に使用
takuma1 2:3bbbe439ec11 239 int r = 5; //平均する値の個数
takuma1 2:3bbbe439ec11 240
takuma1 2:3bbbe439ec11 241 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
takuma1 2:3bbbe439ec11 242
takuma1 2:3bbbe439ec11 243 //if (datalog_en == 0) {
takuma1 2:3bbbe439ec11 244 //pc.printf("IC%d, ", current_ic+1);
takuma1 2:3bbbe439ec11 245 //for(n = 0; n <= 12; n++){
takuma1 2:3bbbe439ec11 246 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 2:3bbbe439ec11 247
takuma1 2:3bbbe439ec11 248 //BAT_CELL[n] = bms_ic[current_ic].cells.c_codes[i];
takuma1 2:3bbbe439ec11 249
takuma1 2:3bbbe439ec11 250
takuma1 2:3bbbe439ec11 251 pc.printf("C%d:", i+1);
takuma1 2:3bbbe439ec11 252 pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 2:3bbbe439ec11 253 BAT_SUM = bms_ic[current_ic].cells.c_codes[i] + BAT_SUM;
takuma1 2:3bbbe439ec11 254
takuma1 2:3bbbe439ec11 255 if(bms_ic[current_ic].cells.c_codes[i] > 10000){
takuma1 2:3bbbe439ec11 256 if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
takuma1 2:3bbbe439ec11 257 BAT_MIN = bms_ic[current_ic].cells.c_codes[i];
takuma1 2:3bbbe439ec11 258 }
takuma1 2:3bbbe439ec11 259 }
takuma1 2:3bbbe439ec11 260
takuma1 2:3bbbe439ec11 261 if( bms_ic[current_ic].cells.c_codes[i] > BAT_MAX){
takuma1 2:3bbbe439ec11 262 BAT_MAX = bms_ic[current_ic].cells.c_codes[i];
takuma1 2:3bbbe439ec11 263
takuma1 2:3bbbe439ec11 264 }
takuma1 2:3bbbe439ec11 265
takuma1 2:3bbbe439ec11 266 max.select();
takuma1 2:3bbbe439ec11 267 max_2.deselect_2();
takuma1 2:3bbbe439ec11 268
takuma1 2:3bbbe439ec11 269 //平均化処理
takuma1 2:3bbbe439ec11 270
takuma1 2:3bbbe439ec11 271 sum = 0;
takuma1 2:3bbbe439ec11 272 ave = 0;
takuma1 2:3bbbe439ec11 273 i = 0;
takuma1 2:3bbbe439ec11 274 for( i = 0; i < r; i++)
takuma1 2:3bbbe439ec11 275 {
takuma1 2:3bbbe439ec11 276 float temp = max.read_temp();
takuma1 2:3bbbe439ec11 277 sum += temp;
takuma1 2:3bbbe439ec11 278 }
takuma1 2:3bbbe439ec11 279
takuma1 2:3bbbe439ec11 280 ave = sum / r;
takuma1 2:3bbbe439ec11 281 printf("\n\rT: %f",ave );
takuma1 2:3bbbe439ec11 282
takuma1 2:3bbbe439ec11 283
takuma1 2:3bbbe439ec11 284
takuma1 2:3bbbe439ec11 285 max.deselect();
takuma1 2:3bbbe439ec11 286 max_2.select_2();
takuma1 2:3bbbe439ec11 287
takuma1 2:3bbbe439ec11 288 //平均化処理
takuma1 2:3bbbe439ec11 289 sum_2 = 0;
takuma1 2:3bbbe439ec11 290 ave_2 = 0;
takuma1 2:3bbbe439ec11 291 j = 0;
takuma1 2:3bbbe439ec11 292 for( j = 0; j < r; j++)
takuma1 2:3bbbe439ec11 293 {
takuma1 2:3bbbe439ec11 294 float temp_2 = max_2.read_temp_2();
takuma1 2:3bbbe439ec11 295 sum_2 += temp_2;
takuma1 2:3bbbe439ec11 296 }
takuma1 2:3bbbe439ec11 297
takuma1 2:3bbbe439ec11 298 ave_2 = sum_2 / r;
takuma1 2:3bbbe439ec11 299 printf("\n\rT: %f",ave_2 );
takuma1 2:3bbbe439ec11 300
takuma1 2:3bbbe439ec11 301
takuma1 2:3bbbe439ec11 302
takuma1 2:3bbbe439ec11 303 max.deselect();
takuma1 2:3bbbe439ec11 304 max_2.deselect_2();
takuma1 2:3bbbe439ec11 305
takuma1 2:3bbbe439ec11 306
takuma1 2:3bbbe439ec11 307
takuma1 2:3bbbe439ec11 308 max.deselect();
takuma1 2:3bbbe439ec11 309 max_2.deselect_2();
takuma1 2:3bbbe439ec11 310
takuma1 2:3bbbe439ec11 311
takuma1 2:3bbbe439ec11 312
takuma1 2:3bbbe439ec11 313
takuma1 2:3bbbe439ec11 314 //BAT_Current = C;
takuma1 2:3bbbe439ec11 315
takuma1 2:3bbbe439ec11 316
takuma1 2:3bbbe439ec11 317
takuma1 2:3bbbe439ec11 318
APS_Lab 0:f06ed53310a3 319 }
APS_Lab 0:f06ed53310a3 320
takuma1 2:3bbbe439ec11 321 }
takuma1 2:3bbbe439ec11 322
takuma1 2:3bbbe439ec11 323
takuma1 2:3bbbe439ec11 324 pc.printf("\n");
takuma1 2:3bbbe439ec11 325 pc.printf("SUM");
takuma1 2:3bbbe439ec11 326 pc.printf("%.4f, ",BAT_SUM*0.0001);
takuma1 2:3bbbe439ec11 327 BAT_AVG = BAT_SUM / 27;
takuma1 2:3bbbe439ec11 328 pc.printf("AVG");
takuma1 2:3bbbe439ec11 329 pc.printf("%.4f, ",BAT_AVG*0.0001);
takuma1 2:3bbbe439ec11 330 pc.printf("MIN");
takuma1 2:3bbbe439ec11 331 pc.printf("%.4f, ",BAT_MIN*0.0001);
takuma1 2:3bbbe439ec11 332 pc.printf("MAX");
takuma1 2:3bbbe439ec11 333 pc.printf("%.4f, ",BAT_MAX*0.0001);
takuma1 2:3bbbe439ec11 334 //pc.printf("BAT_Current");
takuma1 2:3bbbe439ec11 335 if((VCmonitor.getVoltage(&V) == 0) && (VCmonitor.getCurrent(&C) == 0)){
takuma1 2:3bbbe439ec11 336 printf("V,%f,C,%f\n",V,C);
takuma1 2:3bbbe439ec11 337 BAT_Current = C;
takuma1 2:3bbbe439ec11 338
takuma1 2:3bbbe439ec11 339 }
takuma1 2:3bbbe439ec11 340 pc.printf("%f, ",BAT_Current);
takuma1 2:3bbbe439ec11 341 pc.printf("\n");
takuma1 2:3bbbe439ec11 342 pc.printf("\n");
takuma1 2:3bbbe439ec11 343 printf("\n\rT: %f",ave );
takuma1 2:3bbbe439ec11 344 pc.printf("\n");
takuma1 2:3bbbe439ec11 345 printf("\n\rT: %f",ave_2 );
takuma1 2:3bbbe439ec11 346 pc.printf("\n");
takuma1 2:3bbbe439ec11 347
takuma1 2:3bbbe439ec11 348 if( BAT_MIN < 25000 ){
takuma1 2:3bbbe439ec11 349 BAT_MIN_safty = 1 ;
takuma1 2:3bbbe439ec11 350 wait(1);
takuma1 2:3bbbe439ec11 351 BAT_MIN_safty = 0 ;
takuma1 2:3bbbe439ec11 352 }
takuma1 2:3bbbe439ec11 353 if( BAT_MAX > 42000){
takuma1 2:3bbbe439ec11 354 BAT_MAX_safty = 1;
takuma1 2:3bbbe439ec11 355 wait(1);
takuma1 2:3bbbe439ec11 356 BAT_MAX_safty = 0;
takuma1 2:3bbbe439ec11 357
takuma1 2:3bbbe439ec11 358 }
takuma1 2:3bbbe439ec11 359 }
takuma1 2:3bbbe439ec11 360
takuma1 2:3bbbe439ec11 361
takuma1 2:3bbbe439ec11 362 /*
takuma1 2:3bbbe439ec11 363 void can_sent4(){
takuma1 2:3bbbe439ec11 364
takuma1 2:3bbbe439ec11 365 if(can1.write(CANMessage(271,&BAT_MAX2))){
takuma1 2:3bbbe439ec11 366 pc.printf("10CANMessage:%d\n",BAT_MAX2);
takuma1 2:3bbbe439ec11 367 }
takuma1 2:3bbbe439ec11 368 if(can1.write(CANMessage(272,&BAT_MAX3))){
takuma1 2:3bbbe439ec11 369 pc.printf("11CANMessage:%d\n",BAT_MAX3);
takuma1 2:3bbbe439ec11 370 }
takuma1 2:3bbbe439ec11 371 if(can1.write(CANMessage(273,&BAT_MAX4))){
takuma1 2:3bbbe439ec11 372 pc.printf("12CANMessage:%d\n",BAT_MAX4);
takuma1 2:3bbbe439ec11 373 }
takuma1 2:3bbbe439ec11 374
takuma1 2:3bbbe439ec11 375 }*/
takuma1 2:3bbbe439ec11 376 /*
takuma1 2:3bbbe439ec11 377 void can_set(){
takuma1 2:3bbbe439ec11 378
takuma1 2:3bbbe439ec11 379 //NVIC_SetPriority(TIMER3_IRQn, 0);
takuma1 2:3bbbe439ec11 380 //printf("aaaaa");
takuma1 2:3bbbe439ec11 381
takuma1 2:3bbbe439ec11 382 BAT_SUM1 = 0;
takuma1 2:3bbbe439ec11 383 BAT_SUM2 = 0;
takuma1 2:3bbbe439ec11 384 BAT_SUM3 = 0;
takuma1 2:3bbbe439ec11 385 BAT_SUM4 = 0;
takuma1 2:3bbbe439ec11 386 BAT_MIN1 = 0;
takuma1 2:3bbbe439ec11 387 BAT_MIN2 = 0;
takuma1 2:3bbbe439ec11 388 BAT_MIN3 = 0;
takuma1 2:3bbbe439ec11 389 BAT_MIN4 = 0;
takuma1 2:3bbbe439ec11 390 BAT_MAX1 = 0;
takuma1 2:3bbbe439ec11 391 BAT_MAX2 = 0;
takuma1 2:3bbbe439ec11 392 BAT_MAX3 = 0;
takuma1 2:3bbbe439ec11 393 BAT_MAX4 = 0;
takuma1 2:3bbbe439ec11 394 BAT_Current1 = 0;
takuma1 2:3bbbe439ec11 395 BAT_Current2 = 0;
takuma1 2:3bbbe439ec11 396
takuma1 2:3bbbe439ec11 397
takuma1 2:3bbbe439ec11 398 int data1 = 0; //BAT_SUM
takuma1 2:3bbbe439ec11 399 int data2 = 0;
takuma1 2:3bbbe439ec11 400 int data3 = 0; //BAT_MAX
takuma1 2:3bbbe439ec11 401 int data4 = 0; //BAT_Current
takuma1 2:3bbbe439ec11 402
APS_Lab 0:f06ed53310a3 403
takuma1 2:3bbbe439ec11 404 BAT_SUM = data1;
takuma1 2:3bbbe439ec11 405 data2 = BAT_MIN;
takuma1 2:3bbbe439ec11 406 data3 = BAT_MAX;
takuma1 2:3bbbe439ec11 407 data4 = BAT_Current;
takuma1 2:3bbbe439ec11 408
takuma1 2:3bbbe439ec11 409 BAT_SUM1 = data1 / 1000; //114
takuma1 2:3bbbe439ec11 410 BAT_SUM2 = data1 % 1000; //755
takuma1 2:3bbbe439ec11 411 BAT_SUM3 = BAT_SUM2 / 10; //75
takuma1 2:3bbbe439ec11 412 BAT_SUM4 = BAT_SUM2 % 10; // 5
takuma1 2:3bbbe439ec11 413
takuma1 2:3bbbe439ec11 414 BAT_MIN1 = data2 / 1000;
takuma1 2:3bbbe439ec11 415 BAT_MIN2 = data2 % 1000;
takuma1 2:3bbbe439ec11 416 BAT_MIN3 = BAT_MIN2 / 10;
takuma1 2:3bbbe439ec11 417 BAT_MIN4 = BAT_MIN2 % 10;
takuma1 2:3bbbe439ec11 418
takuma1 2:3bbbe439ec11 419 BAT_MAX = data3 / 1000;
takuma1 2:3bbbe439ec11 420 BAT_MAX2 = data3 % 1000;
takuma1 2:3bbbe439ec11 421 BAT_MAX3 = BAT_MAX2 / 10;
takuma1 2:3bbbe439ec11 422 BAT_MAX4 = BAT_MAX2 % 10;
takuma1 2:3bbbe439ec11 423
takuma1 2:3bbbe439ec11 424 BAT_Current1 = data4 / 100;
takuma1 2:3bbbe439ec11 425 BAT_Current2 = data4 % 100;
takuma1 2:3bbbe439ec11 426 printf("can_set\n");
takuma1 2:3bbbe439ec11 427 printf("aaaa%f",BAT_SUM);
APS_Lab 0:f06ed53310a3 428 }
takuma1 2:3bbbe439ec11 429 */
takuma1 2:3bbbe439ec11 430
APS_Lab 0:f06ed53310a3 431 void measurement_loop(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 432 {
APS_Lab 0:f06ed53310a3 433 int8_t error = 0;
APS_Lab 0:f06ed53310a3 434 if (WRITE_CONFIG == ENABLED) {
APS_Lab 0:f06ed53310a3 435 wakeup_sleep(TOTAL_IC);
APS_Lab 0:f06ed53310a3 436 LTC6811_wrcfg(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 437 print_config();
APS_Lab 0:f06ed53310a3 438 }
APS_Lab 0:f06ed53310a3 439
APS_Lab 0:f06ed53310a3 440 if (READ_CONFIG == ENABLED) {
APS_Lab 0:f06ed53310a3 441 wakeup_sleep(TOTAL_IC);
APS_Lab 0:f06ed53310a3 442 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 443 check_error(error);
APS_Lab 0:f06ed53310a3 444 print_rxconfig();
APS_Lab 0:f06ed53310a3 445 }
APS_Lab 0:f06ed53310a3 446
APS_Lab 0:f06ed53310a3 447 if (MEASURE_CELL == ENABLED) {
APS_Lab 0:f06ed53310a3 448 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 449 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
APS_Lab 0:f06ed53310a3 450 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 451 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 452 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 453 check_error(error);
APS_Lab 0:f06ed53310a3 454 print_cells(datalog_en);
APS_Lab 0:f06ed53310a3 455
APS_Lab 0:f06ed53310a3 456 }
APS_Lab 0:f06ed53310a3 457
APS_Lab 0:f06ed53310a3 458 if (MEASURE_AUX == ENABLED) {
APS_Lab 0:f06ed53310a3 459 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 460 LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_ALL);
APS_Lab 0:f06ed53310a3 461 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 462 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 463 error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
APS_Lab 0:f06ed53310a3 464 check_error(error);
APS_Lab 0:f06ed53310a3 465 print_aux(datalog_en);
APS_Lab 0:f06ed53310a3 466 }
APS_Lab 0:f06ed53310a3 467
APS_Lab 0:f06ed53310a3 468 if (MEASURE_STAT == ENABLED) {
APS_Lab 0:f06ed53310a3 469 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 470 LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL);
APS_Lab 0:f06ed53310a3 471 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 472 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 473 error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
APS_Lab 0:f06ed53310a3 474 check_error(error);
APS_Lab 0:f06ed53310a3 475 print_stat();
APS_Lab 0:f06ed53310a3 476 }
APS_Lab 0:f06ed53310a3 477
APS_Lab 0:f06ed53310a3 478 if (PRINT_PEC == ENABLED) {
APS_Lab 0:f06ed53310a3 479 print_pec();
APS_Lab 0:f06ed53310a3 480 }
APS_Lab 0:f06ed53310a3 481
APS_Lab 0:f06ed53310a3 482 }
APS_Lab 0:f06ed53310a3 483
APS_Lab 0:f06ed53310a3 484
APS_Lab 0:f06ed53310a3 485
APS_Lab 0:f06ed53310a3 486 void print_cells(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 487 {
APS_Lab 0:f06ed53310a3 488 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 489
APS_Lab 0:f06ed53310a3 490 if (datalog_en == 0) {
APS_Lab 0:f06ed53310a3 491 pc.printf("IC%d, ", current_ic+1);
takuma1 2:3bbbe439ec11 492 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
APS_Lab 0:f06ed53310a3 493 pc.printf("C%d:", i+1);
APS_Lab 0:f06ed53310a3 494 pc.printf("%.4f, ", bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 2:3bbbe439ec11 495 }
takuma1 2:3bbbe439ec11 496
APS_Lab 0:f06ed53310a3 497 pc.printf("\n");
takuma1 2:3bbbe439ec11 498 }
takuma1 2:3bbbe439ec11 499
takuma1 2:3bbbe439ec11 500 else {
APS_Lab 0:f06ed53310a3 501 pc.printf("Cells, ");
APS_Lab 0:f06ed53310a3 502 for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 2:3bbbe439ec11 503 pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 2:3bbbe439ec11 504
APS_Lab 0:f06ed53310a3 505 }
APS_Lab 0:f06ed53310a3 506 }
takuma1 2:3bbbe439ec11 507
APS_Lab 0:f06ed53310a3 508 }
APS_Lab 0:f06ed53310a3 509 pc.printf("\n");
APS_Lab 0:f06ed53310a3 510 }
APS_Lab 0:f06ed53310a3 511
APS_Lab 0:f06ed53310a3 512 void print_open()
APS_Lab 0:f06ed53310a3 513 {
APS_Lab 0:f06ed53310a3 514 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 515 if (bms_ic[current_ic].system_open_wire == 0) {
APS_Lab 0:f06ed53310a3 516 pc.printf("No Opens Detected on IC%d\n", current_ic+1);
APS_Lab 0:f06ed53310a3 517 } else {
APS_Lab 0:f06ed53310a3 518 for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++) {
APS_Lab 0:f06ed53310a3 519 if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0) {
APS_Lab 0:f06ed53310a3 520 pc.printf("There is an open wire on IC%d Channel: %d\n", current_ic + 1, cell);
APS_Lab 0:f06ed53310a3 521 }
APS_Lab 0:f06ed53310a3 522 }
APS_Lab 0:f06ed53310a3 523 }
APS_Lab 0:f06ed53310a3 524 }
APS_Lab 0:f06ed53310a3 525 }
APS_Lab 0:f06ed53310a3 526
takuma1 2:3bbbe439ec11 527
APS_Lab 0:f06ed53310a3 528 void print_aux(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 529 {
APS_Lab 0:f06ed53310a3 530
APS_Lab 0:f06ed53310a3 531 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 532 if (datalog_en == 0) {
APS_Lab 0:f06ed53310a3 533 pc.printf(" IC%d", current_ic+1);
APS_Lab 0:f06ed53310a3 534 for (int i=0; i < 5; i++) {
APS_Lab 0:f06ed53310a3 535 pc.printf(" GPIO-%d:%.4f,", i+1, bms_ic[current_ic].aux.a_codes[i]*0.0001);
APS_Lab 0:f06ed53310a3 536 }
APS_Lab 0:f06ed53310a3 537 pc.printf("Vref2:%.4f\n", bms_ic[current_ic].aux.a_codes[5]*0.0001);
APS_Lab 0:f06ed53310a3 538 } else {
APS_Lab 0:f06ed53310a3 539 pc.printf("AUX, ");
APS_Lab 0:f06ed53310a3 540 for (int i=0; i < 6; i++) {
APS_Lab 0:f06ed53310a3 541 pc.printf("%.4f,", bms_ic[current_ic].aux.a_codes[i]*0.0001);
APS_Lab 0:f06ed53310a3 542 }
APS_Lab 0:f06ed53310a3 543 }
APS_Lab 0:f06ed53310a3 544 }
APS_Lab 0:f06ed53310a3 545 pc.printf("\n");
APS_Lab 0:f06ed53310a3 546 }
APS_Lab 0:f06ed53310a3 547
takuma1 2:3bbbe439ec11 548
APS_Lab 0:f06ed53310a3 549 void print_stat()
APS_Lab 0:f06ed53310a3 550 {
APS_Lab 0:f06ed53310a3 551
APS_Lab 0:f06ed53310a3 552 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 553 pc.printf("IC%d", current_ic+1);
APS_Lab 0:f06ed53310a3 554 pc.printf(" SOC:%.4f,", bms_ic[current_ic].stat.stat_codes[0]*0.0001*20);
APS_Lab 0:f06ed53310a3 555 pc.printf(" Itemp:%.4f,", bms_ic[current_ic].stat.stat_codes[1]*0.0001);
APS_Lab 0:f06ed53310a3 556 pc.printf(" VregA:%.4f,", bms_ic[current_ic].stat.stat_codes[2]*0.0001);
APS_Lab 0:f06ed53310a3 557 pc.printf(" VregD:%.4f\n", bms_ic[current_ic].stat.stat_codes[3]*0.0001);
APS_Lab 0:f06ed53310a3 558 }
APS_Lab 0:f06ed53310a3 559
APS_Lab 0:f06ed53310a3 560 pc.printf("\n");
APS_Lab 0:f06ed53310a3 561 }
APS_Lab 0:f06ed53310a3 562
takuma1 2:3bbbe439ec11 563
APS_Lab 0:f06ed53310a3 564 void print_config()
APS_Lab 0:f06ed53310a3 565 {
APS_Lab 0:f06ed53310a3 566 int cfg_pec;
APS_Lab 0:f06ed53310a3 567
takuma1 2:3bbbe439ec11 568 //pc.printf("Written Configuration: \n");
APS_Lab 0:f06ed53310a3 569 for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
takuma1 2:3bbbe439ec11 570 //pc.printf(" IC ");
takuma1 2:3bbbe439ec11 571 //pc.printf("%d", current_ic+1);
takuma1 2:3bbbe439ec11 572 // pc.printf(": ");
takuma1 2:3bbbe439ec11 573 //pc.printf("0x");
APS_Lab 0:f06ed53310a3 574 serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
takuma1 2:3bbbe439ec11 575 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 576 serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
takuma1 2:3bbbe439ec11 577 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 578 serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
takuma1 2:3bbbe439ec11 579 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 580 serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
takuma1 2:3bbbe439ec11 581 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 582 serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
takuma1 2:3bbbe439ec11 583 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 584 serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
takuma1 2:3bbbe439ec11 585 //pc.printf(", Calculated PEC: 0x");
APS_Lab 0:f06ed53310a3 586 cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
APS_Lab 0:f06ed53310a3 587 serial_print_hex((uint8_t)(cfg_pec>>8));
takuma1 2:3bbbe439ec11 588 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 589 serial_print_hex((uint8_t)(cfg_pec));
takuma1 2:3bbbe439ec11 590 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 591 }
takuma1 2:3bbbe439ec11 592 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 593 }
APS_Lab 0:f06ed53310a3 594
takuma1 2:3bbbe439ec11 595
APS_Lab 0:f06ed53310a3 596 void print_rxconfig()
APS_Lab 0:f06ed53310a3 597 {
takuma1 2:3bbbe439ec11 598 //pc.printf("Received Configuration ");
APS_Lab 0:f06ed53310a3 599 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
takuma1 2:3bbbe439ec11 600 // pc.printf(" IC ");
takuma1 2:3bbbe439ec11 601 // pc.printf("%d", current_ic+1);
takuma1 2:3bbbe439ec11 602 //pc.printf(": 0x");
APS_Lab 0:f06ed53310a3 603 serial_print_hex(bms_ic[current_ic].config.rx_data[0]);
takuma1 2:3bbbe439ec11 604 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 605 serial_print_hex(bms_ic[current_ic].config.rx_data[1]);
takuma1 2:3bbbe439ec11 606 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 607 serial_print_hex(bms_ic[current_ic].config.rx_data[2]);
takuma1 2:3bbbe439ec11 608 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 609 serial_print_hex(bms_ic[current_ic].config.rx_data[3]);
takuma1 2:3bbbe439ec11 610 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 611 serial_print_hex(bms_ic[current_ic].config.rx_data[4]);
takuma1 2:3bbbe439ec11 612 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 613 serial_print_hex(bms_ic[current_ic].config.rx_data[5]);
takuma1 2:3bbbe439ec11 614 //pc.printf(", Received PEC: 0x");
APS_Lab 0:f06ed53310a3 615 serial_print_hex(bms_ic[current_ic].config.rx_data[6]);
takuma1 2:3bbbe439ec11 616 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 617 serial_print_hex(bms_ic[current_ic].config.rx_data[7]);
takuma1 2:3bbbe439ec11 618 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 619 }
APS_Lab 0:f06ed53310a3 620 pc.printf("\n");
APS_Lab 0:f06ed53310a3 621 }
APS_Lab 0:f06ed53310a3 622
APS_Lab 0:f06ed53310a3 623 void print_pec()
APS_Lab 0:f06ed53310a3 624 {
APS_Lab 0:f06ed53310a3 625 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 626 pc.printf("\n%d", bms_ic[current_ic].crc_count.pec_count);
APS_Lab 0:f06ed53310a3 627 pc.printf(" : PEC Errors Detected on IC");
APS_Lab 0:f06ed53310a3 628 pc.printf("%d\n", current_ic+1);
APS_Lab 0:f06ed53310a3 629 }
APS_Lab 0:f06ed53310a3 630 }
APS_Lab 0:f06ed53310a3 631
APS_Lab 0:f06ed53310a3 632
APS_Lab 0:f06ed53310a3 633 void serial_print_hex(uint8_t data)
APS_Lab 0:f06ed53310a3 634 {
takuma1 2:3bbbe439ec11 635 /*
APS_Lab 0:f06ed53310a3 636 if (data < 16) {
takuma1 2:3bbbe439ec11 637 //pc.printf("0x0%X", data);
APS_Lab 0:f06ed53310a3 638 } else
takuma1 2:3bbbe439ec11 639 pc.printf("0x%X", data);
takuma1 2:3bbbe439ec11 640 */
APS_Lab 0:f06ed53310a3 641 }
APS_Lab 0:f06ed53310a3 642
APS_Lab 0:f06ed53310a3 643 //Function to check error flag and print PEC error message
APS_Lab 0:f06ed53310a3 644 void check_error(int error)
APS_Lab 0:f06ed53310a3 645 {
APS_Lab 0:f06ed53310a3 646 if (error == -1) {
APS_Lab 0:f06ed53310a3 647 pc.printf("A PEC error was detected in the received data");
APS_Lab 0:f06ed53310a3 648 }
APS_Lab 0:f06ed53310a3 649 }
APS_Lab 0:f06ed53310a3 650
APS_Lab 0:f06ed53310a3 651
takuma1 2:3bbbe439ec11 652
APS_Lab 0:f06ed53310a3 653 char hex_digits[16]= {
APS_Lab 0:f06ed53310a3 654 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
APS_Lab 0:f06ed53310a3 655 };
APS_Lab 0:f06ed53310a3 656
takuma1 2:3bbbe439ec11 657
APS_Lab 0:f06ed53310a3 658
APS_Lab 0:f06ed53310a3 659 char hex_to_byte_buffer[5]= {
APS_Lab 0:f06ed53310a3 660 '0', 'x', '0', '0', '\0'
APS_Lab 0:f06ed53310a3 661 }; // buffer for ASCII hex to byte conversion
APS_Lab 0:f06ed53310a3 662 char byte_to_hex_buffer[3]= {
APS_Lab 0:f06ed53310a3 663 '\0','\0','\0'
APS_Lab 0:f06ed53310a3 664 };
APS_Lab 0:f06ed53310a3 665
takuma1 2:3bbbe439ec11 666 // シリアル インターフェイスから ui_バッファへのデータの読み取り
APS_Lab 0:f06ed53310a3 667 uint8_t read_data()
APS_Lab 0:f06ed53310a3 668 {
takuma1 2:3bbbe439ec11 669 uint8_t index = 0; // 内の現在の場所を保持するインデックス
takuma1 2:3bbbe439ec11 670 int c; // 着信キーストロークの格納に使用される単一の文字
APS_Lab 0:f06ed53310a3 671 //pc.printf("check 1\n");
APS_Lab 0:f06ed53310a3 672 while (index < UI_BUFFER_SIZE-1) {
APS_Lab 0:f06ed53310a3 673 //pc.printf("check 2\n");
takuma1 2:3bbbe439ec11 674 c = pc.getc();
APS_Lab 0:f06ed53310a3 675 //return c;
APS_Lab 0:f06ed53310a3 676 //pc.printf("check 3\n");
APS_Lab 0:f06ed53310a3 677
takuma1 2:3bbbe439ec11 678 if (((char) c == '\r') || ((char) c == '\n')) break;
takuma1 2:3bbbe439ec11 679 if ( ((char) c == '\x7F') || ((char) c == '\x08') ) {
APS_Lab 0:f06ed53310a3 680 if (index > 0) index--;
APS_Lab 0:f06ed53310a3 681 } else if (c >= 0) {
takuma1 2:3bbbe439ec11 682 ui_buffer[index++]=(char) c;
APS_Lab 0:f06ed53310a3 683 }
APS_Lab 0:f06ed53310a3 684 //pc.printf("check 4\n");
APS_Lab 0:f06ed53310a3 685
APS_Lab 0:f06ed53310a3 686 }
takuma1 2:3bbbe439ec11 687 ui_buffer[index]='\0';
APS_Lab 0:f06ed53310a3 688
takuma1 2:3bbbe439ec11 689 if ((char) c == '\r') {
APS_Lab 0:f06ed53310a3 690 wait_ms(1);
APS_Lab 0:f06ed53310a3 691 //pc.printf("check 5\n");
APS_Lab 0:f06ed53310a3 692
APS_Lab 0:f06ed53310a3 693 if (pc.readable()==1) {
APS_Lab 0:f06ed53310a3 694 //pc.printf("check 6\n");
takuma1 2:3bbbe439ec11 695 pc.getc();
APS_Lab 0:f06ed53310a3 696 }
takuma1 2:3bbbe439ec11 697
APS_Lab 0:f06ed53310a3 698
APS_Lab 0:f06ed53310a3 699 }
takuma1 2:3bbbe439ec11 700
APS_Lab 0:f06ed53310a3 701
takuma1 2:3bbbe439ec11 702 return index;
APS_Lab 0:f06ed53310a3 703 }
APS_Lab 0:f06ed53310a3 704
takuma1 2:3bbbe439ec11 705
APS_Lab 0:f06ed53310a3 706 float read_float()
APS_Lab 0:f06ed53310a3 707 {
APS_Lab 0:f06ed53310a3 708 float data;
APS_Lab 0:f06ed53310a3 709 read_data();
APS_Lab 0:f06ed53310a3 710 data = atof(ui_buffer);
APS_Lab 0:f06ed53310a3 711 return(data);
APS_Lab 0:f06ed53310a3 712 }
APS_Lab 0:f06ed53310a3 713
takuma1 2:3bbbe439ec11 714
APS_Lab 0:f06ed53310a3 715 int32_t read_int()
APS_Lab 0:f06ed53310a3 716 {
APS_Lab 0:f06ed53310a3 717 int32_t data;
APS_Lab 0:f06ed53310a3 718 read_data();
APS_Lab 0:f06ed53310a3 719 if (ui_buffer[0] == 'm')
APS_Lab 0:f06ed53310a3 720 return('m');
APS_Lab 0:f06ed53310a3 721 if ((ui_buffer[0] == 'B') || (ui_buffer[0] == 'b')) {
APS_Lab 0:f06ed53310a3 722 data = strtol(ui_buffer+1, NULL, 2);
APS_Lab 0:f06ed53310a3 723 } else
APS_Lab 0:f06ed53310a3 724 data = strtol(ui_buffer, NULL, 0);
APS_Lab 0:f06ed53310a3 725 return(data);
APS_Lab 0:f06ed53310a3 726 }
APS_Lab 0:f06ed53310a3 727
APS_Lab 0:f06ed53310a3 728 char *read_string()
APS_Lab 0:f06ed53310a3 729 {
APS_Lab 0:f06ed53310a3 730 read_data();
APS_Lab 0:f06ed53310a3 731 return(ui_buffer);
APS_Lab 0:f06ed53310a3 732 }
APS_Lab 0:f06ed53310a3 733
takuma1 2:3bbbe439ec11 734
APS_Lab 0:f06ed53310a3 735 int8_t read_char()
APS_Lab 0:f06ed53310a3 736 {
APS_Lab 0:f06ed53310a3 737 read_data();
APS_Lab 0:f06ed53310a3 738 return(ui_buffer[0]);
APS_Lab 0:f06ed53310a3 739 }