diff --git a/src/user_cud_code.cpp b/src/user_cud_code.cpp new file mode 100644 index 0000000..d0ee8f7 --- /dev/null +++ b/src/user_cud_code.cpp @@ -0,0 +1,307 @@ +#include + +// 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); + } + +} \ No newline at end of file