#include "app_config.h" #include "elite_board.h" #include "edc.h" #include "elite.h" #include "elite_adc.h" #include "elite_correction.h" #include "elite_dac.h" #include "adc_drv.h" #include "dac_drv.h" #include "led_drv.h" #include "sw_drv.h" #include "nrf_log.h" #if (DEF_ELITE_MODEL == DEF_ELITE_EDC_20) extern ret_code_t le_event_upadate(uint8_t *p_value, uint16_t len); static void dummy(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } /* dev_mode_set_led (1)0x3000FF0400 -func: LED initialization (2)0x3000FF0401ccbb -func: LED uses predefined colors -cc: custom color index 00h-07h 00h = LED_NONE 01h = LED_RED 02h = LED_ORANGE 03h = LED_YELLOW 04h = LED_GREEN 05h = LED_CYAN 06h = LED_BLUE 07h = LED_PURPLE -bb: brightness 00h-1Fh (3)0x3000FF0402nnbbrrggbb -func: control the color of an LED -nn: which LED 00h-0Bh +-------------+ | 2 3 4 5 | | 1 hole 6 | | 0 mcu 7 | | 11 10 9 8 | +-------------+ -bb: brightness 00h-1Fh -rrggbb: RGB color code 000000h-FFFFFFh (4)0x3000FF0403 -func: rainbow-colored LED */ static void dev_mode_set_led(uint8_t *ins, uint16_t size) { #define LED_ITEM_INIT_LED 0x00 #define LED_ITEM_ALL_LED 0x01 #define LED_ITEM_SINGLE_LED 0x02 #define LED_ITEM_RAINBOW_LED 0x03 uint8_t led_item = ins[4]; switch (led_item) { case LED_ITEM_INIT_LED: led_init(); break; case LED_ITEM_ALL_LED: { struct led_color color[8] = { LED_NONE, LED_RED, LED_ORANGE, LED_YELLOW, LED_GREEN, LED_CYAN, LED_BLUE, LED_PURPLE }; char *color_str[8] = { "LED_NONE", "LED_RED", "LED_ORANGE", "LED_YELLOW", "LED_GREEN", "LED_CYAN", "LED_BLUE", "LED_PURPLE" }; uint8_t color_idx = ins[5]; uint8_t brightness = ins[6]; if (color_idx >= COUNT_ARRAY_SIZE(color)) { NRF_LOG_INFO("[LED] color not provided"); } else { for (int i = 0; i < DEF_LED_COUNT; i++) led_single_led_set(i, color[color_idx], brightness); NRF_LOG_INFO("[LED] set color(%s) bright(%d)", color_str[color_idx], brightness); } break; } case LED_ITEM_SINGLE_LED: { struct led_color color; uint8_t brightness = ins[6]; uint32_t idx = ins[5]; color.R = ins[7]; color.G = ins[8]; color.B = ins[9]; led_single_led_set(idx, color, brightness); NRF_LOG_INFO("[LED] set idx(%d) color(rgb #%02X%02X%02X) bright(%d)", idx, color.R, color.G, color.B, brightness); break; } case LED_ITEM_RAINBOW_LED: led_as_rainbow(); NRF_LOG_INFO("[LED] set rainbow color"); break; } } /* dev_mode_set_dac (1)0x3000FF9000 -func: DAC initialization (2)0x3000FF9001ccvvvv -func: set DAC_CH0 & DAC_CH1 DAC codes, and output voltage -cc: channel 00h-02h 00h = DAC_CH0 01h = DAC_CH1 02h = DAC_CH0|DAC_CH1 -vvvv: DAC code 0000h-FFFFh */ static void dev_mode_set_dac(uint8_t *ins, uint16_t size) { #define DAC_ITEM_INIT_DAC 0x00 #define DAC_ITEM_WRITE_THROUGH 0x01 uint8_t dac_item = ins[4]; switch (dac_item) { case DAC_ITEM_INIT_DAC: dac_init(); break; case DAC_ITEM_WRITE_THROUGH: { uint8_t channel_idx = ins[5]; uint16_t dac_code = __REVSH(*(uint16_t *)&ins[6]); int32_t mv = dac_code * 2440 / 65536; if (channel_idx == 0x00) { dac_write_through(DAC_CH0, dac_code); NRF_LOG_INFO("[DAC_CH0] set 0x%04X, about %d mV", dac_code, mv); } else if (channel_idx == 0x01) { dac_write_through(DAC_CH1, dac_code); NRF_LOG_INFO("[DAC_CH1] set 0x%04X, about %d mV", dac_code, mv); } else if (channel_idx == 0x02) { dac_write_through(DAC_CH0 | DAC_CH1, dac_code); NRF_LOG_INFO("[DAC_CH0] set 0x%04X, about %d mV", dac_code, mv); NRF_LOG_INFO("[DAC_CH1] set 0x%04X, about %d mV", dac_code, mv); } break; } } } /* dev_mode_set_adc (1)0x3000FF9100 -func: ADC initialization (2)0x3000FF9101gg -func: set ADC input range gain -gg: RANGE_SEL 00h-08h 00h = NP_GAIN_3P000 01h = NP_GAIN_2P500 02h = NP_GAIN_1P500 03h = NP_GAIN_1P250 04h = NP_GAIN_0P625 05h = P_GAIN_3P000 06h = P_GAIN_2P500 07h = P_GAIN_1P500 08h = P_GAIN_1P250 (3)0x3000FF9102cc -func: read the ADC value of a specific channel 00h = S1(AIN0) = Iin 01h = S2(AIN1) = Vin 02h = S3(AIN2) = Vout_in 03h = S4(AIN3) 04h = S5(AIN4) 05h = S6(AIN5) 06h = S7(AIN6) 07h = S8(AIN7) -FFF1 read gatt[0] channel gatt[1] range_sel gatt[2:5] 18bit_adc_val */ static void dev_mode_set_adc(uint8_t *ins, uint16_t size) { #define ADC_ITEM_INIT_ADC 0x00 #define ADC_ITEM_SET_ADC_GAIN 0x01 #define ADC_ITEM_READ_ADC_VAL 0x02 uint8_t adc_item = ins[4]; switch (adc_item) { case ADC_ITEM_INIT_ADC: adc_init(); break; case ADC_ITEM_SET_ADC_GAIN: { uint8_t range_sel = ins[5]; char *color_str[5] = { "NP_GAIN_3P000", "NP_GAIN_2P500", "NP_GAIN_1P500", "NP_GAIN_1P250", "NP_GAIN_0P625" }; switch (range_sel) { case 0x00: adc_gain(GAIN_3P000); NRF_LOG_INFO("[ADC] set range_sel(%s)", color_str[range_sel]); break; case 0x01: adc_gain(GAIN_2P500); NRF_LOG_INFO("[ADC] set range_sel(%s)", color_str[range_sel]); break; case 0x02: adc_gain(GAIN_1P500); NRF_LOG_INFO("[ADC] set range_sel(%s)", color_str[range_sel]); break; case 0x03: adc_gain(GAIN_1P250); NRF_LOG_INFO("[ADC] set range_sel(%s)", color_str[range_sel]); break; case 0x04: adc_gain(GAIN_0P625); NRF_LOG_INFO("[ADC] set range_sel(%s)", color_str[range_sel]); break; default: break; } break; } case ADC_ITEM_READ_ADC_VAL: { int32_t val; uint32_t channel = ins[5]; adc_read(channel, &val); break; } } } /* dev_mode_set_switch (1)0x3000FF9200 -func: switch initialization (2)0x3000FF9201oott -func: set two switch -oo: one switch(U12) config 00h-0Fh 00000000b = all open 00000001b = U12 S1 close(conductivity) 00000011b = U12 S2&S1 close(conductivity) 00000111b = U12 S3&S2&S1 close(conductivity) 00001111b = U12 S4&S3&S2&S1 close(conductivity) -tt: two switch(U13) config 00h-0Fh 00000000b = all open 00000001b = U13 S1 close(conductivity) 00000011b = U13 S2&S1 close(conductivity) 00000111b = U13 S3&S2&S1 close(conductivity) 00001111b = U13 S4&S3&S2&S1 close(conductivity) (3)0x3000FF9204gg -func: out_1 gain config -gg: out_1 resistance idx 00h-02h 00h = gain0, the smallest voltage output (15K) 01h = gain1 (39K) 02h = gain2, the largest voltage output (100K) */ static void dev_mode_set_switch(uint8_t *ins, uint16_t size) { #define SW_ITEM_INIT_SW 0x00 #define SW_ITEM_WRITE_SW 0x01 #define SW_ITEM_SET_OUT_1_GAIN 0x04 uint8_t sw_item = ins[4]; switch (sw_item) { case SW_ITEM_INIT_SW: sw_init(); break; case SW_ITEM_WRITE_SW: { sw_t sw; uint32_t sw_cnt; sw_count(&sw_cnt); sw_read(&sw); sw.val = (uint64_t)ins[6] << 4 | (uint64_t)ins[5]; NRF_LOG_INFO("sw.val= %08X", sw.val); NRF_LOG_INFO("sw.sw7~sw4=%X %X %X %X", sw.sw7, sw.sw6, sw.sw5, sw.sw4); NRF_LOG_INFO("sw.sw3~sw0=%X %X %X %X", sw.sw3, sw.sw2, sw.sw1, sw.sw0); sw_write(sw); break; } case SW_ITEM_SET_OUT_1_GAIN: { uint8_t out_1_gain = ins[5]; sw_t sw; uint32_t sw_cnt; sw_count(&sw_cnt); sw_read(&sw); if (out_1_gain == 0x00) { sw.sw0 = 0; sw.sw1 = 0; sw.sw2 = 1; sw.sw3 = 0; } if (out_1_gain == 0x01) { sw.sw0 = 0; sw.sw1 = 0; sw.sw2 = 0; sw.sw3 = 1; } if (out_1_gain == 0x02) { sw.sw0 = 0; sw.sw1 = 0; sw.sw2 = 0; sw.sw3 = 0; } NRF_LOG_INFO("sw.val= %08X", sw.val); NRF_LOG_INFO("sw.sw7~sw4=%X %X %X %X", sw.sw7, sw.sw6, sw.sw5, sw.sw4); NRF_LOG_INFO("sw.sw3~sw0=%X %X %X %X", sw.sw3, sw.sw2, sw.sw1, sw.sw0); sw_write(sw); break; } } } static void dev_mode_read_output_pin(void) { struct pin_out_t { uint32_t resvd : 11, power_5v_en : 1, power_12v_en : 1, off : 1, vout_fb : 1, vout_in : 1, iin4_test : 1, iin3_sel : 1, iin3 : 1, iin2 : 1, iin1 : 1, vin2 : 1, vin1 : 1, cv_ctrl : 1, adc_a2 : 1, adc_a1 : 1, adc_a0 : 1, rst_sw : 1, cs_sw : 1, cs_mem : 1, cs_adc : 1, cs_dac : 1; } output; uint32_t pin_out_status; output.power_5v_en = nrf_gpio_pin_out_read(POWER_5V_EN_PIN); output.power_12v_en = nrf_gpio_pin_out_read(POWER_12V_EN_PIN); output.off = nrf_gpio_pin_out_read(OFF_PIN); output.vout_fb = nrf_gpio_pin_out_read(Vout_FB_PIN); output.vout_in = nrf_gpio_pin_out_read(Vout_IN_PIN); output.iin4_test = nrf_gpio_pin_out_read(Iin4_TEST_PIN); output.iin3_sel = nrf_gpio_pin_out_read(Iin3_SEL_PIN); output.iin3 = nrf_gpio_pin_out_read(Iin3_PIN); output.iin2 = nrf_gpio_pin_out_read(Iin2_PIN); output.iin1 = nrf_gpio_pin_out_read(Iin1_PIN); output.vin2 = nrf_gpio_pin_out_read(Vin2_PIN); output.vin1 = nrf_gpio_pin_out_read(Vin1_PIN); output.cv_ctrl = nrf_gpio_pin_out_read(CV_CTRL_PIN); output.adc_a2 = nrf_gpio_pin_out_read(ADCA2_PIN); output.adc_a1 = nrf_gpio_pin_out_read(ADCA1_PIN); output.adc_a0 = nrf_gpio_pin_out_read(ADCA0_PIN); output.rst_sw = nrf_gpio_pin_out_read(RST_SW_PIN); output.cs_sw = nrf_gpio_pin_out_read(CS_SW_PIN); output.cs_mem = nrf_gpio_pin_out_read(CS_MEM_PIN); output.cs_adc = nrf_gpio_pin_out_read(CS_ADC_PIN); output.cs_dac = nrf_gpio_pin_out_read(CS_DAC_PIN); pin_out_status = (output.resvd << 21) | (output.power_5v_en << 20) | (output.power_12v_en << 19) | (output.off << 18) | (output.vout_fb << 17) | (output.vout_in << 16) | (output.iin4_test << 15) | (output.iin3_sel << 14) | (output.iin3 << 13) | (output.iin2 << 12) | (output.iin1 << 11) | (output.vin2 << 10) | (output.vin1 << 9) | (output.cv_ctrl << 8) | (output.adc_a2 << 7) | (output.adc_a1 << 6) | (output.adc_a0 << 5) | (output.rst_sw << 4) | (output.cs_sw << 3) | (output.cs_mem << 2) | (output.cs_adc << 1) | output.cs_dac; le_event_upadate((uint8_t *)&pin_out_status, sizeof(pin_out_status)); NRF_LOG_INFO("pin_out_status = 0x%08X", pin_out_status); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[31:21] resvd", output.resvd); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[20] power_5v_en", output.power_5v_en); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[19] power_12v_en", output.power_12v_en); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[18] off", output.off); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[17] vout_fb", output.vout_fb); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[16] vout_in", output.vout_in); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[15] iin4_test", output.iin4_test); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[14] iin3_sel", output.iin3_sel); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[13] iin3", output.iin3); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[12] iin2", output.iin2); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[11] iin1", output.iin1); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[10] vin2", output.vin2); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[9] vin1", output.vin1); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[8] cv_ctrl", output.cv_ctrl); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[7] adc_a2", output.adc_a2); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[6] adc_a1", output.adc_a1); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[5] adc_a0", output.adc_a0); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[4] rst_sw", output.rst_sw); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[3] cs_sw", output.cs_sw); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[2] cs_mem", output.cs_mem); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[1] cs_adc", output.cs_adc); NRF_LOG_INFO("| %-32s | %d |", "pin_out_status[0] cs_dac", output.cs_dac); } static void dev_mode_read_input_pin(void) { struct pin_input_t { uint32_t resvd : 29, vbat : 1, shut_down : 1, int9466 : 1; } input; uint32_t pin_input_status; input.vbat = nrf_gpio_pin_read(VBAT_PIN); input.shut_down = nrf_gpio_pin_read(SHUT_DOWN_PIN); input.int9466 = nrf_gpio_pin_read(INT9466_PIN); pin_input_status = (input.resvd << 3) | (input.vbat << 2) | (input.shut_down << 1) | input.int9466; le_event_upadate((uint8_t *)&pin_input_status, sizeof(pin_input_status)); NRF_LOG_INFO("pin_input_status = 0x%08X", pin_input_status); NRF_LOG_INFO("| %-32s | %d |", "pin_input_status[31:3] resvd", input.resvd); NRF_LOG_INFO("| %-32s | %d |", "pin_input_status[2] vbat", input.vbat); NRF_LOG_INFO("| %-32s | %d |", "pin_input_status[1] shut_down", input.shut_down); NRF_LOG_INFO("| %-32s | %d |", "pin_input_status[0] int9466", input.int9466); } /* dev_mode_set_gpio_output_high_low (1)0x3000FFA0ppnnss -func: control GPIO high/low -ppnn: pin number 0000h-0031h, 0100h-0115h (0017h represents GPIO P0.17) -ss: high/low 00h-01h */ static void dev_mode_set_gpio_output_high_low(uint8_t *ins, uint16_t size) { uint16_t user_pin_number = __REVSH(*(uint16_t *)&ins[4]); uint8_t pin_signal = ins[6]; uint32_t pin; switch (user_pin_number) { case 0x0015: pin = OFF_PIN; break; case 0x0020: // special pin for BMD380 EVK pin = CS_SW_PIN; break; case 0x0008: pin = CS_MEM_PIN; break; case 0x0006: pin = CS_ADC_PIN; break; case 0x0005: pin = CS_DAC_PIN; break; case 0x0025: pin = ADCA2_PIN; break; case 0x0019: // special pin for BMD380 EVK pin = ADCA1_PIN; break; case 0x0021: // special pin for BMD380 EVK pin = ADCA0_PIN; break; case 0x0017: // special pin for BMD380 EVK pin = RST_SW_PIN; break; case 0x0026: pin = Vout_FB_PIN; break; case 0x0004: pin = Vout_IN_PIN; break; case 0x0112: pin = Iin4_TEST_PIN; break; case 0x0114: pin = Iin3_SEL_PIN; break; case 0x0113: pin = Iin3_PIN; break; case 0x0103: pin = Iin2_PIN; break; case 0x0110: pin = Iin1_PIN; break; case 0x0106: pin = Vin2_PIN; break; case 0x0111: pin = Vin1_PIN; break; case 0x0016: pin = CV_CTRL_PIN; break; default: NRF_LOG_INFO("[GPIO] wrong pin number"); return; break; } if (pin_signal == 0) { nrf_gpio_pin_clear(pin); NRF_LOG_INFO("[GPIO] P%X.%02X(%d)", user_pin_number >> 8, user_pin_number & 0x00FF, pin_signal); } else if (pin_signal == 1) { nrf_gpio_pin_set(pin); NRF_LOG_INFO("[GPIO] P%X.%02X(%d)", user_pin_number >> 8, user_pin_number & 0x00FF, pin_signal); } else { NRF_LOG_INFO("[GPIO] pin_signal must be high/low"); } } /* dev_mode_spi1_transfer (1)0x3000FFA1ssttrrcccccccc -func: control spi1 -ss: chip selector 00h(EDC2.0 SPI1 does not use the CS pin) -tt: MOSI data length 00h-FFh -rr: MISO data length 00h(EDC2.0 SPI1 does not use the MISO pin) -cccccccc: MOSI content example to control led: FFF2 write: 3000FFA100040000000000 3000FFA1000400E100FF00 * 12 times 3000FFA1000400FFFFFFFF */ static void dev_mode_spi1_transfer(uint8_t *ins, uint16_t size) { uint8_t chip_seletor = ins[4]; uint8_t mosi_data_len = ins[5]; uint8_t miso_data_len = ins[6]; uint8_t *mosi_data = &ins[7]; switch (chip_seletor) { case 0x00: spi1_write(mosi_data, mosi_data_len); break; default: NRF_LOG_INFO("[SPI(1)] wrong module chip seletor"); return; break; } } /* dev_mode_spi2_transfer (1)0x3000FFA2ssttrrcccccccc -func: control spi2 -ss: chip selector 00h-03h 00h = CS_SW 01h = CS_MEM 02h = CS_ADC 03h = CS_DAC -tt: MOSI data length 00h-FFh -rr: MISO data length 00h-FFh -cccccccc: MOSI content */ static void dev_mode_spi2_transfer(uint8_t *ins, uint16_t size) { uint8_t chip_seletor = ins[4]; uint8_t mosi_data_len = ins[5]; uint8_t miso_data_len = ins[6]; uint8_t *mosi_data = &ins[7]; uint8_t miso_data[255]; switch (chip_seletor) { case 0x00: spim_xfer(CS_SW_PIN, NRF_SPIM_MODE_0, mosi_data, mosi_data_len, miso_data, miso_data_len); break; case 0x01: spim_xfer(CS_MEM_PIN, NRF_SPIM_MODE_0, mosi_data, mosi_data_len, miso_data, miso_data_len); break; case 0x02: spim_xfer(CS_ADC_PIN, NRF_SPIM_MODE_0, mosi_data, mosi_data_len, miso_data, miso_data_len); break; case 0x03: spim_xfer(CS_DAC_PIN, NRF_SPIM_MODE_2, mosi_data, mosi_data_len, miso_data, miso_data_len); break; default: NRF_LOG_INFO("[SPI(2)] wrong module chip seletor"); return; break; } if (miso_data_len > 0) { le_event_upadate(miso_data, miso_data_len); } } /* dev_mode_circuit_selection (1)0x3000FFB1ss -func: set circuit selection -ss: Iin, Vin, DAC, CC, CV3 selection 00h-0Dh 00h = vin_0 gain 01h = vin_1 gain 02h = vin_2 gain 03h = Iin_0 gain 04h = Iin_1 gain 05h = Iin_2 gain 06h = Iin_3 gain 07h = Iin_4 gain 08h = dac_coarse_tune_c (only calibration will use it) 09h = dac_fune_tune_f0 0Ah = dac_fune_tune_f1 0Bh = dac_fune_tune_f2 0Ch = cv3_config 0Dh = cc_config */ static void dev_mode_circuit_selection(uint8_t *ins, uint16_t size) { uint8_t circuit_select = ins[4]; switch (circuit_select) { case 0x00: circuit_selection_vin_0(); break; case 0x01: circuit_selection_vin_1(); break; case 0x02: circuit_selection_vin_2(); break; case 0x03: circuit_selection_Iin_0(); break; case 0x04: circuit_selection_Iin_1(); break; case 0x05: circuit_selection_Iin_2(); break; case 0x06: circuit_selection_Iin_3(); break; case 0x07: circuit_selection_Iin_4(); break; case 0x08: circuit_selection_dac_coarse_tune_c(); break; case 0x09: circuit_selection_dac_fine_tune_f0(); break; case 0x0A: circuit_selection_dac_fine_tune_f1(); break; case 0x0B: circuit_selection_dac_fine_tune_f2(); break; case 0x0C: circuit_selection_cv3_config(); break; case 0x0D: circuit_selection_cc_config(); break; } } static void dev_mode(uint8_t *ins, uint16_t size) { uint32_t dev_mode_func = __REV(*(uint32_t *)ins) & 0xF000FFFF; switch (dev_mode_func) { case 0x3000FF01: NRF_LOG_INFO("return_software_version() is unimplemented."); break; case 0x3000FF02: NRF_LOG_INFO("return_battery_volt() is unimplemented."); break; case 0x3000FF03: NRF_LOG_INFO("return_temperature() is unimplemented."); break; case 0x3000FF04: dev_mode_set_led(ins, size); break; case 0x3000FF90: dev_mode_set_dac(ins, size); break; case 0x3000FF91: dev_mode_set_adc(ins, size); break; case 0x3000FF92: dev_mode_set_switch(ins, size); break; case 0x3000FF9E: dev_mode_read_output_pin(); break; case 0x3000FF9F: dev_mode_read_input_pin(); break; case 0x3000FFA0: dev_mode_set_gpio_output_high_low(ins, size); break; case 0x3000FFA1: dev_mode_spi1_transfer(ins, size); break; case 0x3000FFA2: dev_mode_spi2_transfer(ins, size); break; case 0x3000FFA3: // i2c0 break; case 0x3000FFB1: dev_mode_circuit_selection(ins, size); break; default: NRF_LOG_INFO("unknown dev_mode instruction"); break; } } static void cis_version(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); struct { uint8_t opcode; uint8_t year; uint8_t mon; uint8_t day; uint8_t hh; uint8_t mm; } __PACKED cis_ver = { .opcode = CIS_VERSION, .year = 24, .mon = 5, .day = 21, .hh = 22, .mm = 40, }; extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); le_data_upadate((void *)&cis_ver, sizeof(cis_ver)); } __WEAK uint16_t bat_volt_read(void) { static uint16_t bat_volt = 3936; bat_volt--; return bat_volt; } static void cis_volt(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); struct { uint8_t opcode; uint16_t volt; } __PACKED cis_volt = { .opcode = CIS_VOLT, .volt = bat_volt_read(), }; extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); le_data_upadate((void *)&cis_volt, sizeof(cis_volt)); } __WEAK uint16_t temperature_read(void) { static uint16_t bat_volt = 3936; bat_volt--; return bat_volt; } static void cis_temperature(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); struct { uint8_t opcode; uint32_t temperature; } __PACKED cis_temperature = { .opcode = CIS_TEMPERATURE, .temperature = __REV(temperature_read()), }; extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); le_data_upadate((void *)&cis_temperature, sizeof(cis_temperature)); } static void cis_cali(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void vis_rst(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); edc.instru.eliteFxn = VIS_RST; edc.instru.VinADCGainLv = VIN_GAIN_1K; VinADCGainCtrl(edc.instru.VinADCGainLv); edc.instru.IinADCGainLv = I_GAIN_100R; IinADCGainCtrl(edc.instru.IinADCGainLv); edc.instru.VoutGainLv = VOUT_GAIN_15K; VoutGainControl(edc.instru.VoutGainLv); uint16_t volt = Usercode_Correction_to_DAC(edc.instru.VoutGainLv, 25000); dac_write_through(DAC0, volt); led_mode(NO_EVENT); } static void vis_sti(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void vis_int(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void vis_device_shiny(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); led_set(LED_IDENTICY_DEV); } static void vis_shiny_dis(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); led_set(LED_IDEL_CONNECTED); } static void curve_iv(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_iv_cy(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); extern void edc20_cycle_iv_mode_start(uint8_t * ins, uint16_t size); edc20_cycle_iv_mode_start(ins, size); } static void curve_vo(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_rt(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_vt(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_it(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_cc(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_ocp(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_cv(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_lsv(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_ca(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_cp(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_uni_pulse(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_dpv(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_dpv_advance(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_dpv_smprate(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_dpv_advance_smprate(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_eis(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_cf(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void curve_cali(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } static void set_sample_rate(uint8_t *ins, uint16_t size) { NRF_LOG_INFO("%s", __FUNCTION__); } elite_instance_t edc20_elite_instance = { .cis_func = { [CIS_VERSION] = cis_version, [CIS_VOLT] = cis_volt, [CIS_TEMPERATURE] = cis_temperature, [CIS_CALI] = cis_cali, }, .vis_func = { [VIS_RST] = vis_rst, [VIS_STI] = vis_sti, [VIS_INT] = vis_int, [VIS_DEVICE_SHINY] = vis_device_shiny, [VIS_SHINY_DIS] = vis_shiny_dis, }, .ris_func = { [CURVE_IV] = curve_iv, [CURVE_IV_CY] = curve_iv_cy, [CURVE_VO] = curve_vo, [CURVE_RT] = curve_rt, [CURVE_VT] = curve_vt, [CURVE_IT] = curve_it, [CURVE_CC] = curve_cc, [CURVE_OCP] = curve_ocp, [CURVE_CV] = curve_cv, [CURVE_LSV] = curve_lsv, [CURVE_CA] = curve_ca, [CURVE_CP] = curve_cp, [CURVE_UNI_PULSE] = curve_uni_pulse, [CURVE_DPV] = curve_dpv, [CURVE_DPV_ADVANCE] = curve_dpv_advance, [CURVE_DPV_SMPRATE] = curve_dpv_smprate, [CURVE_DPV_ADVANCE_SMPRATE] = curve_dpv_advance_smprate, [CURVE_EIS] = curve_eis, [CURVE_CF] = curve_cf, [CURVE_CALI] = curve_cali, [SET_SAMPLE_RATE] = set_sample_rate, [DEV_MODE] = dev_mode, } }; static void init(void) { dac_init(); adc_gain(GAIN_3P000); circuit_selection_dac_fine_tune_f2(); } edc20_t edc = { .init = init, .p_elite_instance = &edc20_elite_instance, }; #endif /* ! DEF_ELITE_MODEL */