void TemperatureSwitch::set_state(STATE state) { if(state == this->current_state) return; // state did not change // state has changed switch(this->trigger) { case LEVEL: // switch on or off depending on HIGH or LOW set_switch(state == HIGH_TEMP); break; case RISING: // switch on if rising edge if(this->current_state == LOW_TEMP && state == HIGH_TEMP) set_switch(true); break; case FALLING: // switch off if falling edge if(this->current_state == HIGH_TEMP && state == LOW_TEMP) set_switch(false); break; } this->current_delay = state == HIGH_TEMP ? this->temperatureswitch_cooldown_poll : this->temperatureswitch_heatup_poll; this->current_state= state; }
void ICACHE_FLASH_ATTR gpio_init() { // Configure switch (relays) INFO("Configure Switch 1 %d\n", SWITCH01_GPIO ); PIN_FUNC_SELECT(SWITCH01_GPIO_MUX, SWITCH01_GPIO_FUNC); set_switch(SWITCH01_GPIO, 0); //GPIO_OUTPUT_SET(SWITCH01_GPIO, 0); INFO("Configure Switch 2 %d\n", SWITCH02_GPIO ); PIN_FUNC_SELECT(SWITCH02_GPIO_MUX, SWITCH02_GPIO_FUNC); set_switch(SWITCH02_GPIO, 0); //GPIO_OUTPUT_SET(SWITCH02_GPIO, 0); INFO("Configure Switch 3 %d\n", SWITCH03_GPIO ); PIN_FUNC_SELECT(SWITCH03_GPIO_MUX, SWITCH03_GPIO_FUNC); set_switch(SWITCH03_GPIO, 0); //GPIO_OUTPUT_SET(SWITCH03_GPIO, 0); //Configure Toggle switches INFO("Configure Toggle 1 %d\n", TOGGLE01_GPIO ); ETS_GPIO_INTR_DISABLE(); // Disable gpio interrupts ETS_GPIO_INTR_ATTACH(toggle_changed, 0); // GPIO interrupt handler PIN_FUNC_SELECT(TOGGLE01_GPIO_MUX, TOGGLE01_GPIO_FUNC); // Set function GPIO_DIS_OUTPUT(TOGGLE01_GPIO); // Set as input gpio_pin_intr_state_set(GPIO_ID_PIN(TOGGLE01_GPIO), GPIO_PIN_INTR_ANYEDGE); // Interrupt on any edge //ETS_GPIO_INTR_ENABLE(); // Enable gpio interrupts INFO("Configure Toggle 2 %d\n", TOGGLE02_GPIO ); //ETS_GPIO_INTR_DISABLE(); // Disable gpio interrupts //ETS_GPIO_INTR_ATTACH(toggle_changed); // GPIO interrupt handler PIN_FUNC_SELECT(TOGGLE02_GPIO_MUX, TOGGLE02_GPIO_FUNC); // Set function GPIO_DIS_OUTPUT(TOGGLE02_GPIO); // Set as input gpio_pin_intr_state_set(GPIO_ID_PIN(TOGGLE02_GPIO), GPIO_PIN_INTR_ANYEDGE); // Interrupt on any edge //ETS_GPIO_INTR_ENABLE(); // Enable gpio interrupts INFO("Configure Toggle 3 %d\n", TOGGLE03_GPIO ); //ETS_GPIO_INTR_DISABLE(); // Disable gpio interrupts //ETS_GPIO_INTR_ATTACH(toggle_changed); // GPIO interrupt handler PIN_FUNC_SELECT(TOGGLE03_GPIO_MUX, TOGGLE03_GPIO_FUNC); // Set function GPIO_DIS_OUTPUT(TOGGLE03_GPIO); // Set as input gpio_pin_intr_state_set(GPIO_ID_PIN(TOGGLE03_GPIO), GPIO_PIN_INTR_ANYEDGE); // Interrupt on any edge ETS_GPIO_INTR_ENABLE(); // Enable gpio interrupts // Configure push button // INFO("Confgiure push button %d\n", BUTTON_GPIO ); // ETS_GPIO_INTR_DISABLE(); // Disable gpio interrupts // ETS_GPIO_INTR_ATTACH(button_press, BUTTON_GPIO); // GPIO0 interrupt handler // PIN_FUNC_SELECT(BUTTON_GPIO_MUX, BUTTON_GPIO_FUNC); // Set function // GPIO_DIS_OUTPUT(BUTTON_GPIO); // Set as input // gpio_pin_intr_state_set(GPIO_ID_PIN(BUTTON_GPIO), 2); // Interrupt on negative edge // ETS_GPIO_INTR_ENABLE(); // Enable gpio interrupts }
static int handle_reset(void *driver, char *buf, int nr) { switch_driver *d = (switch_driver *) driver; switch_vlan_config *c = switch_parse_vlan(d, buf); int j; __u16 val16; if (c == NULL) return -EINVAL; /* disable switching */ set_switch(0); /* reset vlans */ for (j = 0; j <= ((robo.is_5350) ? VLAN_ID_MAX5350 : VLAN_ID_MAX); j++) { /* write config now */ val16 = (j) /* vlan */ | (1 << 12) /* write */ | (1 << 13) /* enable */; if (robo.is_5350) robo_write32(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE_5350, 0); else robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE, 0); robo_write16(ROBO_VLAN_PAGE, robo.is_5350 ? ROBO_VLAN_TABLE_ACCESS_5350 : ROBO_VLAN_TABLE_ACCESS, val16); } /* reset ports to a known good state */ for (j = 0; j < d->ports; j++) { robo_write16(ROBO_CTRL_PAGE, robo.port[j], 0x0000); robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_PORT0_DEF_TAG + (j << 1), 0); } /* enable switching */ set_switch(1); /* enable vlans */ handle_enable_vlan_write(driver, "1", 0); return 0; }
static int handle_enable_write(void *driver, char *buf, int nr) { set_switch(buf[0] == '1'); return 0; }
void ICACHE_FLASH_ATTR toggle_changed() { //TODO: Refactor this shit ETS_GPIO_INTR_DISABLE(); // Disable gpio interrupts uint32 gpio_status; gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); //INFO("TOGGLE: Toggle Switch %d pressed\n", index); if (gpio_status & BIT(TOGGLE01_GPIO)) { INFO("TOGGLE: Toggle Switch %d pressed\n", TOGGLE01_GPIO); if (switch01Status == 0) { set_switch(SWITCH01_GPIO, 1); } else { set_switch(SWITCH01_GPIO, 0); } } else if (gpio_status & BIT(TOGGLE02_GPIO)) { INFO("TOGGLE: Toggle Switch %d pressed\n", TOGGLE02_GPIO); if (switch02Status == 0) { set_switch(SWITCH02_GPIO, 1); } else { set_switch(SWITCH02_GPIO, 0); } } else if (gpio_status & BIT(TOGGLE03_GPIO)) { INFO("TOGGLE: Toggle Switch %d pressed\n", TOGGLE03_GPIO); if (switch03Status == 0) { set_switch(SWITCH03_GPIO,1); } else { set_switch(SWITCH03_GPIO,0); } } //Flip Status /* // Button interrupt received INFO("BUTTON: Button pressed\r\n"); // Button pressed, flip switch if (GPIO_REG_READ(BUTTON_GPIO) & BIT2) { INFO("BUTTON: Switch off\r\n"); GPIO_OUTPUT_SET(SWITCH03_GPIO, 0); } else { INFO("BUTTON: Switch on\r\n"); GPIO_OUTPUT_SET(SWITCH03_GPIO, 1); } // Send new status to the MQTT broker char *json_buf = NULL; json_buf = (char *)os_zalloc(jsonSize); json_ws_send((struct jsontree_value *)&device_tree, "device", json_buf); INFO("BUTTON: Sending current switch status\r\n"); MQTT_Publish(&mqttClient, config.mqtt_topic_s01, json_buf, strlen(json_buf), 0, 0); os_free(json_buf); json_buf = NULL; */ // Debounce os_delay_us(200000); // Clear interrupt status //uint32 gpio_status; //gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); ETS_GPIO_INTR_ENABLE(); // Enable gpio interrupts }
void ICACHE_FLASH_ATTR mqtt_data_cb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len) { char *topic_buf = (char*)os_zalloc(topic_len+1), *data_buf = (char*)os_zalloc(data_len+1); MQTT_Client* client = (MQTT_Client*)args; os_memcpy(topic_buf, topic, topic_len); topic_buf[topic_len] = 0; os_memcpy(data_buf, data, data_len); data_buf[data_len] = 0; INFO("MQTT: Received data on topic: \n%s\r\n", topic_buf); char strData[data_len + 1]; os_memcpy(strData, data, data_len); strData[data_len] = '\0'; int statusCommand = -1; INFO("MQTT: Data: %s\n", strData); if (!strcoll(strData, "on")) { statusCommand = 1; } else if (!strcoll(strData, "off")) { statusCommand = 0; } if (statusCommand == -1) return; if (!strcoll(topic_buf, config.mqtt_topic_s01)) { INFO("Switch %d %s\n", SWITCH01_GPIO, strData); set_switch(SWITCH01_GPIO, statusCommand); //GPIO_OUTPUT_SET(SWITCH01_GPIO, statusCommand); } else if (!strcoll(topic_buf, config.mqtt_topic_s02)) { INFO("Switch %d %s\n", SWITCH02_GPIO, strData); set_switch(SWITCH02_GPIO, statusCommand); //GPIO_OUTPUT_SET(SWITCH02_GPIO, statusCommand); } else if (!strcoll(topic_buf, config.mqtt_topic_s03)) { INFO("Switch %d %s\n", SWITCH03_GPIO, strData); set_switch(SWITCH03_GPIO, statusCommand); //GPIO_OUTPUT_SET(SWITCH03_GPIO, statusCommand); } //!strcoll(topic_buf, config.mqtt_topic_s02) || //!strcoll(topic_buf, config.mqtt_topic_s03)) { //struct jsontree_context js; //jsontree_setup(&js, (struct jsontree_value *)&device_tree, json_putchar); //json_parse(&js, data_buf); os_free(topic_buf); os_free(data_buf); }