Compare commits
24 Commits
Author | SHA1 | Date |
---|---|---|
reaw55 | c4454d054a | |
reaw55 | b6e862d1d2 | |
reaw55 | ca27f6de89 | |
reaw55 | 424312952c | |
Siwat Sirichai | 821e200874 | |
reaw55 | fb22e48d33 | |
reaw55 | 8c01ccb18a | |
reaw55 | b05c75a0a1 | |
reaw55 | b4b1f12ba8 | |
reaw55 | 4e36b9b3d1 | |
reaw55 | ffd695b209 | |
Siwat Sirichai | b4e15c6cae | |
Siwat Sirichai | 655b1e6f58 | |
Siwat Sirichai | b123f74953 | |
Siwat Sirichai | 54a75ac700 | |
Siwat Sirichai | 876fd3b84f | |
Siwat Sirichai | 7117579c6b | |
Siwat Sirichai | b416b68b16 | |
Siwat Sirichai | 766d1b7395 | |
Siwat Sirichai | 789729153e | |
Siwat Sirichai | 0c0e4b6af7 | |
Siwat Sirichai | c882db3327 | |
Siwat Sirichai | 2501e4ab2e | |
reaw55 | 078bb5930f |
|
@ -4,7 +4,7 @@ pipeline {
|
|||
stages {
|
||||
stage('Build') {
|
||||
steps {
|
||||
git branch: 'main', url: 'https://git.siwatsystem.com/ise-senior-iot/iot-firmware.git'
|
||||
git branch: 'ise', url: 'https://git.siwatsystem.com/ise-senior-iot/iot-firmware.git'
|
||||
sh 'export PLATFORMIO_PATH=/root/.platformio/penv/bin/platformio'
|
||||
sh '/usr/bin/python3 gen_release.py'
|
||||
stash includes: 'release/**/*', name: 'release_binaries'
|
||||
|
|
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 924 B |
After Width: | Height: | Size: 903 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 842 B |
After Width: | Height: | Size: 719 B |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 225 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 531 B |
|
@ -1,20 +1,179 @@
|
|||
#include <user_code.hpp>
|
||||
|
||||
//Timer Components
|
||||
ESPMega_Timer timer1(0, 50, timer1_callback, 15001);
|
||||
|
||||
uint8_t user_acmode = 0;
|
||||
// Display Componets
|
||||
// Link with Dual state button object with id 2 on page 1 named bt0
|
||||
NexDSButton bt0 = NexDSButton(1, 2, "bt0");
|
||||
NexButton light_toggle = NexButton(1,2,"light_toggle");
|
||||
NexButton row1_master = NexButton(1,11,"row1_master");
|
||||
NexButton row2_master = NexButton(1,12,"row2_master");
|
||||
NexButton row3_master = NexButton(1,14,"row3_master");
|
||||
NexButton row4_master = NexButton(1,13,"row4_master");
|
||||
NexButton row1_lv1 = NexButton(1,3,"row1_lv1");
|
||||
NexButton row1_lv2 = NexButton(1,4,"row1_lv2");
|
||||
NexButton row2_lv1 = NexButton(1,5,"row2_lv1");
|
||||
NexButton row2_lv2 = NexButton(1,6,"row2_lv2");
|
||||
NexButton row3_lv1 = NexButton(1,10,"row3_lv1");
|
||||
NexButton row3_lv2 = NexButton(1,7,"row3_lv2");
|
||||
NexButton row4_lv1 = NexButton(1,9,"row4_lv1");
|
||||
NexButton row4_lv2 = NexButton(1,8,"row4_lv2");
|
||||
NexButton temp_plus = NexButton(1,18,"temp_plus");
|
||||
NexButton temp_neg = NexButton(1,17,"temp_neg");
|
||||
NexButton fan = NexButton(1,16,"fan");
|
||||
NexButton mode = NexButton(1,15,"mode");
|
||||
NexButton ac_toggle = NexButton(1,1,"ac_toggle");
|
||||
NexText cur_temp = NexText(1,19,"cur_temp");
|
||||
// List of Component ID Message to listen to
|
||||
NexTouch *nex_listen_list[] =
|
||||
{
|
||||
&bt0,
|
||||
&light_toggle,
|
||||
&row1_master,
|
||||
&row2_master,
|
||||
&row3_master,
|
||||
&row4_master,
|
||||
&row1_lv1,
|
||||
&row1_lv2,
|
||||
&row2_lv1,
|
||||
&row2_lv2,
|
||||
&row3_lv1,
|
||||
&row3_lv2,
|
||||
&row4_lv1,
|
||||
&row4_lv2,
|
||||
&temp_plus,
|
||||
&temp_neg,
|
||||
&fan,
|
||||
&mode,
|
||||
&ac_toggle,
|
||||
NULL};
|
||||
|
||||
void bt0PopCallback(void *ptr)
|
||||
bool row_is_on(int light1_pin, int light2_pin) {
|
||||
return pwm_get_state(light1_pin) && pwm_get_state(light2_pin);
|
||||
}
|
||||
|
||||
void light_toggle_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(2);
|
||||
bool new_state = !row_is_on(ROW1_LIGHT1,ROW1_LIGHT2) && !row_is_on(ROW2_LIGHT1,ROW2_LIGHT2) && !row_is_on(ROW3_LIGHT1,ROW3_LIGHT2) && !row_is_on(ROW4_LIGHT1,ROW4_LIGHT2);
|
||||
pwm_set_state(ROW1_LIGHT1, new_state);
|
||||
pwm_set_state(ROW1_LIGHT2, new_state);
|
||||
pwm_set_state(ROW2_LIGHT1, new_state);
|
||||
pwm_set_state(ROW2_LIGHT2, new_state);
|
||||
pwm_set_state(ROW3_LIGHT1, new_state);
|
||||
pwm_set_state(ROW3_LIGHT2, new_state);
|
||||
pwm_set_state(ROW4_LIGHT1, new_state);
|
||||
pwm_set_state(ROW4_LIGHT2, new_state);
|
||||
}
|
||||
|
||||
void row1_lv1_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW1_LIGHT1);
|
||||
}
|
||||
|
||||
void row1_lv2_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW1_LIGHT2);
|
||||
}
|
||||
|
||||
void row2_lv1_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW2_LIGHT1);
|
||||
}
|
||||
|
||||
void row2_lv2_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW2_LIGHT2);
|
||||
}
|
||||
|
||||
void row3_lv1_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW3_LIGHT1);
|
||||
}
|
||||
|
||||
void row3_lv2_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW3_LIGHT2);
|
||||
}
|
||||
|
||||
void row4_lv1_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW4_LIGHT1);
|
||||
}
|
||||
|
||||
void row4_lv2_pop_callback(void *ptr)
|
||||
{
|
||||
pwm_toggle(ROW4_LIGHT2);
|
||||
}
|
||||
|
||||
void increase_temp() {
|
||||
uint8_t current_temp = ac_get_temperature();
|
||||
ac_set_state(ac_get_mode(), current_temp+1, ac_get_fan_speed());
|
||||
}
|
||||
|
||||
void decrease_temp() {
|
||||
uint8_t current_temp = ac_get_temperature();
|
||||
ac_set_state(ac_get_mode(), current_temp-1, ac_get_fan_speed());
|
||||
}
|
||||
|
||||
void temp_plus_pop_callback(void *ptr)
|
||||
{
|
||||
increase_temp();
|
||||
}
|
||||
|
||||
void temp_neg_pop_callback(void *ptr)
|
||||
{
|
||||
decrease_temp();
|
||||
}
|
||||
|
||||
void fan_pop_callback(void *ptr)
|
||||
{
|
||||
uint8_t current_fan_speed = ac_get_fan_speed();
|
||||
uint8_t new_fan_speed = (current_fan_speed + 1) % 4; // Loop back to 0 when reaching 3
|
||||
ac_set_state(ac_get_mode(), ac_get_temperature(), new_fan_speed);
|
||||
}
|
||||
|
||||
void mode_pop_callback(void *ptr)
|
||||
{
|
||||
uint8_t current_mode = ac_get_mode();
|
||||
uint8_t new_mode = (current_mode + 1) % 3; // Loop back to 0 when reaching 2
|
||||
ac_set_state(new_mode, ac_get_temperature(), ac_get_fan_speed());
|
||||
}
|
||||
|
||||
void ac_toggle_pop_callback(void *ptr)
|
||||
{
|
||||
//this function should set the state of the AC to toggle between off (mode 0) and the same state as before store in variable acmode
|
||||
if (ac_get_mode() == 0) {
|
||||
ac_set_state(user_acmode, ac_get_temperature(), ac_get_fan_speed());
|
||||
} else {
|
||||
user_acmode = ac_get_mode();
|
||||
ac_set_state(0, ac_get_temperature(), ac_get_fan_speed());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void row1_master_pop_callback(void *ptr)
|
||||
{
|
||||
bool new_state = !row_is_on(ROW1_LIGHT1,ROW1_LIGHT2);
|
||||
pwm_set_state(ROW1_LIGHT1, new_state);
|
||||
pwm_set_state(ROW1_LIGHT2, new_state);
|
||||
}
|
||||
|
||||
void row2_master_pop_callback(void *ptr)
|
||||
{
|
||||
bool new_state = !row_is_on(ROW2_LIGHT1,ROW2_LIGHT2);
|
||||
pwm_set_state(ROW2_LIGHT1, new_state);
|
||||
pwm_set_state(ROW2_LIGHT2, new_state);
|
||||
}
|
||||
|
||||
void row3_master_pop_callback(void *ptr)
|
||||
{
|
||||
bool new_state = !row_is_on(ROW3_LIGHT1,ROW3_LIGHT2);
|
||||
pwm_set_state(ROW3_LIGHT1, new_state);
|
||||
pwm_set_state(ROW3_LIGHT2, new_state);
|
||||
}
|
||||
|
||||
void row4_master_pop_callback(void *ptr)
|
||||
{
|
||||
bool new_state = !row_is_on(ROW4_LIGHT1,ROW4_LIGHT2);
|
||||
pwm_set_state(ROW4_LIGHT1, new_state);
|
||||
pwm_set_state(ROW4_LIGHT2, new_state);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -31,14 +190,27 @@ This code will run after every component is initialized
|
|||
*/
|
||||
void user_init()
|
||||
{
|
||||
timer1.begin();
|
||||
ESPMega_EXTLCD.print("page home");
|
||||
ESPMega_EXTLCD.write(0xFF);
|
||||
ESPMega_EXTLCD.write(0xFF);
|
||||
ESPMega_EXTLCD.write(0xFF);
|
||||
bt0.attachPop(bt0PopCallback, &bt0);
|
||||
elcd.print("page main");
|
||||
elcd_send_stop_bit();
|
||||
light_toggle.attachPop(light_toggle_pop_callback, &light_toggle);
|
||||
row1_lv1.attachPop(row1_lv1_pop_callback, &row1_lv1);
|
||||
row1_lv2.attachPop(row1_lv2_pop_callback, &row1_lv2);
|
||||
row2_lv1.attachPop(row2_lv1_pop_callback, &row2_lv1);
|
||||
row2_lv2.attachPop(row2_lv2_pop_callback, &row2_lv2);
|
||||
row3_lv1.attachPop(row3_lv1_pop_callback, &row3_lv1);
|
||||
row3_lv2.attachPop(row3_lv2_pop_callback, &row3_lv2);
|
||||
row4_lv1.attachPop(row4_lv1_pop_callback, &row4_lv1);
|
||||
row4_lv2.attachPop(row4_lv2_pop_callback, &row4_lv2);
|
||||
row1_master.attachPop(row1_master_pop_callback, &row1_master);
|
||||
row2_master.attachPop(row2_master_pop_callback, &row2_master);
|
||||
row3_master.attachPop(row3_master_pop_callback, &row3_master);
|
||||
row4_master.attachPop(row4_master_pop_callback, &row4_master);
|
||||
temp_plus.attachPop(temp_plus_pop_callback, &temp_plus);
|
||||
temp_neg.attachPop(temp_neg_pop_callback, &temp_neg);
|
||||
fan.attachPop(fan_pop_callback, &fan);
|
||||
mode.attachPop(mode_pop_callback, &mode);
|
||||
ac_toggle.attachPop(ac_toggle_pop_callback, &ac_toggle);
|
||||
}
|
||||
|
||||
/*
|
||||
This code will run once every event loop
|
||||
*/
|
||||
|
@ -54,12 +226,112 @@ void virtual_interrupt_user_callback(int pin, int state)
|
|||
{
|
||||
}
|
||||
|
||||
void update_lcd_row1() {
|
||||
bool master_state = row_is_on(ROW1_LIGHT1,ROW1_LIGHT2);
|
||||
row1_master.Set_background_image_pic(master_state?9:10);
|
||||
bool lt1_state = pwm_get_state(ROW1_LIGHT1);
|
||||
bool lt2_state = pwm_get_state(ROW1_LIGHT2);
|
||||
//also update the light1 and light2 buttons background to reflect the current state
|
||||
row1_lv1.Set_background_image_pic(lt1_state?5:6);
|
||||
row1_lv2.Set_background_image_pic(lt2_state?7:8);
|
||||
|
||||
}
|
||||
|
||||
void update_lcd_row2() {
|
||||
bool master_state = row_is_on(ROW2_LIGHT1,ROW2_LIGHT2);
|
||||
row2_master.Set_background_image_pic(master_state?11:12);
|
||||
bool lt1_state = pwm_get_state(ROW2_LIGHT1);
|
||||
bool lt2_state = pwm_get_state(ROW2_LIGHT2);
|
||||
//also update the light1 and light2 buttons background to reflect the current state
|
||||
row2_lv1.Set_background_image_pic(lt1_state?5:6);
|
||||
row2_lv2.Set_background_image_pic(lt2_state?7:8);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void update_lcd_row3() {
|
||||
bool master_state = row_is_on(ROW3_LIGHT1,ROW3_LIGHT2);
|
||||
row3_master.Set_background_image_pic(master_state?13:14);
|
||||
bool lt1_state = pwm_get_state(ROW3_LIGHT1);
|
||||
bool lt2_state = pwm_get_state(ROW3_LIGHT2);
|
||||
//also update the light1 and light2 buttons background to reflect the current state
|
||||
row3_lv1.Set_background_image_pic(lt1_state?5:6);
|
||||
row3_lv2.Set_background_image_pic(lt2_state?7:8);
|
||||
|
||||
}
|
||||
|
||||
void update_lcd_row4() {
|
||||
bool master_state = row_is_on(ROW4_LIGHT1,ROW4_LIGHT2);
|
||||
row4_master.Set_background_image_pic(master_state?15:16);
|
||||
bool lt1_state = pwm_get_state(ROW4_LIGHT1);
|
||||
bool lt2_state = pwm_get_state(ROW4_LIGHT2);
|
||||
//also update the light1 and light2 buttons background to reflect the current state
|
||||
row4_lv1.Set_background_image_pic(lt1_state?5:6);
|
||||
row4_lv2.Set_background_image_pic(lt2_state?7:8);
|
||||
|
||||
}
|
||||
|
||||
void update_toggle_button() {
|
||||
//calcuate the current state of the toggle button
|
||||
bool current_state = row_is_on(ROW1_LIGHT1,ROW1_LIGHT2) || row_is_on(ROW2_LIGHT1,ROW2_LIGHT2) || row_is_on(ROW3_LIGHT1,ROW3_LIGHT2) || row_is_on(ROW4_LIGHT1,ROW4_LIGHT2);
|
||||
light_toggle.Set_background_image_pic(current_state?3:4);
|
||||
}
|
||||
|
||||
void update_lcd_ac() {
|
||||
//update the current temperature
|
||||
char temp_str[3];
|
||||
sprintf(temp_str, "%d", ac_get_temperature());
|
||||
cur_temp.setText(temp_str);
|
||||
//update the fan speed auto is 18, high 19, medium 21, low 20
|
||||
// Fan Speed 0: Auto, 1: High, 2: Mid, 3: Low
|
||||
uint8_t fan_speed = ac_get_fan_speed();
|
||||
if(fan_speed == 0) {
|
||||
fan.Set_background_image_pic(18);
|
||||
} else if(fan_speed == 1) {
|
||||
fan.Set_background_image_pic(19);
|
||||
} else if(fan_speed == 2) {
|
||||
fan.Set_background_image_pic(21);
|
||||
} else if(fan_speed == 3) {
|
||||
fan.Set_background_image_pic(20);
|
||||
} else {
|
||||
fan.Set_background_image_pic(18);
|
||||
}
|
||||
//update the mode cool is 22, fan mode is 24, for off the toggle button act as indicator
|
||||
//Mode 0: Off, 1: Cool, 2: Fan
|
||||
uint8_t mode_state = ac_get_mode();
|
||||
mode.Set_background_image_pic(mode_state==1?22:24);
|
||||
//update the ac toggle button
|
||||
ac_toggle.Set_background_image_pic(ac_get_mode()==0?1:2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void pwm_changed_user_callback(int pin)
|
||||
{
|
||||
if (pin == 2)
|
||||
switch (pin)
|
||||
{
|
||||
// inform the lcd when pwm 2 changed
|
||||
bt0.setValue(pwm_get_state(2));
|
||||
case ROW1_LIGHT1:
|
||||
case ROW1_LIGHT2:
|
||||
update_lcd_row1();
|
||||
update_toggle_button();
|
||||
break;
|
||||
case ROW2_LIGHT1:
|
||||
case ROW2_LIGHT2:
|
||||
update_lcd_row2();
|
||||
update_toggle_button();
|
||||
break;
|
||||
case ROW3_LIGHT1:
|
||||
case ROW3_LIGHT2:
|
||||
update_lcd_row3();
|
||||
update_toggle_button();
|
||||
break;
|
||||
case ROW4_LIGHT1:
|
||||
case ROW4_LIGHT2:
|
||||
update_lcd_row4();
|
||||
update_toggle_button();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -70,15 +342,6 @@ void timer_tick_callback()
|
|||
{
|
||||
if (standalone)
|
||||
{
|
||||
timer1.loop();
|
||||
}
|
||||
}
|
||||
|
||||
void timer1_callback()
|
||||
{
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
pwm_set_state(i, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -96,4 +359,10 @@ void user_state_request_callback() {
|
|||
|
||||
void user_mqtt_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length) {
|
||||
|
||||
}
|
||||
|
||||
void elcd_send_stop_bit() {
|
||||
elcd.write(0xFF);
|
||||
elcd.write(0xFF);
|
||||
elcd.write(0xFF);
|
||||
}
|
|
@ -6,6 +6,22 @@
|
|||
#include "espmega_iot_timer.hpp"
|
||||
#include "espmega_iot_external_lcd.hpp"
|
||||
|
||||
// I/O Assignment
|
||||
// Available Inputs 0-15
|
||||
// Available Outputs 0-3, 7-11
|
||||
// There are 4 rows of lights
|
||||
// Each row has 2 lights
|
||||
// Each light has 2 states
|
||||
#define ROW1_LIGHT1 0
|
||||
#define ROW1_LIGHT2 1
|
||||
#define ROW2_LIGHT1 2
|
||||
#define ROW2_LIGHT2 3
|
||||
#define ROW3_LIGHT1 7
|
||||
#define ROW3_LIGHT2 8
|
||||
#define ROW4_LIGHT1 9
|
||||
#define ROW4_LIGHT2 10
|
||||
#define COMPUTER_DESK_CONTACTOR 12
|
||||
|
||||
// Bus Overclocking Configuration
|
||||
// Do not enable if you are using external I/O cards as it will cause signal integrity issues.
|
||||
// Choose only one mode
|
||||
|
@ -44,9 +60,38 @@
|
|||
// Analog Module Configuration
|
||||
#define ANALOG_REPORTING_INTERVAL 500
|
||||
|
||||
// User Defined Variables
|
||||
|
||||
// User Defined Functions
|
||||
void timer1_callback();
|
||||
void bt0PopCallback(void *ptr);
|
||||
#define elcd ESPMega_EXTLCD
|
||||
void elcd_send_stop_bit();
|
||||
bool row_is_on(int light1_pin, int light2_pin);
|
||||
void update_lcd_row1();
|
||||
void update_lcd_row2();
|
||||
void update_lcd_row3();
|
||||
void update_lcd_row4();
|
||||
void update_toggle_button();
|
||||
void light_toggle_pop_callback(void *ptr);
|
||||
void row1_lv1_pop_callback(void *ptr);
|
||||
void row1_lv2_pop_callback(void *ptr);
|
||||
void row2_lv1_pop_callback(void *ptr);
|
||||
void row2_lv2_pop_callback(void *ptr);
|
||||
void row3_lv1_pop_callback(void *ptr);
|
||||
void row3_lv2_pop_callback(void *ptr);
|
||||
void row4_lv1_pop_callback(void *ptr);
|
||||
void row4_lv2_pop_callback(void *ptr);
|
||||
void row1_master_pop_callback(void *ptr);
|
||||
void row2_master_pop_callback(void *ptr);
|
||||
void row3_master_pop_callback(void *ptr);
|
||||
void row4_master_pop_callback(void *ptr);
|
||||
void increase_temp();
|
||||
void decrease_temp();
|
||||
void temp_plus_pop_callback(void *ptr);
|
||||
void temp_neg_pop_callback(void *ptr);
|
||||
void fan_pop_callback(void *ptr);
|
||||
void mode_pop_callback(void *ptr);
|
||||
void ac_toggle_pop_callback(void *ptr);
|
||||
|
||||
|
||||
// User Defined IoT Core Callback Functions (Required)
|
||||
void user_mqtt_callback(char* topic, uint8_t topic_length, char* payload, unsigned int payload_length);
|
||||
|
|
|
@ -0,0 +1,307 @@
|
|||
#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);
|
||||
}
|
||||
|
||||
}
|