// This is an interrupts routine that handles the button press. // It has a 300ms debounce void button_handler() { int8_t v; // Make sure button is depressed for at least 50 us nrk_spin_wait_us(50); v=nrk_gpio_get(NRK_PORTD_0); if(v!=0) return; nrk_time_get(&button_cur_press); nrk_time_sub(&button_tmp_press, button_cur_press, button_last_press ); if(button_tmp_press.secs>=1 || button_tmp_press.nano_secs>=(300*NANOS_PER_MS)) { // Reboot the node... socket_0_disable(); power_socket_disable(0); nrk_int_disable(); while(1); if(socket_0_active==1) { plug_led_green_clr(); power_socket_disable(0); } else { plug_led_green_set(); power_socket_enable(0); } button_last_press.secs=button_cur_press.secs; button_last_press.nano_secs=button_cur_press.nano_secs; } }
int main () { uint16_t div; nrk_int_disable(); // Configure relay port directions DDRE |= 0x10; socket_0_enable(); // Configure led port directions DDRE |= 0x0c; DDRD |= 0x00; PORTD |= 0xff; DDRF = 0; socket_0_active=nrk_eeprom_read_byte(EEPROM_STATE_ADDR); // turn outlet on if active or throttled for testing if(socket_0_active==1 || socket_0_active==2) { socket_0_enable(); plug_led_green_set(); } else { socket_0_disable(); plug_led_green_clr(); } // If PUD value set, then we expect it wasn't a clean reboot (unexpected restart). // Try to force a proper watchdog reboot if((MCUCR&0x10)!=0 ) { //nrk_watchdog_enable(); nrk_int_disable(); MCUSR &= ~(1<<WDRF); WDTCSR |= (1<<WDCE) | (1<<WDE); WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP0); // Disable interrupts to stop pending timers etc while(1); } nrk_setup_uart (UART_BAUDRATE_115K2); MCUCR |= BM(PUD); nrk_init (); nrk_time_set (0, 0); tdma_set_error_callback(&tdma_error); tdma_task_config(); nrk_create_taskset (); nrk_start (); return 0; }
int8_t power_socket_disable (uint8_t socket) { if (socket == 0) { socket_0_disable (); socket_0_active = 0; nrk_int_disable(); nrk_eeprom_write_byte(EEPROM_STATE_ADDR, socket_0_active); nrk_int_enable(); } /* if (socket_1_active == 0 && socket_0_active == 0) { // Turn interrupt off to save power nrk_timer_int_stop (NRK_APP_TIMER_0); // Shutdown monitor circuit to save power power_mon_disable (); } */ return 1; }
int8_t power_socket_disable (uint8_t socket) { if (socket != 0 && socket != 1) return 0; if (socket == 0) { socket_0_disable (); socket_0_active = 0; } if (socket == 1) { socket_1_disable (); socket_1_active = 0; } if (socket_1_active == 0 && socket_0_active == 0) { // Turn interrupt off to save power nrk_timer_int_stop (NRK_APP_TIMER_0); // Shutdown monitor circuit to save power power_mon_disable (); } return 1; }
int main () { uint16_t div; // Configure relay port directions DDRE |= 0x10; socket_0_enable(); // Configure led port directions DDRE |= 0x0c; DDRD |= 0x00; PORTD |= 0xff; DDRF = 0; socket_0_active=nrk_eeprom_read_byte(EEPROM_STATE_ADDR); if(socket_0_active==1) { socket_0_enable(); plug_led_green_set(); } else { socket_0_disable(); plug_led_green_clr(); } MCUCR |= BM(PUD); nrk_setup_uart (UART_BAUDRATE_115K2); nrk_init (); nrk_time_set (0, 0); tdma_set_error_callback(&tdma_error); tdma_task_config(); nrk_create_taskset (); nrk_start (); return 0; }
void tx_task () { uint8_t j, i, val, cnt; int8_t len; int8_t v; nrk_sig_t tx_done_signal; nrk_sig_mask_t ret; send_ack=0; cal_done=0; printf ("tx_task PID=%d\r\n", nrk_get_pid ()); // Wait until the tx_task starts up bmac // This should be called by all tasks using bmac that power_init (); #ifndef DISABLE_BUTTON nrk_gpio_direction(NRK_BUTTON,NRK_PIN_INPUT ); nrk_ext_int_configure(NRK_EXT_INT_0, NRK_FALLING_EDGE, &button_handler ); nrk_ext_int_enable(NRK_EXT_INT_0); #endif v_center=((uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_V_MSB_ADDR))<<8 | (uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_V_LSB_ADDR); c_center=((uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C1_MSB_ADDR))<<8 | (uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C1_LSB_ADDR); c2_center=((uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C2_MSB_ADDR))<<8 | (uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C2_LSB_ADDR); if(((PIND & 0x1) == 0) || (v_center==0xffff) || (v_center==0x0) ) { // Get v_center and c_centers enough to grab calibration values v_center=512; c_center=512; c2_center=512; power_socket_enable(0); socket_0_disable(); plug_led_green_clr(); plug_led_red_clr(); for(i=0; i<3; i++ ) { plug_led_green_set(); nrk_wait_until_next_period(); plug_led_green_clr(); nrk_wait_until_next_period(); } plug_led_green_clr(); plug_led_red_clr(); for(i=0; i<5; i++ ) nrk_wait_until_next_period(); v_center=(v_p2p_high+v_p2p_low)/2; c_center=(c_p2p_high+c_p2p_low)/2; c2_center=(c_p2p_high2+c_p2p_low2)/2; nrk_eeprom_write_byte(EEPROM_CAL_V_MSB_ADDR, (uint8_t)(v_center>>8)); nrk_eeprom_write_byte(EEPROM_CAL_V_LSB_ADDR, (uint8_t)v_center&0xff); nrk_eeprom_write_byte(EEPROM_CAL_C1_MSB_ADDR, (uint8_t)(c_center>>8)); nrk_eeprom_write_byte(EEPROM_CAL_C1_LSB_ADDR, (uint8_t)c_center&0xff); nrk_eeprom_write_byte(EEPROM_CAL_C2_MSB_ADDR, (uint8_t)(c2_center>>8)); nrk_eeprom_write_byte(EEPROM_CAL_C2_LSB_ADDR, (uint8_t)c2_center&0xff); nrk_eeprom_write_byte(EEPROM_ENERGY1_0_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_1_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_2_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_3_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_4_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_5_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_6_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_7_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_0_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_1_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_2_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_3_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_4_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_5_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_6_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_7_ADDR, 0); //plug_led_green_set(); //socket_0_enable(); //power_socket_enable(0); // Set default power threshold set_power_thresh(DEFAULT_POWER_THRESH); power_socket_disable(0); socket_0_disable(); }
void tx_task () { uint8_t j, i, val, cnt; int8_t len; int8_t v; nrk_sig_t tx_done_signal; nrk_sig_mask_t ret; cal_done=0; printf ("tx_task PID=%d\r\n", nrk_get_pid ()); // Wait until the tx_task starts up bmac // This should be called by all tasks using bmac that power_init (); v_center=((uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_V_MSB_ADDR))<<8 | (uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_V_LSB_ADDR); c_center=((uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C1_MSB_ADDR))<<8 | (uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C1_LSB_ADDR); c2_center=((uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C2_MSB_ADDR))<<8 | (uint16_t)nrk_eeprom_read_byte(EEPROM_CAL_C2_LSB_ADDR); if(((PIND & 0x1) == 0) || (v_center==0xffff) || (v_center==0x0) ) { // Get v_center and c_centers enough to grab calibration values v_center=512; c_center=512; c2_center=512; power_socket_enable(0); socket_0_disable(); plug_led_green_clr(); plug_led_red_clr(); for(i=0; i<3; i++ ) { plug_led_green_set(); nrk_wait_until_next_period(); plug_led_green_clr(); nrk_wait_until_next_period(); } plug_led_green_clr(); plug_led_red_clr(); for(i=0; i<5; i++ ) nrk_wait_until_next_period(); v_center=(v_p2p_high+v_p2p_low)/2; c_center=(c_p2p_high+c_p2p_low)/2; c2_center=(c_p2p_high2+c_p2p_low2)/2; nrk_eeprom_write_byte(EEPROM_CAL_V_MSB_ADDR, (uint8_t)(v_center>>8)); nrk_eeprom_write_byte(EEPROM_CAL_V_LSB_ADDR, (uint8_t)v_center&0xff); nrk_eeprom_write_byte(EEPROM_CAL_C1_MSB_ADDR, (uint8_t)(c_center>>8)); nrk_eeprom_write_byte(EEPROM_CAL_C1_LSB_ADDR, (uint8_t)c_center&0xff); nrk_eeprom_write_byte(EEPROM_CAL_C2_MSB_ADDR, (uint8_t)(c2_center>>8)); nrk_eeprom_write_byte(EEPROM_CAL_C2_LSB_ADDR, (uint8_t)c2_center&0xff); nrk_eeprom_write_byte(EEPROM_ENERGY1_0_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_1_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_2_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_3_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_4_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_5_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_6_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY1_7_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_0_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_1_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_2_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_3_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_4_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_5_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_6_ADDR, 0); nrk_eeprom_write_byte(EEPROM_ENERGY2_7_ADDR, 0); plug_led_green_set(); socket_0_enable(); power_socket_enable(0); }