307 lines
		
	
	
		
			No EOL
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			No EOL
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <user_code.hpp>
 | |
| 
 | |
| // AC Control Locking
 | |
| char AC_LOCK_TOPIC[75];
 | |
| char AC_LOCK_REPORT_TOPIC[75];
 | |
| #define AC_LOCK_ADDRESS 15002
 | |
| bool ac_lock = false;
 | |
| 
 | |
| // Display Componets
 | |
| NexButton up_bt = NexButton(1, 2, "up_bt");
 | |
| NexButton down_bt = NexButton(1, 3, "down_bt");
 | |
| NexButton mode_off_btn = NexButton(1, 4, "mode_off_btn");
 | |
| NexButton mode_fan_btn = NexButton(1, 5, "mode_fan_btn");
 | |
| NexButton mode_cool_btn = NexButton(1, 6, "mode_cool_btn");
 | |
| NexButton fan_auto_btn = NexButton(1, 7, "fan_auto_btn");
 | |
| NexButton fan_1_btn = NexButton(1, 8, "fan_1_btn");
 | |
| NexButton fan_2_btn = NexButton(1, 9, "fan_2_btn");
 | |
| NexButton fan_3_btn = NexButton(1, 10, "fan_3_btn");
 | |
| NexButton lt_bt = NexButton(1, 11, "lt_bt");
 | |
| NexButton fan_bt = NexButton(1, 12, "fan_bt");
 | |
| NexButton puri_bt = NexButton(1, 13, "puri_bt");
 | |
| 
 | |
| 
 | |
| // List of Component ID Message to listen to
 | |
| NexTouch *nex_listen_list[] =
 | |
|     {
 | |
|         <_bt,
 | |
|         &fan_bt,
 | |
|         &puri_bt,
 | |
|         &up_bt,
 | |
|         &down_bt,
 | |
|         &mode_off_btn,
 | |
|         &mode_fan_btn,
 | |
|         &mode_cool_btn,
 | |
|         &fan_auto_btn,
 | |
|         &fan_1_btn,
 | |
|         &fan_2_btn,
 | |
|         &fan_3_btn,
 | |
|         NULL};
 | |
| 
 | |
| /*
 | |
| This Code will run right after ESPMega PRO's
 | |
| Peripheral Initialization Routine
 | |
| */
 | |
| void user_pre_init()
 | |
| {
 | |
|     nexInit();
 | |
|     memcpy(AC_LOCK_REPORT_TOPIC, MQTT_BASE_TOPIC, 20);
 | |
|     strcat(AC_LOCK_REPORT_TOPIC, "/ac/lock");
 | |
|     memcpy(AC_LOCK_TOPIC, MQTT_BASE_TOPIC, 20);
 | |
|     strcat(AC_LOCK_TOPIC, "/ac/set/lock");
 | |
| }
 | |
| 
 | |
| /*
 | |
| This code will run after every component is initialized
 | |
| */
 | |
| void user_init()
 | |
| {
 | |
|     elcd.print("page dashboard");
 | |
|     elcd_sendstop();
 | |
|     ac_lock = ESPMega_FRAM.read8(AC_LOCK_ADDRESS);
 | |
|     ac_lock = ac_lock > 1 ? 0 : ac_lock;
 | |
|     elcd.print("dashboard.pic=");
 | |
|     elcd.print(ac_lock ? "2" : "1");
 | |
|     elcd_sendstop();
 | |
|     lt_bt.attachPop(lt_btn_cb, <_bt);
 | |
|     fan_bt.attachPop(fan_btn_cb, &fan_bt);
 | |
|     puri_bt.attachPop(puri_btn_cb, &puri_bt);
 | |
|     up_bt.attachPop(temp_up_btn_cb, &up_bt);
 | |
|     down_bt.attachPop(temp_down_btn_cb, &down_bt);
 | |
|     mode_off_btn.attachPop(mode_off_btn_cb, &mode_off_btn);
 | |
|     mode_fan_btn.attachPop(mode_fan_btn_cb, &mode_fan_btn);
 | |
|     mode_cool_btn.attachPop(mode_cool_btn_cb, &mode_cool_btn);
 | |
|     fan_auto_btn.attachPop(fan_auto_btn_cb, &fan_auto_btn);
 | |
|     fan_1_btn.attachPop(fan_1_btn_cb, &fan_1_btn);
 | |
|     fan_2_btn.attachPop(fan_2_btn_cb, &fan_2_btn);
 | |
|     fan_3_btn.attachPop(fan_3_btn_cb, &fan_3_btn);
 | |
|     ac_update_lcd();
 | |
|     pwm_update_lcd();
 | |
|     timer_tick_callback();
 | |
| }
 | |
| 
 | |
| /*
 | |
| This code will run once every event loop
 | |
| */
 | |
| void user_loop()
 | |
| {
 | |
|     nexLoop(nex_listen_list);
 | |
| }
 | |
| 
 | |
| /*
 | |
| This code will run when an input pin changed state
 | |
| */
 | |
| void virtual_interrupt_user_callback(int pin, int state)
 | |
| {
 | |
|     if (pin >= 0 & pin <= 7)
 | |
|     {
 | |
|         pwm_toggle(pin);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void pwm_changed_user_callback(int pin)
 | |
| {
 | |
|     pwm_update_lcd();
 | |
| }
 | |
| 
 | |
| /*
 | |
| This code will run every 15 seconds
 | |
| */
 | |
| void timer_tick_callback()
 | |
| {
 | |
|     rtctime_t time = ESPMega_getTime();
 | |
|     elcd.printf("clock.txt=\"%02d:%02d\"", time.hours, time.minutes);
 | |
|     elcd_sendstop();
 | |
| }
 | |
| 
 | |
| void lt_btn_cb(void *comp)
 | |
| {
 | |
|     cud_light_toggle();
 | |
| }
 | |
| void fan_btn_cb(void *comp)
 | |
| {
 | |
|     cud_fan_toggle();
 | |
| }
 | |
| void puri_btn_cb(void *comp)
 | |
| {
 | |
|     pwm_toggle(AIR_PURIFIER_PIN);
 | |
| }
 | |
| void temp_up_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|     {
 | |
|         ac_set_state(ac_get_mode(), ac_get_temperature() + 1, ac_get_fan_speed());
 | |
|     }
 | |
| }
 | |
| void temp_down_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|     {
 | |
|         ac_set_state(ac_get_mode(), ac_get_temperature() - 1, ac_get_fan_speed());
 | |
|     }
 | |
| }
 | |
| void mode_cool_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|         ac_set_state(1, ac_get_temperature(), ac_get_fan_speed());
 | |
| }
 | |
| void mode_fan_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|         ac_set_state(2, ac_get_temperature(), ac_get_fan_speed());
 | |
| }
 | |
| void mode_off_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|         ac_set_state(0, ac_get_temperature(), ac_get_fan_speed());
 | |
| }
 | |
| 
 | |
| void fan_auto_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|     {
 | |
|         ac_set_state(ac_get_mode(), ac_get_temperature(), 0);
 | |
|     }
 | |
| }
 | |
| void fan_1_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|     {
 | |
|         ac_set_state(ac_get_mode(), ac_get_temperature(), 3);
 | |
|     }
 | |
| }
 | |
| void fan_2_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|     {
 | |
|         ac_set_state(ac_get_mode(), ac_get_temperature(), 2);
 | |
|     }
 | |
| }
 | |
| void fan_3_btn_cb(void *comp)
 | |
| {
 | |
|     if (!ac_lock)
 | |
|     {
 | |
|         ac_set_state(ac_get_mode(), ac_get_temperature(), 1);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void cud_light_toggle()
 | |
| {
 | |
|     bool new_state = !cud_light_group_state();
 | |
|     pwm_set_state(LIGHT1_PIN, new_state);
 | |
|     pwm_set_state(LIGHT2_PIN, new_state);
 | |
|     pwm_set_state(LIGHT3_PIN, new_state);
 | |
|     pwm_set_state(LIGHT4_PIN, new_state);
 | |
| }
 | |
| bool cud_light_group_state()
 | |
| {
 | |
|     return pwm_get_state(LIGHT1_PIN) || pwm_get_state(LIGHT2_PIN) || pwm_get_state(LIGHT3_PIN) || pwm_get_state(LIGHT4_PIN);
 | |
| }
 | |
| void cud_fan_toggle()
 | |
| {
 | |
|     bool new_state = !cud_fan_group_state();
 | |
|     pwm_set_state(FAN1_PIN, new_state);
 | |
|     pwm_set_state(FAN2_PIN, new_state);
 | |
|     pwm_set_state(FAN3_PIN, new_state);
 | |
| }
 | |
| bool cud_fan_group_state()
 | |
| {
 | |
|     return pwm_get_state(FAN1_PIN) || pwm_get_state(FAN2_PIN) || pwm_get_state(FAN3_PIN);
 | |
| }
 | |
| 
 | |
| void ac_changed_user_callback(uint8_t mode, uint8_t temperature, uint8_t fan_speed)
 | |
| {
 | |
|     ac_update_lcd();
 | |
| }
 | |
| 
 | |
| void ac_update_lcd() {
 | |
|     uint8_t temperature = ac_get_temperature();
 | |
|     uint8_t mode = ac_get_mode();
 | |
|     uint8_t fan_speed = ac_get_fan_speed();
 | |
|     elcd_sendstop();
 | |
|     elcd.print("temp_txt.txt=\"");
 | |
|     elcd.print(temperature);
 | |
|     elcd.print("C\"");
 | |
|     elcd_sendstop();
 | |
|     elcd.print("mode_off_btn.pic=");
 | |
|     elcd.print(mode == 0 ? 14 : 13);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("mode_fan_btn.pic=");
 | |
|     elcd.print(mode == 2 ? 16 : 15);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("mode_cool_btn.pic=");
 | |
|     elcd.print(mode == 1 ? 18 : 17);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("fan_auto_btn.pic=");
 | |
|     elcd.print(fan_speed == 0 ? 20 : 19);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("fan_1_btn.pic=");
 | |
|     elcd.print(fan_speed == 3 ? 22 : 21);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("fan_2_btn.pic=");
 | |
|     elcd.print(fan_speed == 2 ? 24 : 23);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("fan_3_btn.pic=");
 | |
|     elcd.print(fan_speed == 1 ? 26 : 25);
 | |
|     elcd_sendstop();
 | |
| }
 | |
| 
 | |
| void ac_lock_callback(char* payload)
 | |
| {
 | |
|     if (!strcmp(payload,"lock"))
 | |
|     {
 | |
|         ac_lock = true;
 | |
|         ESPMega_FRAM.write8(AC_LOCK_ADDRESS, ac_lock);
 | |
|         elcd.print("dashboard.pic=");
 | |
|         elcd.print(ac_lock ? "2" : "1");
 | |
|         elcd_sendstop();
 | |
|     }
 | |
|     else if (!strcmp(payload,"unlock"))
 | |
|     {
 | |
|         ac_lock = false;
 | |
|         ESPMega_FRAM.write8(AC_LOCK_ADDRESS, ac_lock);
 | |
|         elcd.print("dashboard.pic=");
 | |
|         elcd.print(ac_lock ? "2" : "1");
 | |
|         elcd_sendstop();
 | |
|     }
 | |
|     ac_lock_report();
 | |
| }
 | |
| 
 | |
| void ac_lock_report() {
 | |
|     mqtt.publish(AC_LOCK_REPORT_TOPIC,ac_lock?"lock":"unlock");
 | |
| }
 | |
| 
 | |
| void elcd_sendstop() {
 | |
|     ESPMega_EXTLCD.write(0xFF);
 | |
|     ESPMega_EXTLCD.write(0xFF);
 | |
|     ESPMega_EXTLCD.write(0xFF);
 | |
| }
 | |
| 
 | |
| void pwm_update_lcd() {
 | |
|     elcd.print("lt_bt.pic=");
 | |
|     elcd.print(cud_light_group_state()?4:3);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("fan_bt.pic=");
 | |
|     elcd.print(cud_fan_group_state()?6:5);
 | |
|     elcd_sendstop();
 | |
|     elcd.print("puri_bt.pic=");
 | |
|     elcd.print(pwm_get_state(AIR_PURIFIER_PIN)?8:7);
 | |
|     elcd_sendstop();
 | |
| }
 | |
| 
 | |
| void mqtt_connected_user_callback() {
 | |
|     mqtt.subscribe(AC_LOCK_TOPIC);
 | |
|     ac_lock_report();
 | |
| }
 | |
| 
 | |
| void user_state_request_callback() {
 | |
|     ac_lock_report();
 | |
| 
 | |
| }
 | |
| 
 | |
| void user_mqtt_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length) {
 | |
|     if(!strcmp(topic,AC_LOCK_TOPIC)) {
 | |
|         ac_lock_callback(payload);
 | |
|     }
 | |
|         
 | |
| } |