Compare commits
	
		
			24 commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
							 | 
						c4454d054a | ||
| 
							 | 
						b6e862d1d2 | ||
| 
							 | 
						ca27f6de89 | ||
| 
							 | 
						424312952c | ||
| 821e200874 | |||
| 
							 | 
						fb22e48d33 | ||
| 
							 | 
						8c01ccb18a | ||
| 
							 | 
						b05c75a0a1 | ||
| 
							 | 
						b4b1f12ba8 | ||
| 
							 | 
						4e36b9b3d1 | ||
| 
							 | 
						ffd695b209 | ||
| b4e15c6cae | |||
| 655b1e6f58 | |||
| b123f74953 | |||
| 54a75ac700 | |||
| 876fd3b84f | |||
| 7117579c6b | |||
| b416b68b16 | |||
| 766d1b7395 | |||
| 789729153e | |||
| 0c0e4b6af7 | |||
| c882db3327 | |||
| 2501e4ab2e | |||
| 
							 | 
						078bb5930f | 
							
								
								
									
										2
									
								
								Jenkinsfile
									
										
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
				
			
			@ -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'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/Rev1/Background.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 54 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/Rev1/Bar-Empty.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 924 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/Rev1/Bar-Full.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 903 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/Rev1/Bar-Off.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/Rev1/Off-IC.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 842 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/Rev1/Selector.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 719 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/bg-guide.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 82 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/bg.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 51 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/bgc.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 51 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/lightow1.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/lightrow2.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/airOff.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/airOn.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/fanAuto.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/fanHigh.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/fanLow.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/fanMid.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/lightoff.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/lighton.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/lv1off.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/lv1on.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/lv2off.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/lv2on.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/modeCool.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/modeDry.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/modeFan.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row1off.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row1on.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row2off.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row2on.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row3off.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row3on.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row4off.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/row4on.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/tempNeg-touched.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 244 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/tempNeg.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 225 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/tempPlus-touched.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 427 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/Images/mvp-v1/set1/tempPlus.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 531 B  | 
							
								
								
									
										
											BIN
										
									
								
								ise_display/fonts/Rajdhani-112-ascii.zi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								ise_display/fonts/Rajdhani-128-ascii.zi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								ise_display/fonts/Rajdhani-72-ascii.zi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								ise_display/fonts/Rajdhani-96-ascii.zi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								ise_display/fonts/arial_32_ascii.zi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								ise_display/ise_display.HMI
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								ise_display/ise_display_test2.HMI
									
										
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								ise_display/mvp_display_v1.HMI
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +41,7 @@
 | 
			
		|||
 | 
			
		||||
// IR Kit Configuration
 | 
			
		||||
#define IR_RECIEVE_PIN 35
 | 
			
		||||
#define IR_SEND_PIN 5
 | 
			
		||||
#define IR_SEND_PIN 17
 | 
			
		||||
#define MARK_EXCESS_MICROS 20
 | 
			
		||||
#define IR_RAW_BUFFER_LENGTH 750
 | 
			
		||||
#define AC_MAX_TEMPERATURE 30
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										307
									
								
								src/user_cud_code.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
        
 | 
			
		||||
}
 | 
			
		||||