fix how received PZEM messages are handled

This commit is contained in:
King Kévin 2017-01-20 17:07:34 +01:00
parent 0c2d13bbe5
commit 51d8d5a3f5
2 changed files with 7 additions and 12 deletions

View File

@ -96,13 +96,16 @@ void sensor_pzem_measurement_request(uint32_t address, enum sensor_pzem_measurem
usart_enable_tx_interrupt(USART(SENSOR_PZEM_USART)); // enable interrupt to send other bytes
usart_send(USART(SENSOR_PZEM_USART),tx_buffer[tx_i++]); // start transmission
sensor_pzem_measurement_received = false; // reset flag
rx_i = 0; // prepare buffer to receive next measurement
}
struct sensor_pzem_measurement_t sensor_pzem_measurement_decode(void)
{
struct sensor_pzem_measurement_t measurement; // decoded measurement to return
measurement.valid = false; // wait until the end to ensure validity
if (!sensor_pzem_measurement_received) { // no measurement received
if (rx_i<LENGTH(rx_buffer)) { // buffer is not full, thus no measurement received
return measurement;
}
if ((rx_buffer[0]&0xf0)!=0xa0) { // not a response received

14
main.c
View File

@ -358,12 +358,12 @@ void main(void)
led_on(); // indicate setup is complete
// variables for PZEM-004T meter measurements
struct sensor_pzem_measurement_t pzem_measurements[2][SENSOR_PZEM_MAX]; // PZEM-004T measurements (2 meters, all measurements)
struct sensor_pzem_measurement_t pzem_measurements[3][SENSOR_PZEM_MAX]; // PZEM-004T measurements (2 meters, all measurements)
uint8_t pzem_meter = 0; // PZEM-004T meter index (add to prefix)
uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type)
// variables for SDM120 meter measurements
float sdm120_measurements[2][SENSOR_SDM120_MEASUREMENT_MAX]; // SDM120 measurements (2 meters, all measurements)
float sdm120_measurements[3][SENSOR_SDM120_MEASUREMENT_MAX]; // SDM120 measurements (2 meters, all measurements)
uint8_t sdm120_meter = 0; // SDM120 meter index (add to 1 to get ID)
uint8_t sdm120_measurement = 0; // SDM120 measurement index
@ -396,6 +396,7 @@ void main(void)
}
}
while (sensor_pzem_measurement_received) { // measurement from electricity meter received
sensor_pzem_measurement_received = false; // clear flag
struct sensor_pzem_measurement_t measurement = sensor_pzem_measurement_decode(); // decode measurement
if (measurement.type>=SENSOR_PZEM_MAX) {
fprintf(stderr,"unknown measurement type: %u\n", measurement.type);
@ -513,15 +514,6 @@ void main(void)
}
}
}
while (button_flag) { // user pressed button
action = true; // action has been performed
printf("button pressed\n");
led_toggle(); // toggle LED
for (uint32_t i=0; i<1000000; i++) { // wait a bit to remove noise and double trigger
__asm__("nop");
}
button_flag = false; // reset flag
}
while (rtc_internal_tick_flag) { // the internal RTC ticked
rtc_internal_tick_flag = false; // reset flag
gpio_toggle(GPIO(LED_HEARTBEAT_PORT), GPIO(LED_HEARTBEAT_PIN)); // toggle heart beat LED to indicate if main function is stuck (do not toggle onboard the LED on PC13 on the blue pill board since this heavily influences the RTC)