diff --git a/pel.c b/pel.c index 5126ad2..53f6ddd 100644 --- a/pel.c +++ b/pel.c @@ -61,7 +61,7 @@ static float _load_set_by_ohms(float ohms) return ohms; } -static void _sample(void) +static void _sample_measure_out_is_low(void) { nrf_gpio_pin_set(ANODE_PIN); nrf_gpio_pin_clear(CATHODE_PIN); @@ -83,6 +83,28 @@ static void _sample(void) nrf_gpio_pin_toggle(SAMPLE_V_PIN); } +static void _sample_measure_out_is_high(void) +{ + nrf_gpio_pin_clear(ANODE_PIN); + nrf_gpio_pin_set(CATHODE_PIN); + nrf_gpio_pin_clear(SAMPLE_R_PIN); + nrf_gpio_pin_clear(SAMPLE_V_PIN); + nrf_delay_us(10); + + nrf_gpio_pin_toggle(ANODE_PIN); + nrf_gpio_pin_toggle(CATHODE_PIN); + nrf_delay_us(5); + + nrf_gpio_pin_toggle(SAMPLE_R_PIN); + nrf_gpio_pin_toggle(SAMPLE_V_PIN); + nrf_delay_us(5); + + nrf_gpio_pin_toggle(CATHODE_PIN); + nrf_gpio_pin_toggle(ANODE_PIN); + nrf_gpio_pin_toggle(SAMPLE_R_PIN); + nrf_gpio_pin_toggle(SAMPLE_V_PIN); +} + void pel_relays_set(uint32_t measure_out) { if (measure_out) @@ -99,7 +121,7 @@ void pel_relays_set(uint32_t measure_out) vTaskDelay(pdMS_TO_TICKS(30)); } -pel_output_t pel_smaple_and_convt_all(uint32_t load_mask) +pel_output_t pel_smaple_and_convt_all(uint32_t measure_out, uint32_t load_mask) { uint32_t ch_list[] = { OUTPUT_R1_CHANNEL, @@ -112,7 +134,14 @@ pel_output_t pel_smaple_and_convt_all(uint32_t load_mask) /* config E-load */ _load_set(load_mask); /* send a pulse to sample and then read ADC channels */ - adc_read_mutiple_channels_ex(ch_list, results, COUNTOF(ch_list), _sample); + if (measure_out) + { + adc_read_mutiple_channels_ex(ch_list, results, COUNTOF(ch_list), _sample_measure_out_is_high); + } + else + { + adc_read_mutiple_channels_ex(ch_list, results, COUNTOF(ch_list), _sample_measure_out_is_low); + } /* copy results */ output_data.output_r1 = results[0]; output_data.output_r2 = results[1]; @@ -227,66 +256,80 @@ static void dev_mode(uint8_t *ins, uint16_t size) return; } - struct - { - uint8_t status; - uint16_t mask; - } __PACKED *p_param = (void *)p_ins->param; - switch (p_ins->opcode) { - case 0x00: { + case 0x60: { + struct + { + uint8_t status; + uint16_t mask; + } __PACKED *p_param = (void *)p_ins->param; + pel_relays_set(p_param->status); - dev_mode_pel_output = pel_smaple_and_convt_all(p_param->mask); + dev_mode_pel_output = pel_smaple_and_convt_all(p_param->status, __REVSH(p_param->mask)); break; } - case 0x01: { - extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); - le_data_upadate((void *)&dev_mode_pel_output.output_r1, sizeof(dev_mode_pel_output.output_r1)); - break; - } - case 0x02: { - extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); - le_data_upadate((void *)&dev_mode_pel_output.output_r2, sizeof(dev_mode_pel_output.output_r2)); - break; - } - case 0x03: { - extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); - le_data_upadate((void *)&dev_mode_pel_output.output_vo, sizeof(dev_mode_pel_output.output_vo)); - break; - } - case 0x04: { - extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); - le_data_upadate((void *)&dev_mode_pel_output.output_vc, sizeof(dev_mode_pel_output.output_vc)); - break; - } - case 0x05: { - extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); - le_data_upadate((void *)&dev_mode_pel_output.output_ve, sizeof(dev_mode_pel_output.output_ve)); - break; - } - case 0x06: { - if (test_gpio_task_Handle == NULL) + case 0x61: { + struct { - NRF_LOG_INFO("[test] start test_gpio_task task"); - xTaskCreate(test_gpio_task, "test_gpio_task", 1024, NULL, 4, &test_gpio_task_Handle); + uint8_t channel; + } __PACKED *p_param = (void *)p_ins->param; + + if (p_param->channel == 0x01) { + extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); + le_data_upadate((void *)&dev_mode_pel_output.output_r1, sizeof(dev_mode_pel_output.output_r1)); + } + else if (p_param->channel == 0x02) { + extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); + le_data_upadate((void *)&dev_mode_pel_output.output_r2, sizeof(dev_mode_pel_output.output_r2)); + } + else if (p_param->channel == 0x03) { + extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); + le_data_upadate((void *)&dev_mode_pel_output.output_vo, sizeof(dev_mode_pel_output.output_vo)); + } + else if (p_param->channel == 0x04) { + extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); + le_data_upadate((void *)&dev_mode_pel_output.output_vc, sizeof(dev_mode_pel_output.output_vc)); + } + else if (p_param->channel == 0x05) { + extern ret_code_t le_data_upadate(uint8_t * p_value, uint16_t len); + le_data_upadate((void *)&dev_mode_pel_output.output_ve, sizeof(dev_mode_pel_output.output_ve)); } break; } - case 0x07: { - if (test_gpio_task_Handle != NULL) - { - NRF_LOG_INFO("[test] delete test_gpio_task task"); - vTaskDelete(test_gpio_task_Handle); - test_gpio_task_Handle = NULL; - } - break; - } - case 0x08: { + + case 0xF0: { pel10_io_init(); break; } + + case 0xF1: { + struct + { + uint8_t status; + } __PACKED *p_param = (void *)p_ins->param; + + if (p_param->status == 0x01) + { + if (test_gpio_task_Handle == NULL) + { + NRF_LOG_INFO("[test] start test_gpio_task task"); + xTaskCreate(test_gpio_task, "test_gpio_task", 1024, NULL, 4, &test_gpio_task_Handle); + } + } + else if (p_param->status == 0x00) + { + if (test_gpio_task_Handle != NULL) + { + NRF_LOG_INFO("[test] delete test_gpio_task task"); + vTaskDelete(test_gpio_task_Handle); + test_gpio_task_Handle = NULL; + } + } + break; + } + default: { break; } diff --git a/pel.h b/pel.h index 6750464..0dc4b2e 100644 --- a/pel.h +++ b/pel.h @@ -29,7 +29,7 @@ typedef struct } pel_output_t; void pel_relays_set(uint32_t measure_out); -pel_output_t pel_smaple_and_convt_all(uint32_t load_mask); +pel_output_t pel_smaple_and_convt_all(uint32_t measure_out, uint32_t load_mask); const elite_instance_t *pel_init(void); #endif // !__PEL_H__