Compare commits

..

10 Commits

Author SHA1 Message Date
2d15b5e7b5 wip: 2025-11-07 07:29:37 +03:00
37dd6b5a1e wip: 2025-10-12 20:30:39 +03:00
0786846040 wip: 2025-10-12 10:35:39 +03:00
b37586ff1a wip: 2025-10-11 12:54:25 +03:00
05ed2c3bb9 wip: 2025-10-11 12:24:25 +03:00
bfdd6ee8a1 wip: 2025-10-11 11:10:18 +03:00
b6b3c3f6af Merge branch 'dev' of http://git.zh.com.ru/aerotech/ate0003.000.000 into dev 2025-10-10 10:30:54 +03:00
93758b5f72 wip: 2025-10-10 10:30:52 +03:00
f0398e1222 wip: 2025-10-09 19:10:24 +03:00
8d813d7eab wip: 2025-10-09 10:36:48 +03:00
7 changed files with 86 additions and 69 deletions

View File

@@ -8,9 +8,9 @@
// #define DEBUG
#define SYSTEM_SETUP_STACK 170
#define ENCODER_STACK 166
#define PCF8574_STACK 109
#define SYSTEM_SETUP_STACK 189
#define ENCODER_STACK 165
#define PCF8574_STACK 105
const char *component_cmm[] = {component_1_cmm, component_2_cmm, component_3_cmm, component_4_cmm, component_5_cmm};
const char *component_line_1[] = {component_1_line_1, component_2_line_1, component_3_line_1, component_4_line_1, component_5_line_1};
@@ -34,6 +34,8 @@ FILE uart = FDEV_SETUP_STREAM(usart, NULL, _FDEV_SETUP_WRITE);
void system_setup_task(void *pvParameters);
void component_setup_function(uint8_t component);
void relay_on_function(uint8_t relay_number);
void relay_off_function(uint8_t relay_number);
TaskHandle_t system_setup_task_handle = {0};
@@ -49,7 +51,8 @@ zh_avr_encoder_handle_t component_encoder_handle = {0};
volatile static bool is_work = false; // Work status.
volatile static bool is_dmm = false; // DMM using status.
volatile static bool is_fix = false; // FIX button status.
volatile static uint8_t used_channels = 0; // Permitted channels. Depends of the selected component.
volatile static uint8_t permitted_channels = 0; // Permitted channels. Depends of the selected component.
volatile static uint8_t used_channels = 0; // Counter of currently enabled channels.
volatile static bool is_initialized = false; // Normal loading status.
volatile static bool is_num1_fixed = false; // NUM 1 button FIX status.
@@ -71,6 +74,14 @@ int main(void)
return 0;
}
#ifdef DEBUG
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
{
printf("Task %s Stack Owerflow.\n", pcTaskName);
printf("Free Heap %d.\n", xPortGetFreeHeapSize());
}
#endif
void system_setup_task(void *pvParameters)
{
char text_buffer[LCD_TEXT_BUFFER];
@@ -158,7 +169,7 @@ void system_setup_task(void *pvParameters)
zh_avr_encoder_set(&component_encoder_handle, 0);
//** AC dimmer init **/
zh_avr_ac_dimmer_init_config_t ac_dimmer_init_config = ZH_AVR_AC_DIMMER_INIT_CONFIG_DEFAULT();
ac_dimmer_init_config.ac_dimmer_frequency = ZH_400HZ;
ac_dimmer_init_config.ac_dimmer_frequency = ZH_50HZ;
ac_dimmer_init_config.zero_cross_port = AVR_PORTD;
ac_dimmer_init_config.zero_cross_gpio = PORTD3;
ac_dimmer_init_config.triac_port = AVR_PORTD;
@@ -167,8 +178,7 @@ void system_setup_task(void *pvParameters)
zh_avr_ac_dimmer_set(100);
is_initialized = true;
#ifdef DEBUG
printf("System Setup Task Remaining Stack Size %d.\n", uxTaskGetStackHighWaterMark(NULL));
printf("Free Heap %d.\n", xPortGetFreeHeapSize());
printf("%d.\n", uxTaskGetStackHighWaterMark(NULL));
#endif
vTaskDelete(NULL);
}
@@ -211,27 +221,22 @@ void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event)
}
break;
case NUM1_BUTTON:
if ((used_channels & CHANNEL1) == 0)
if ((permitted_channels & CHANNEL1) == 0)
{
break;
}
if (event->gpio_level == LOW)
{
is_work = true;
if (is_num1_fixed == true)
{
break;
}
zh_avr_pcf8574_write_gpio(&led1_handle, NUM1_LED_BLUE, LED_OFF);
zh_avr_pcf8574_write_gpio(&led1_handle, NUM1_LED_GREEN, LED_ON);
zh_avr_pcf8574_write_gpio(&relay_handle, L1_RELAY, RELAY_ON);
zh_avr_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_ON); // Temporary.
vTaskDelay(10); // Temporary.
zh_avr_ac_dimmer_start(); // Temporary.
relay_on_function(L1_RELAY);
}
else
{
is_work = false;
if (is_fix == true)
{
is_num1_fixed = true;
@@ -239,35 +244,27 @@ void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event)
}
zh_avr_pcf8574_write_gpio(&led1_handle, NUM1_LED_BLUE, LED_ON);
zh_avr_pcf8574_write_gpio(&led1_handle, NUM1_LED_GREEN, LED_OFF);
zh_avr_ac_dimmer_stop(); // Temporary.
vTaskDelay(10); // Temporary.
zh_avr_pcf8574_write_gpio(&relay_handle, L1_RELAY, RELAY_OFF);
zh_avr_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_OFF); // Temporary.
relay_off_function(L1_RELAY);
is_num1_fixed = false;
}
break;
case NUM2_BUTTON:
if ((used_channels & CHANNEL2) == 0)
if ((permitted_channels & CHANNEL2) == 0)
{
break;
}
if (event->gpio_level == LOW)
{
is_work = true;
if (is_num2_fixed == true)
{
break;
}
zh_avr_pcf8574_write_gpio(&led1_handle, NUM2_LED_BLUE, LED_OFF);
zh_avr_pcf8574_write_gpio(&led1_handle, NUM2_LED_GREEN, LED_ON);
zh_avr_pcf8574_write_gpio(&relay_handle, L2_RELAY, RELAY_ON);
zh_avr_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_ON); // Temporary.
vTaskDelay(10); // Temporary.
zh_avr_ac_dimmer_start(); // Temporary.
relay_on_function(L2_RELAY);
}
else
{
is_work = false;
if (is_fix == true)
{
is_num2_fixed = true;
@@ -275,32 +272,27 @@ void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event)
}
zh_avr_pcf8574_write_gpio(&led1_handle, NUM2_LED_BLUE, LED_ON);
zh_avr_pcf8574_write_gpio(&led1_handle, NUM2_LED_GREEN, LED_OFF);
zh_avr_ac_dimmer_stop(); // Temporary.
vTaskDelay(10); // Temporary.
zh_avr_pcf8574_write_gpio(&relay_handle, L2_RELAY, RELAY_OFF);
zh_avr_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_OFF); // Temporary.
relay_off_function(L2_RELAY);
is_num2_fixed = false;
}
break;
case NUM3_BUTTON:
if ((used_channels & CHANNEL3) == 0)
if ((permitted_channels & CHANNEL3) == 0)
{
break;
}
if (event->gpio_level == LOW)
{
is_work = true;
if (is_num3_fixed == true)
{
break;
}
zh_avr_pcf8574_write_gpio(&led2_handle, NUM3_LED_BLUE, LED_OFF);
zh_avr_pcf8574_write_gpio(&led2_handle, NUM3_LED_GREEN, LED_ON);
zh_avr_pcf8574_write_gpio(&relay_handle, L3_RELAY, RELAY_ON);
relay_on_function(L3_RELAY);
}
else
{
is_work = false;
if (is_fix == true)
{
is_num3_fixed = true;
@@ -308,29 +300,27 @@ void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event)
}
zh_avr_pcf8574_write_gpio(&led2_handle, NUM3_LED_BLUE, LED_ON);
zh_avr_pcf8574_write_gpio(&led2_handle, NUM3_LED_GREEN, LED_OFF);
zh_avr_pcf8574_write_gpio(&relay_handle, L3_RELAY, RELAY_OFF);
relay_off_function(L3_RELAY);
is_num3_fixed = false;
}
break;
case NUM4_BUTTON:
if ((used_channels & CHANNEL4) == 0)
if ((permitted_channels & CHANNEL4) == 0)
{
break;
}
if (event->gpio_level == LOW)
{
is_work = true;
if (is_num4_fixed == true)
{
break;
}
zh_avr_pcf8574_write_gpio(&led2_handle, NUM4_LED_BLUE, LED_OFF);
zh_avr_pcf8574_write_gpio(&led2_handle, NUM4_LED_GREEN, LED_ON);
zh_avr_pcf8574_write_gpio(&relay_handle, L4_RELAY, RELAY_ON);
relay_on_function(L4_RELAY);
}
else
{
is_work = false;
if (is_fix == true)
{
is_num4_fixed = true;
@@ -338,7 +328,7 @@ void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event)
}
zh_avr_pcf8574_write_gpio(&led2_handle, NUM4_LED_BLUE, LED_ON);
zh_avr_pcf8574_write_gpio(&led2_handle, NUM4_LED_GREEN, LED_OFF);
zh_avr_pcf8574_write_gpio(&relay_handle, L4_RELAY, RELAY_OFF);
relay_off_function(L4_RELAY);
is_num4_fixed = false;
}
break;
@@ -346,8 +336,7 @@ void zh_avr_pcf8574_event_handler(zh_avr_pcf8574_event_on_isr_t *event)
break;
}
#ifdef DEBUG
printf("PCF8574 Interrupt Task Remaining Stack Size %d.\n", uxTaskGetStackHighWaterMark(NULL));
printf("Free Heap %d.\n", xPortGetFreeHeapSize());
printf("%d.\n", uxTaskGetStackHighWaterMark(NULL));
#endif
}
@@ -368,8 +357,7 @@ void zh_avr_encoder_event_handler(zh_avr_encoder_event_on_isr_t *event)
break;
}
#ifdef DEBUG
printf("Encoder Interrupt Task Remaining Stack Size %d.\n", uxTaskGetStackHighWaterMark(NULL));
printf("Free Heap %d.\n", xPortGetFreeHeapSize());
printf("%d.\n", uxTaskGetStackHighWaterMark(NULL));
#endif
}
@@ -379,22 +367,17 @@ ISR(PCINT1_vect)
{
return;
}
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (zh_avr_encoder_isr_handler(&power_encoder_handle) == pdTRUE)
{
xHigherPriorityTaskWoken = pdTRUE;
portYIELD();
}
if (is_work == false)
{
if (zh_avr_encoder_isr_handler(&component_encoder_handle) == pdTRUE)
{
xHigherPriorityTaskWoken = pdTRUE;
}
}
if (xHigherPriorityTaskWoken == pdTRUE)
{
portYIELD();
}
}
}
ISR(PCINT2_vect)
@@ -403,13 +386,8 @@ ISR(PCINT2_vect)
{
return;
}
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
zh_avr_ac_dimmer_isr_handler();
if (zh_avr_pcf8574_isr_handler() == pdTRUE)
{
xHigherPriorityTaskWoken = pdTRUE;
}
if (xHigherPriorityTaskWoken == pdTRUE)
{
portYIELD();
}
@@ -418,7 +396,7 @@ ISR(PCINT2_vect)
void component_setup_function(uint8_t component)
{
char text_buffer[LCD_TEXT_BUFFER];
used_channels = component_channel[component];
permitted_channels = component_channel[component];
zh_avr_160x_set_cursor(&lcd_handle, 1, 10);
strcpy_P(text_buffer, component_cmm[component]);
zh_avr_160x_print_char(&lcd_handle, text_buffer);
@@ -430,20 +408,60 @@ void component_setup_function(uint8_t component)
zh_avr_160x_print_char(&lcd_handle, text_buffer);
zh_avr_pcf8574_write(&led1_handle, is_dmm == true ? 0xF9 : 0xFA);
zh_avr_pcf8574_write(&led2_handle, 0x0F);
if ((used_channels & CHANNEL1) == CHANNEL1)
if ((permitted_channels & CHANNEL1) == CHANNEL1)
{
zh_avr_pcf8574_write_gpio(&led1_handle, NUM1_LED_BLUE, LED_ON);
}
if ((used_channels & CHANNEL2) == CHANNEL2)
if ((permitted_channels & CHANNEL2) == CHANNEL2)
{
zh_avr_pcf8574_write_gpio(&led1_handle, NUM2_LED_BLUE, LED_ON);
}
if ((used_channels & CHANNEL3) == CHANNEL3)
if ((permitted_channels & CHANNEL3) == CHANNEL3)
{
zh_avr_pcf8574_write_gpio(&led2_handle, NUM3_LED_BLUE, LED_ON);
}
if ((used_channels & CHANNEL4) == CHANNEL4)
if ((permitted_channels & CHANNEL4) == CHANNEL4)
{
zh_avr_pcf8574_write_gpio(&led2_handle, NUM4_LED_BLUE, LED_ON);
}
}
void relay_on_function(uint8_t relay_number)
{
if (++used_channels > 1) // If any other channel already work.
{
zh_avr_ac_dimmer_stop();
vTaskDelay(1);
zh_avr_pcf8574_write_gpio(&relay_handle, relay_number, RELAY_ON);
vTaskDelay(10);
zh_avr_ac_dimmer_start();
}
else
{
is_work = true;
zh_avr_pcf8574_write_gpio(&relay_handle, relay_number, RELAY_ON);
zh_avr_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_ON);
vTaskDelay(10);
zh_avr_ac_dimmer_start();
}
}
void relay_off_function(uint8_t relay_number)
{
if (--used_channels > 0) // If any other channel already work.
{
zh_avr_ac_dimmer_stop();
vTaskDelay(1);
zh_avr_pcf8574_write_gpio(&relay_handle, relay_number, RELAY_OFF);
vTaskDelay(10);
zh_avr_ac_dimmer_start();
}
else
{
zh_avr_ac_dimmer_stop();
vTaskDelay(1);
zh_avr_pcf8574_write_gpio(&relay_handle, relay_number, RELAY_OFF);
zh_avr_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_OFF);
is_work = false;
}
}

View File

@@ -63,7 +63,6 @@ extern "C"
const char text_company[] PROGMEM = "LLC AEROTECH";
const char text_model[] PROGMEM = "ATE0003.000.000";
const char text_firmware[] PROGMEM = "Firmware v1.0.0";
// const char text_loading[] PROGMEM = "Loading:";
const char text_ac_power[] PROGMEM = "A/C POWER: ";
const char text_component[] PROGMEM = "COMPONENT: ";
@@ -74,7 +73,7 @@ extern "C"
const char component_5_cmm[] PROGMEM = "334612";
const char component_1_line_1[] PROGMEM = "1:RED 2:GREEN";
const char component_1_line_2[] PROGMEM = "3:BLUE 4:WHITE";
const char component_1_line_2[] PROGMEM = "3:ORANG 4:WHITE";
const char component_2_line_1[] PROGMEM = "1:N/A 2:LOGO ";
const char component_2_line_2[] PROGMEM = "3:N/A 4:N/A ";
const char component_3_line_1[] PROGMEM = "1:N/A 2:N/A ";