add command to set energy value

This commit is contained in:
King Kévin 2017-01-22 16:49:27 +01:00
parent 0fcfb25f08
commit dc776f4ebe
1 changed files with 16 additions and 3 deletions

19
main.c
View File

@ -74,6 +74,7 @@ volatile bool rtc_internal_tick_flag = false; /**< flag set when internal RTC ti
#define DDM100TC_TIMER 4 /**< timer to measure time between pulses **/
#define DDM100TC_PORT B /**< timer ipnut capture port (TIM4_CH1=PB6) **/
#define DDM100TC_CAPTURE TIM4_CH1 /**< time input capture used to detect pulse **/
#define DDM100TC_RATE 1600 /**< number of impulse/kWh */
volatile uint32_t ddm100tc_interval = 0; /**< last time interval between pulses **/
/** @} */
@ -135,8 +136,8 @@ static void process_command(char* str)
// parse command
if (0==strcmp(word,"help")) {
printf("available commands:\n");
printf("led [on|off|toggle]\n");
printf("time [HH:MM:SS]\n");
printf("led on|off|toggle\n");
printf("energy <Wh>\n");
} else if (0==strcmp(word,"led")) {
word = strtok(NULL,delimiter);
if (!word) {
@ -153,6 +154,18 @@ static void process_command(char* str)
} else {
goto error;
}
} else if (0==strcmp(word,"energy")) {
word = strtok(NULL,delimiter);
if (!word) { // value required but not provided
goto error;
} else { // save energy value
uint64_t energy = (atol(word)*DDM100TC_RATE)/1000; // get value to save
pwr_disable_backup_domain_write_protect(); // enable backup register write
BKP_DR1 = (energy>>16); // set high 16 bits
BKP_DR2 = (energy&0xffff); // set low 16 bits
pwr_enable_backup_domain_write_protect(); // protect backup register from write
printf("energy value set\n"); // notify user
}
} else {
goto error;
}
@ -480,7 +493,7 @@ void main(void)
sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement
// calculate and show DDM100TC measurements (base on number of pulses and interval)
ddm100tc_value_energy = (uint32_t)((((BKP_DR1<<16)+BKP_DR2)*(uint64_t)1000)/1600); // the meter has 1600 impulses/kWh (use 64-bit calculation to not overflow after 2684354 Wh)
ddm100tc_value_energy = (uint32_t)((((BKP_DR1<<16)+BKP_DR2)*(uint64_t)1000)/DDM100TC_RATE); // the meter has 1600 impulses/kWh (use 64-bit calculation to not overflow after 2684354 Wh)
if (ddm100tc_interval==0) { // no measurements received yet
ddm100tc_value_power = 0;
} else {