int main(void) { DDRB |= _BV(PB0); // LED out PORTB |= _BV(PB3); //set CS for RFM12 high in case it is present DDRB |= _BV(PB3); init(); init_timer(); dimmer_init(); sei(); new_netvar_output_8(0x0000, 0x00, set_led, (void *) 0); new_netvar_output_8(0x0100, 0x50, set_dimmer, (void *) 0); new_netvar_output_8(0x0100, 0x51, set_dimmer, (void *) 1); new_netvar_output_8(0x0100, 0x52, set_dimmer, (void *) 2); new_netvar_output_8(0x0100, 0x53, set_dimmer, (void *) 3); new_lamp_controller(0x0100, 4); while (1) { can_handler(); if (ticks_in_ms >= 10) { cli(); ticks_in_ms -= 10; sei(); netvar_handle_events(); } } }
LOCAL void ICACHE_FLASH_ATTR dimmer_event(i2c_config *config) { LOCAL uint8 count = 0; i2c_status status; dimmer_config_data *config_data = (dimmer_config_data *)config->data; uint8 old_relay = config_data->relay; uint8 old_brightness = config_data->brightness; uint16 old_current = config_data->current; count++; uint8 addr = config->address; dimmer_init(&addr, &status); if ( status == I2C_OK && ( config_data->relay != old_relay || config_data->brightness != old_brightness || abs(config_data->current - old_current) > dimmer_threshold || (count > dimmer_each && config_data->current != old_current) ) ) { count = 0; char response[WEBSERVER_MAX_VALUE]; dimmer_response(config, response, false); user_event_raise(DIMMER_URL, response); } if (count > dimmer_each) { count = 0; } }
int main(void) { // watchdog is still enabled after a software reset and needs to be cleared immediately MCUSR = 0; wdt_disable(); //uart_init(UART_BAUD_SELECT_DOUBLE_SPEED(57600, F_CPU)); buttons_leds_init(); dimmer_init(); hm_init(); sei(); while(1) { hm_task(); } }
void wakeup(void) { if (!sleepmode) return; CLKPR = _BV(CLKPCE); CLKPR = 0; DEBUGP("waketime"); sleepmode = 0; // plugged in // wait to verify _delay_ms(20); if (ACSR & _BV(ACO)) return; // turn on pullups initbuttons(); dimmer_init(); // turn on boost brightness_level = eeprom_read_byte((uint8_t *)EE_BRIGHT); boost_init(brightness_level); // turn on vfd control vfd_init(); // turn on display VFDSWITCH_PORT &= ~_BV(VFDSWITCH); VFDBLANK_PORT &= ~_BV(VFDBLANK); volume = eeprom_read_byte((uint8_t *)EE_VOLUME); // reset speaker_init(); kickthedog(); setalarmstate(); // wake up sound beep(880, 1); beep(1760, 1); beep(3520, 1); kickthedog(); }
void ICACHE_FLASH_ATTR user_dimmer_init() { uint8 addr = 0; i2c_status status; #ifdef DIMMER_REV_A // DIMMER - Revision A stdout_disable(); #endif dimmer_init(&addr, &status); uint8 i; for (i=0; i<DIMMER_URLs_COUNT; i++) { webserver_register_handler_callback(DIMMER_URLs[i], dimmer_handler); } device_register(I2C, DIMMER_ID, DIMMER_URL, NULL, NULL); if (status == I2C_OK) { dimmer_timer_init(); } }
int main(void) { // uint8_t i; uint8_t mcustate; // turn boost off TCCR0B = 0; BOOST_DDR |= _BV(BOOST); BOOST_PORT &= ~_BV(BOOST); // pull boost fet low // check if we were reset mcustate = MCUSR; MCUSR = 0; wdt_disable(); // now turn it back on... 2 second time out //WDTCSR |= _BV(WDP0) | _BV(WDP1) | _BV(WDP2); //WDTCSR = _BV(WDE); wdt_enable(WDTO_2S); kickthedog(); // we lost power at some point so lets alert the user // that the time may be wrong (the clock still works) timeunknown = 1; // have we read the time & date from eeprom? restored = 0; // setup uart uart_init(BRRL_192); //DEBUGP("VFD Clock"); DEBUGP("!"); //DEBUGP("turning on anacomp"); // set up analog comparator ACSR = _BV(ACBG) | _BV(ACIE); // use bandgap, intr. on toggle! // settle! if (ACSR & _BV(ACO)) { // hmm we should not interrupt here ACSR |= _BV(ACI); // even in low power mode, we run the clock DEBUGP("clock init"); clock_init(); } else { // we aren't in low power mode so init stuff // init io's initbuttons(); VFDSWITCH_PORT &= ~_BV(VFDSWITCH); DEBUGP("turning on buttons"); // set up button interrupts DEBUGP("turning on alarmsw"); // set off an interrupt if alarm is set or unset EICRA = _BV(ISC00); EIMSK = _BV(INT0); displaymode = SHOW_TIME; DEBUGP("vfd init"); vfd_init(); dimmer_init(); DEBUGP("boost init"); brightness_level = eeprom_read_byte((uint8_t *)EE_BRIGHT); boost_init(brightness_level); sei(); region = eeprom_read_byte((uint8_t *)EE_REGION); DEBUGP("speaker init"); speaker_init(); beep(4000, 1); DEBUGP("clock init"); clock_init(); DEBUGP("alarm init"); setalarmstate(); } DEBUGP("done"); while (1) { //_delay_ms(100); kickthedog(); //uart_putc_hex(ACSR); if (ACSR & _BV(ACO)) { // DEBUGP("SLEEPYTIME"); gotosleep(); continue; } //DEBUGP("."); if (just_pressed & 0x1) { just_pressed = 0; switch(displaymode) { case (SHOW_TIME): displaymode = SET_ALARM; display_str("set alarm"); set_alarm(); break; case (SET_ALARM): displaymode = SET_TIME; display_str("set time"); set_time(); timeunknown = 0; break; case (SET_TIME): displaymode = SET_DATE; display_str("set date"); set_date(); break; case (SET_DATE): displaymode = SET_BRIGHTNESS; display_str("set brit"); set_brightness(); break; case (SET_BRIGHTNESS): displaymode = SET_DIMMER; display_str("set dimr"); set_dimmer(); break; case (SET_DIMMER): displaymode = SET_VOLUME; display_str("set vol "); set_volume(); break; case (SET_VOLUME): displaymode = SET_REGION; display_str("set regn"); set_region(); break; /* case (SET_REGION): displaymode = SET_SNOOZE; display_str("set snoz"); set_snooze(); break; */ default: displaymode = SHOW_TIME; } } else if ((just_pressed & 0x2) || (just_pressed & 0x4)) { just_pressed = 0; displaymode = NONE; display_date(DAY); kickthedog(); delayms(1500); kickthedog(); displaymode = SHOW_TIME; } } }