Ejemplo n.º 1
0
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
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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);
}