Jelajahi Sumber

Добавил консольное меню.

unknown 1 Minggu lalu
induk
melakukan
a1758860fb

+ 29 - 8
desk/modules/configs/config.h

@@ -4,15 +4,15 @@
 #include "stm32g4xx_hal.h"
 
 
-#define FW_VERSION          "1.0"
+#define FW_VERSION                  "1.0"
 
-#define SETTINGS_ADDR       0x08000000 + (63 * 2048)  //0x01F7FF
+#define SETTINGS_ADDR               0x08000000 + (63 * 2048)  //0x01F7FF
 
 // Ключ для контроля сектора настроек
-#define SETTINGS_KEY            123456789
+#define SETTINGS_KEY                123456789
 
 // Страница настроек
-#define SETTINGS_PAGE           63
+#define SETTINGS_PAGE               63
 
 // Возвращает адрес страницы по номеру страницы
 #define GET_PAGE_ADDR(x)            ((uint32_t)(0x08000000 + 0x800 * (x)))
@@ -24,13 +24,34 @@
 #define GET_SETTINGS_KEY_ADDR(x)    (GET_PAGE_ADDR(SETTINGS_PAGE + 1) - 16)
 
 // Возвращает адрес CRC структуры настроек во флеш памяти по номеру страницы
-#define GET_SETTINGS_CRC_ADDR(x) (GET_PAGE_ADDR(SETTINGS_PAGE + 1) - 8)
-
+#define GET_SETTINGS_CRC_ADDR(x)    (GET_PAGE_ADDR(SETTINGS_PAGE + 1) - 8)
 
 
 /* @note All the executable code is mapped in SRAM1 area */
-#define FLASH_USER_START_ADDR   ADDR_FLASH_PAGE_0   /* Start @ of user Flash area */
-#define FLASH_USER_END_ADDR     (ADDR_FLASH_PAGE_63 + FLASH_PAGE_SIZE - 1)   /* End @ of user Flash area */
+#define FLASH_USER_START_ADDR       ADDR_FLASH_PAGE_0   /* Start @ of user Flash area */
+#define FLASH_USER_END_ADDR         (ADDR_FLASH_PAGE_63 + FLASH_PAGE_SIZE - 1)   /* End @ of user Flash area */
+
+
+// Софтверный фильтр для энкодера в меню
+#define ENC_SOFT_FILTER_CNT         3
+
+// Фильтр антидребезга для кнопки энкодера
+#define BUTTON_GLICH_TIMEOUT        50
+
+// Стрелки клавиатуры "a", "s", "d" управляют меню в консоли
+#define KEYBOARD_MENU   
+
+// Коэффициент 1, верхний порог
+#define FACTOR_1_UP_THR     1050
+
+// Коэффициент 1, нижний порог
+#define FACTOR_1_DOWN_THR   950
+
+// Коэффициент 2, верхний порог
+#define FACTOR_2_UP_THR     2050
+
+// Коэффициент 2, нижний порог
+#define FACTOR_2_DOWN_THR   1950
 
 
 #endif /* #ifndef __CONFIG_H */

+ 0 - 114
desk/modules/menu/control.cpp

@@ -91,16 +91,6 @@ void init_gpio_encoder(void)
     
 }
 
-//
-//static void vUpdate(void const *params)
-void vControl(void const *params)
-{
-    for (;;)
-    {
-        vTaskDelay(1000);
-    }
-}
-
 
 extern "C" {
 void TIM2_IRQHandler(void)
@@ -113,107 +103,3 @@ void EXTI4_IRQHandler(void)
     HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
 }
 }
-
-
-#if 0
-//
-void MENU_ControlInit(void)
-{
-    MENU_EncoderInit();
-    //buz_timer = xTimerCreate("Buzzer tim", BEEP_TIME, pdFALSE, (void *) 0, buz_timer_cb);
-
-    semphEncoder = xSemaphoreCreateBinary();
-    encInit = true;
-}
-
-//
-void MENU_EncoderInit(void)
-{
-    GPIO_InitTypeDef        GPIO_InitStructure;
-    TIM_TimeBaseInitTypeDef TIMER_InitStructure;
-    NVIC_InitTypeDef        NVIC_InitStructure;
-    
-    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
-    
-    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
-    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
-    GPIO_Init(GPIOA, &GPIO_InitStructure);
-    
-    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; 
-    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
-    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-    NVIC_Init(&NVIC_InitStructure);
-    
-    TIM_TimeBaseStructInit(&TIMER_InitStructure);
-    TIMER_InitStructure.TIM_Period = 1;
-    TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up | TIM_CounterMode_Down;
-    TIM_TimeBaseInit(TIM1, &TIMER_InitStructure);
- 
-    TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
-    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
-    TIM_Cmd(TIM1, ENABLE);
-}
-
-
-extern "C" {
-  
-void TIM1_UP_IRQHandler(void)
-{
-    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
-    
-    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
-    {
-        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
-        encDir = (TIM1->CR1 & TIM_CR1_DIR ? true : false);
-
-        if (!encInit)
-            return;
-        
-        xSemaphoreGiveFromISR(semphEncoder, &xHigherPriorityTaskWoken);
-    }
-}
-
-}
-
-
-  
-//
-void vEncoder(void *params)
-{
-    static uint8_t encRightCnt = 0;
-    static uint8_t encLeftCnt = 0;
-    
-    for (;;)
-    {
-        xSemaphoreTake(semphEncoder, portMAX_DELAY);
-        
-        if (encDir) 
-        {
-            encLeftCnt = 0;
-            if (++encRightCnt > ENC_SOFT_FILTER_CNT) {
-                encRightCnt = 0;
-                button_right();
-                
-                //BUZZER_ON
-                //xTimerStart(buz_timer, 0);
-                //DBG printf("Turn right\r\n");
-            }
-        }
-        else 
-        {
-            encRightCnt = 0;
-            if (++encLeftCnt > ENC_SOFT_FILTER_CNT) {
-                encLeftCnt = 0;
-                button_left();
-
-                //BUZZER_ON
-                //xTimerStart(buz_timer, 0);
-                //DBG printf("Turn left\r\n");
-            }
-        }
-    }   // for (;;)
-}  
-#endif

+ 16 - 32
desk/modules/menu/menu.cpp

@@ -2,6 +2,7 @@
 #include "cmsis_os.h"
 #include "menu_tree.h"
 #include "control.h"
+#include "uart_bridge.h"
 #include <stdio.h>
 
 #define DBG if(0)
@@ -16,7 +17,6 @@ osThreadId  menu_control_handle;
 menuItem* selectedMenuItem;
 bool update_flag = false;
 
-static void vControl(void const *params);
 static void vUpdate(void const *params);
 static osStatus menu_block(uint32_t ms);
 static void menu_unblock(void);
@@ -25,15 +25,6 @@ static void menu_unblock(void);
 //
 void menu_init(void)
 {
-#if 0  
-    // Очередь для событий кнопок
-    osMessageQDef(vButEventQueue, 1, uint8_t);
-    v_queue_event = osMessageCreate(osMessageQ(vButEventQueue), NULL);
-    
-    // Обработка событий
-    osThreadDef(M_Event_Thread, vMenuEvent, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
-    v_task_event_handle = osThreadCreate(osThread(M_Event_Thread), NULL);
-#endif
     
     // Очередь для управляющих сигналов меню
     osMessageQDef(vButEventQueue, 1, uint8_t);
@@ -42,26 +33,18 @@ void menu_init(void)
     // Mutex для блокировки меню
     osMutexDef(menu_mut);
     menu_mutex  = osMutexCreate(osMutex(menu_mut));   
-    
+
     // События. Сигналы энкодера
-    osThreadDef(control_thr, vControl, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
+    osThreadDef(control_thr, vControl, osPriorityNormal, 0, 2*configMINIMAL_STACK_SIZE);
     menu_control_handle = osThreadCreate(osThread(control_thr), NULL);
     
     // Обновление меню
-    osThreadDef(menu_up_thr, vUpdate, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
+    osThreadDef(menu_up_thr, vUpdate, osPriorityNormal, 0, 2*configMINIMAL_STACK_SIZE);
     menu_update_handle = osThreadCreate(osThread(menu_up_thr), NULL);
     
     // Начальный экран
     selectedMenuItem = (menuItem *) &m_main;
     (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
-
-#if 0        
-    osTimerDef(vSoundTimer, v_sound_tim);
-	v_sound_timer_handle = osTimerCreate(osTimer(vSoundTimer), osTimerOnce, NULL);
-    
-    osMutexDef(menu_mut);
-    v_menu_mutex_id = osMutexCreate(osMutex(menu_mut));      
-#endif    
 }
 
 //
@@ -88,10 +71,6 @@ static void vControl(void const *params)
                 DBG printf("Encoder forward\r\n");
                 if (menu_block(0) == osOK) {
                     button_right();
-                  
-                    //(*(selectedMenuItem->func_button_down))();
-                    //(*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
-                    
                     menu_unblock();
                 }
             break;
@@ -100,16 +79,16 @@ static void vControl(void const *params)
                 DBG printf("Encoder back\r\n");
                 if (menu_block(0) == osOK) {
                     button_left();
-                  
-                    //(*(selectedMenuItem->func_button_down))();
-                    //(*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
-                    
                     menu_unblock();
                 }
             break;
             
             case CONTROL_PUSH :
-                printf("Encoder push");
+                DBG printf("Encoder push");
+                if (menu_block(0) == osOK) {
+                    menuFocus();
+                    menu_unblock();
+                }
             break;
         }
     
@@ -121,13 +100,18 @@ static void vUpdate(void const *params)
 {
     for (;;)
     {
+        osDelay(MON_DELAY);
+        
+#if 0        
+        // Имитация изменения счетчиков для теста
+        inc_raw_counters();
+#endif        
+        
         // Текущий экран меню нужно перерисовать
         if (update_flag)
         {
             (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
         }
-        
-        osDelay(MON_DELAY);
     }
 }
 

+ 33 - 164
desk/modules/menu/menu.h

@@ -1,7 +1,7 @@
 #ifndef __MENU_H
 #define __MENU_H
 
-
+//
 typedef enum 
 {
     CONTROL_FWD = 0,
@@ -10,6 +10,18 @@ typedef enum
     
 } control_t;
 
+//
+typedef enum
+{
+    MCELL_NULL = 0,
+    MCELL_MAIN,     // Главный экран
+    MCELL_K1,       // Коэффициент
+    MCELL_K2,       // Коэффициент
+    MCELL_REV,      // Реверс
+    MCELL_RES,      // Сброс счетчиков
+    MCELL_SAVE,     // Сохранить настройки
+} menu_cell_t;
+
 
 //
 void menu_init(void);
@@ -51,13 +63,18 @@ extern menuItem* selectedMenuItem;
 #define CHILD      (selectedMenuItem->Child)
 #define SELECT	   (selectedMenuItem->Select)
 
+// -------------------------------------------------------------------------- //    
+// Отрисовка
     
-// Главное меню. Отрисовка.
+// Главный экран
 void draw_main(uint8_t sel);
 
-// Экран с настройкми. Отрисовка.
+// Экран с настройками
 void draw_settings(uint8_t sel);
 
+// -------------------------------------------------------------------------- //
+// Функции кнопок
+
 //
 void button_left(void);
 
@@ -73,179 +90,31 @@ void menuFocus(void);
 //
 extern void menuChange(void* NewMenu, bool direction);
 
-
-
-
-
-//
-void empty_func_bool(bool);
-    
-
-    
-    
-    
-    
-    
-    
-void empty_func(void);
-void draw_logo(uint8_t sel);
-
-
-
-// Измерения. Отрисовка.
-void draw_meas(uint8_t sel);
-
-// Диалог для измерения дозы
-void draw_dose_dialog(uint8_t sel);
-
-// Настройка порогов
-void draw_threshold(uint8_t sel);
-
-// Время. Отрисовка.
-void draw_time(uint8_t sel);
-
-// Дата. Отрисовка.
-void draw_data(uint8_t sel);
-
-// Подсветка. Отрисовка.
-void draw_blight(uint8_t sel);
-
-// Звук. Отрисовка.
-void draw_sound(uint8_t sel);
-
-// Обновление. Отрисовка.
-void draw_update(uint8_t sel);
-
-// Журнал. Отрисовка.
-void draw_log(uint8_t sel);
-
 // -------------------------------------------------------------------------- //
+// Изменение параметров. Отрисовка. 
 
 //
-void menu_change_blight(uint8_t sel);
-//
-void menu_change_sound(uint8_t sel);
-//
-void menu_change_log(uint8_t sel);
-
-// -------------------------------------------------------------------------- //
-// Menu functions
-
-
+void change_factor_1(bool dir);
 
 //
-void button_sel_1(void);
-//
-void button_gamma_thr_set_sel(void);
-//
-void button_beta_thr_set_sel(void);
-//
-void button_dose_thr_set_sel(void);
-//
-void button_thr_sel(void);
-//
-void button_log_sel(void);
-//
-void button_time_sel(void);
-//
-void button_time_set_sel(void);
-//
-void button_data_set_sel(void);
-//
-void button_start_measuring(void);
-//
-void button_start_dose(void);
-//
-void button_settings(void);
-//
-void button_shutdown(void);
-//
-void button_down_1(void);
-//
-void button_up_down_dose(void);
-//
-void button_up_1(void);
-//
-void but_time_up(void);
-//
-void but_time_down(void);
-//
-void but_exit_1(void);
-//
-void but_exit_meas(void);
-//
-void button_sel_blight(void);
-//
-void button_exit_blight(void);
-//
-void button_exit_sound(void);
-//
-void button_exit_log(void);
-//
-void button_sel_sound(void);
-//
-void button_sel_update(void);
-//
-void button_sel_log(void);
-//
-void button_sel_log_period(void);
-//
-void draw_gamma_tr_up(void);
-//
-void draw_gamma_tr_down(void);
-//
-void draw_gamma_right(void);
-//
-void draw_gamma_left(void);
-//
-void draw_beta_tr_up(void);
-//
-void draw_beta_tr_down(void);
-//
-void draw_beta_right(void);
-//
-void draw_beta_left(void);
-//
-void draw_dose_tr_up(void);
-//
-void draw_dose_tr_down(void);
-//
-void draw_dose_right(void);
-//
-void draw_dose_left(void);
-//
-void draw_time_up(void);
-//
-void draw_time_down(void);
-//
-void draw_data_up(void);
-//
-void draw_data_down(void);
-//
-void draw_time_right(void);
-//
-void draw_time_left(void);
-//
-void draw_log_up(void);
-//
-void draw_log_down(void);
-//
-void draw_log_right(void);
-//
-void draw_log_left(void);
-
+void change_factor_2(bool dir);
 
 //
-//osStatus menu_block(uint32_t ms);
+void change_revers(bool dir);
 
-//
-void menu_unblock(void);
+// -------------------------------------------------------------------------- //
+// Заглушки
 
+//
+void empty_func_bool(bool);
+    
+//    
+void empty_func(void);
 
-extern void menuChange(const menuItem* NewMenu);
+// -------------------------------------------------------------------------- //
 
-//extern osTimerId       v_sound_timer_handle;
 
+//extern void menuChange(const menuItem* NewMenu);
 
 #endif  // __MENU_H
 

+ 0 - 1
desk/modules/menu/menu_functions.cpp

@@ -1,7 +1,6 @@
 #include "stm32g4xx_hal.h"
 #include "menu_functions.h"
 #include "menu_items.h"
-//#include "menu_string.h"
 #include "menu.h"
 #include "config.h"
 #include "FreeRTOS.h"

+ 174 - 36
desk/modules/menu/menu_items.cpp

@@ -1,9 +1,11 @@
 #include "stm32g4xx_hal.h"
-#include "menu_items.h"
-//#include "menu_tree.h"
 #include "FreeRTOS.h"
 #include "task.h"
+#include "menu_items.h"
 #include "menu.h"
+#include "config.h"
+#include "settings.h"
+#include "uart_bridge.h"
 #include <string.h>
 #include <stdio.h>
 
@@ -11,33 +13,16 @@
 
 extern bool update_flag;
 
+#ifdef KEYBOARD_MENU
 
-// Главное меню. Отрисовка.
-void draw_main(uint8_t sel)
-{
-    static int counter = 0;
-    update_flag = true;
-    
-    DBG printf("\033c");
-    DBG printf("This is main screen\r\n");
-    DBG printf("Test counter: %u\r\n", counter++);
-    
-}
+#define CLI_BUF_LEN     30
+char cli_str_buf[CLI_BUF_LEN];
 
-//
-void draw_settings(uint8_t sel)
-{
-    update_flag = true;
-    
-    DBG printf("\033c");
-    
-    DBG printf("Factor 1: x\r\n");
-    DBG printf("Factor 2: x\r\n");
-    DBG printf("Revers  : yes\r\n");
-    DBG printf("Save settings\r\n");
-    
-    DBG printf("\r\nSelect item: %u\r\n", sel);
-}
+static void cli_draw_main(uint8_t sel);
+static void cli_draw_settings(uint8_t sel);
+static void cli_print_int_param(char* name, uint32_t val, bool hl);
+static void cli_print_str_param(char *name, char *val, bool hl);
+#endif
 
 //
 void menuChange(void* NewMenu, bool direction) 
@@ -47,23 +32,60 @@ void menuChange(void* NewMenu, bool direction)
 
     if (selectedMenuItem->Focus) {
         selectedMenuItem->func_change(direction);
+        (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
     }
     else {
         selectedMenuItem = (menuItem*)NewMenu;
         (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
     }
+}
+
+//
+void menuFocus(void) 
+{
+    // Пункт "Сбросить счетчики"
+    if (selectedMenuItem->Select == MCELL_RES) {
+        set_raw_counters(0, 0);
+        return;
+    }
     
-#if 0    
-    // Если элемент меню уже выбран - меняем его значение
-    if (selectedMenuItem->Focus) {
-        if (m_meas.Focus != 1)
-            selectedMenuItem->func_change(direction);
-        (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
+    // Пункт "Сохранить настройки"
+    if (selectedMenuItem->Select == MCELL_SAVE) {
+        settings_save();
+        return;
     }
-    else {
-        selectedMenuItem = (menuItem*)NewMenu;
-        (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
+    
+    // Главный экран меню. При нажатии кнопки - переход на следующий экран.
+    if (selectedMenuItem->Select == MCELL_MAIN) {
+        menuChange(NEXT, true);
     }
+    
+    if (!selectedMenuItem->Focus)
+        selectedMenuItem->Focus = true;
+    else
+        selectedMenuItem->Focus = false;
+}
+
+// -------------------------------------------------------------------------- //    
+// Отрисовка
+
+// Главное меню. Отрисовка.
+void draw_main(uint8_t sel)
+{
+    update_flag = true;
+               
+#ifdef KEYBOARD_MENU    
+    cli_draw_main(sel);
+#endif    
+}
+
+//
+void draw_settings(uint8_t sel)
+{
+    update_flag = false;
+    
+#ifdef KEYBOARD_MENU    
+    cli_draw_settings(sel);
 #endif    
 }
 
@@ -71,3 +93,119 @@ void menuChange(void* NewMenu, bool direction)
 //
 void empty_func_bool(bool) {}
 
+// -------------------------------------------------------------------------- //    
+// Изменение значений параметров
+
+//
+void change_factor_1(bool dir)
+{
+    if (dir) {
+        if (settings.factor_1 != FACTOR_1_UP_THR)
+            settings.factor_1++;
+    }
+    else {
+        if (settings.factor_1 != FACTOR_1_DOWN_THR)
+            settings.factor_1--;
+    }
+}
+
+//
+void change_factor_2(bool dir)
+{
+    if (dir) {
+        if (settings.factor_2 != FACTOR_2_UP_THR)
+            settings.factor_2++;
+    }
+    else {
+        if (settings.factor_2 != FACTOR_2_DOWN_THR)
+            settings.factor_2--;
+    }
+}
+
+//
+void change_revers(bool dir)
+{
+    if (settings.revers)
+        settings.revers = false;
+    else
+        settings.revers = true;
+}
+
+// -------------------------------------------------------------------------- //
+// Консольное меню. Вспомогательные функции.
+#ifdef KEYBOARD_MENU
+static void cli_draw_main(uint8_t sel)
+{
+    uint32_t raw_forw_turns, raw_back_turns, dir;
+    
+    get_raw_params(&raw_forw_turns, &raw_back_turns, &dir);
+    
+    DBG printf("\033c");
+    DBG printf("~~~ MAIN SCREEN ~~~\r\n\n");
+    
+    cli_print_int_param((char*)"Turns forward: ", raw_forw_turns, false);
+    cli_print_int_param((char*)"Turns back   : ", raw_back_turns, false);
+    cli_print_int_param((char*)"Direction    : ", dir, false);
+    
+    update_flag = true;
+}
+
+//
+static void cli_draw_settings(uint8_t sel)
+{
+    bool select;
+    
+    DBG printf("\033c");
+    DBG printf("~~~ SETTINGS SCREEN ~~~\r\n\n");
+    
+    if (sel == MCELL_K1) {
+    }
+    
+    select = sel == MCELL_K1 ? true : false;
+    cli_print_int_param((char*)"Factor 1:   ", settings.factor_1, select);
+    
+    select = sel == MCELL_K2 ? true : false;
+    cli_print_int_param((char*)"Factor 2:   ", settings.factor_2, select);
+    
+    select = sel == MCELL_REV ? true : false;
+    if (settings.revers == true)
+        cli_print_str_param((char*)"Revers:     ", (char*)"yes", select);
+    else
+        cli_print_str_param((char*)"Revers:     ", (char*)"no", select);
+    
+    select = sel == MCELL_RES ? true : false;
+    cli_print_str_param((char*)"Reset counters", (char*)"", select);
+    
+    select = sel == MCELL_SAVE ? true : false;
+    cli_print_str_param((char*)"Save settings", (char*)"", select);
+    
+    //DBG printf("\r\nSelect item: %u\r\n", sel);
+}
+
+//
+static void cli_print_int_param(char* name, uint32_t val, bool hl)
+{
+    memset(cli_str_buf, 0, CLI_BUF_LEN);
+    
+    if (hl)
+        sprintf(cli_str_buf, "\033[7m%s%d\033[0m\r\n", name, val);
+    else
+        sprintf(cli_str_buf, "%s%d\r\n", name,  val);
+    
+    DBG printf("%s", cli_str_buf);
+}
+
+//
+static void cli_print_str_param(char *name, char *val, bool hl)
+{
+    memset(cli_str_buf, 0, CLI_BUF_LEN);
+    
+    if (hl)
+        sprintf(cli_str_buf, "\033[7m%s%s\033[0m\r\n", name, val);
+    else
+        sprintf(cli_str_buf, "%s%s\r\n", name,  val);
+    
+    DBG printf("%s", cli_str_buf);
+}
+
+#endif

+ 8 - 15
desk/modules/menu/menu_tree.h

@@ -4,16 +4,6 @@
 
 #include "menu.h"
 
-typedef enum
-{
-    MCELL_NULL = 0,
-    MCELL_MAIN,
-    MCELL_K1,
-    MCELL_K2,
-    MCELL_REV,
-    MCELL_SAVE,
-} menu_cell_t;
-
 
 menuItem NULL_MENU = {0, 0, 0, 0, 0, false, 0, 0};
 
@@ -28,15 +18,18 @@ MAKE_MENU(m_main, 		m_k1,   		m_k1,		    NULL_ENTRY,		NULL_ENTRY,
           MCELL_MAIN,   false,          &draw_main,     &empty_func_bool);
 
 MAKE_MENU(m_k1, 		m_k2,		    m_main,		    m_main,		    NULL_ENTRY,
-          MCELL_K1,     false,          &draw_settings, &empty_func_bool);
+          MCELL_K1,     false,          &draw_settings, &change_factor_1);
 
 MAKE_MENU(m_k2, 		m_revers,	    m_k1,		    m_main,		    NULL_ENTRY,
-          MCELL_K2,     false,          &draw_settings, &empty_func_bool);
+          MCELL_K2,     false,          &draw_settings, &change_factor_2);
+
+MAKE_MENU(m_revers,     m_reset,        m_k2,		    m_main,		    NULL_ENTRY,
+          MCELL_REV,    false,          &draw_settings, &change_revers);
 
-MAKE_MENU(m_revers,     m_save,		    m_k2,		    m_main,		    NULL_ENTRY,
-          MCELL_REV,    false,          &draw_settings, &empty_func_bool);
+MAKE_MENU(m_reset,      m_save,		    m_revers,	    m_main,		    NULL_ENTRY,
+          MCELL_RES,    false,          &draw_settings, &empty_func_bool);
 
-MAKE_MENU(m_save,       m_main,		    m_revers,		m_main,		    NULL_ENTRY,
+MAKE_MENU(m_save,       m_main,		    m_reset,		m_main,		    NULL_ENTRY,
           MCELL_SAVE,   false,          &draw_settings, &empty_func_bool);
 
 

+ 4 - 4
desk/modules/settings/settings.cpp

@@ -152,10 +152,10 @@ void settings_set_def(void)
 {
     memset(settings.fw_version, 0, 20);
     strcpy(settings.fw_version, FW_VERSION);
-    
-    settings.motor_speed = 50;
-    settings.support_speed = 60;
-    settings.temperature_threshold = 70;
+ 
+    settings.factor_1 = 1000;
+    settings.factor_2 = 2000;
+    settings.revers = false;
 }
 
 

+ 4 - 4
desk/modules/settings/settings.h

@@ -2,7 +2,7 @@
 #define __SETTINGS_H
    
 #include "stm32g4xx_hal.h"
-
+#include <stdbool.h>
 
 
 // общая структура настроек
@@ -10,9 +10,9 @@
 typedef struct
 {
     char fw_version[20];
-    uint32_t motor_speed;
-    uint32_t support_speed;
-    uint32_t temperature_threshold;
+    uint32_t factor_1;
+    uint32_t factor_2;
+    bool revers;
       
 } settings_t;
 #pragma pack(pop)    

+ 4 - 3
desk/modules/ssd_1327/oled_common.cpp

@@ -39,6 +39,7 @@ void test_oled(void)
 {
     //SSD1327_DrawPixel(int16_t x, int16_t y, uint8_t Color);
   
+#if 0  
     for (int i = 0; i < 16; i++)
     {
         SSD1327_DrawPixel(10, 20 + i, i);
@@ -49,7 +50,7 @@ void test_oled(void)
     SSD1327_DrawPixel(30, 20, 15);
     
     SSD1327_DrawPixel(40, 20, 5);
-    
+#endif    
     //void GFX_DrawLine(int x_start, int y_start, int x_end, int y_end, uint8_t color);
     // Верхняя 
     GFX_DrawLine(0, 0, 127, 0, 15);
@@ -66,8 +67,8 @@ void test_oled(void)
     GFX_SetFont(font_8x5);
     GFX_SetFontSize(2);
     
-    GFX_DrawChar(50, 50, 'F', 15, 0);
-    GFX_DrawString(10, 100, "Hellow world", 15, 0);
+    //GFX_DrawChar(50, 50, 'F', 15, 0);
+    GFX_DrawString(10, 100, "Hello!!!", 15, 0);
     
     
 #if 0    

+ 12 - 19
desk/modules/terminal/terminal_user.cpp

@@ -1,5 +1,7 @@
 #include "terminal_user.h"
 #include "cmsis_os.h"
+#include "config.h"
+#include "menu.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -85,25 +87,7 @@ int SbsTerminal::help(int argc, const char * const *argv)
     printeol();
     printl ("You can use the following commands:");
     printl ("  version        Print nSBS software version");
-    printl ("  os             Print FreeRTOS statistics");
-    printl ("  stat           Print FreeRTOS common controller statistics");
-    printl ("  ifconfig       Print net params");
-    printl ("  set_ip         Set IP address");
-    printl ("  set_mask       Set netmask");
-    printl ("  set_gw         Set gateway");
-    printl ("  set_usb_ip     Set IP address for RNDIS");
-    printl ("  set_usb_mask   Set netmask for RNDIS");
-    printl ("  set_usb_gw     Set gateway for RNDIS");
-    printl ("  reset          Controller reset");
-    printl ("  boot           Go to DFU mode");
-    printl ("  clear          Clear terminal screen");
-    printl ("  ls             List of files");
-    printl ("  cat            Cat file");
-    printl ("  del            Delete file");
-    printl ("  format         Format file system");
-    printl ("  phy            dump phy reisters");
-    printl ("  fpga_boot      Prepare FPGA for download mode");
-    printll("  update         update main firmaware");
+    printll ("  clear          Clear terminal screen");
     printeol();
     
     help_connection();
@@ -161,7 +145,16 @@ void vTerminal(void const *params)
         event = osMessageGet(sbsTerminal.m_dataQueue, 1000);
        
         if (event.status == osEventMessage) {
+#ifdef KEYBOARD_MENU
+            if (event.value.v == 'a')
+                button_left();
+            else if (event.value.v == 'd')
+                button_right();
+            else if (event.value.v == 's')
+                button_enter();
+#else        
             sbsTerminal.insert(event.value.v);
+#endif        
         }
     }  
 }

+ 34 - 1
desk/modules/uart_bridge/uart_bridge.cpp

@@ -151,4 +151,37 @@ void USART2_IRQHandler(void)
     HAL_UART_IRQHandler(&huart_bridge);
 }
 
-}
+}
+
+// -------------------------------------------------------------------------- //
+// API
+
+// Сырые счетчики и направления из канала связи без обработки.
+void get_raw_params(uint32_t *f_turns, uint32_t *b_turns, uint32_t *dir)
+{
+    *f_turns = forw_turns;
+    *b_turns = back_turns;
+    *dir = direction;
+}
+
+//
+void set_raw_params(uint32_t f_turns, uint32_t b_turns, uint32_t dir)
+{
+    forw_turns = f_turns;
+    back_turns = b_turns;
+    direction = dir;
+}
+
+// 
+void set_raw_counters(uint32_t f_turns, uint32_t b_turns)
+{
+    forw_turns = f_turns;
+    back_turns = b_turns;
+}
+
+//
+void inc_raw_counters(void)
+{
+    forw_turns++;
+    back_turns++;
+}

+ 15 - 0
desk/modules/uart_bridge/uart_bridge.h

@@ -14,4 +14,19 @@ uint32_t get_uint_param(char* buf, uint8_t index);
 void usart_bridge_rx_cb(void);
 
 
+// -------------------------------------------------------------------------- //
+// API
+
+//
+void get_raw_params(uint32_t *f_turns, uint32_t *b_turns, uint32_t *dir);
+
+//
+void set_raw_params(uint32_t f_turns, uint32_t b_turns, uint32_t dir);
+
+// 
+void set_raw_counters(uint32_t f_turns, uint32_t b_turns);
+
+//
+void inc_raw_counters(void);
+
 #endif // __UART_BRIDGE_H

+ 2 - 3
desk/user/hal_callback.cpp

@@ -3,12 +3,11 @@
 #include "terminal_usartbridge.h"
 #include "uart_bridge.h"
 #include "menu.h"
+#include "config.h"
 #include <stdio.h>
 
 #define DBG if (0)
 
-#define ENC_SOFT_FILTER_CNT     3
-
 static void encoder_handler(void);
 
 
@@ -28,7 +27,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
             delay_cnt = HAL_GetTick();
         }
         if (push_flag == true) {
-            if ((HAL_GetTick() - delay_cnt) > 50) {
+            if ((HAL_GetTick() - delay_cnt) > BUTTON_GLICH_TIMEOUT) {
                 push_flag = false;
                 DBG HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
                 menu_send_event(CONTROL_PUSH);

TEMPAT SAMPAH
output/desk.bin


+ 1040 - 0
output/robot.bin

@@ -0,0 +1,1040 @@
+S0220000726F626F742F2E2E2F2E2E2F2E2E2F6F75747075742F726F626F742E62696E7A
+S31508000000E0050020A540000881400008834000085C
+S3150800001000000000000000000000000000000000D2
+S3150800002000000000000000000000000087400008F3
+S315080000300000000000000000894000088B4000080E
+S31508000040BB10000800000000D31000087312000857
+S31508000050771700080B1800080F180008131800086F
+S3150800006000000000B13A000857270008AF3400081E
+S315080000709B360008EB3600083F36000800000000F3
+S31508000080933E00080000000000000000274000081A
+S31508000090000000003340000893400008C5400008EF
+S315080000A0C7400008C9400008CB400008CD400008FA
+S315080000B0A73A000800000000000000000000000049
+S315080000C00100202008437047FDB5B2B03A98049164
+S315080000D002A93B22885400200D9027A8401C319085
+S315080000E00DE00498329A90470490002801D100F058
+S315080000F0D3FE0D98401C0D903398401C33903398CE
+S31508000100017800290FD02529EBD100200790089007
+S3150800011009900A900B900C90022501211491082150
+S315080001201291339C05E00D9800F0B8FE0100149872
+S315080001300843641C21782029F8D023290BD02B29C1
+S3150800014004D02D2904D0302908D00AE02843F0E746
+S3150800015001000420ECE701000820E9E7010010206F
+S31508000160E6E72A290FD134990A681168121D349BCB
+S315080001701A600F91002904D54A420F920100042003
+S315080001800843641C12E000210F91644B09E00F99A3
+S31508000190994205DA8E0071184900891830390F918D
+S315080001A0641C2278110030390A29F0D321782E29C7
+S315080001B003D00021C9430E9126E0641C21782A2920
+S315080001C008D134990A681168121D349B1A600E9179
+S315080001D0641C19E02D2901D1641C00E000210022CD
+S315080001E00E920CE0002909D10E9A4C4EB24205DA5D
+S315080001F09600B2185200D218303A0E92641C237830
+S315080002001A00303A0A2AEDD302A90887267831005F
+S3150800021040487844FF30401E00F01AFF002801D0FD
+S31508000220641C00E0002602A83A214654682E04D130
+S31508000230207868280BD1622005E06C2E07D120783B
+S315080002406C2804D1712002A93A228854641C18A883
+S315080002500690207869460870601C339068460478D2
+S315080002602000253833D01C3800D1CDE1001F0228E4
+S3150800027000D8C9E1133801D100F036FD093800D19C
+S31508000280C2E1801E01D100F0CCFD401E01D100F074
+S3150800029079FD401E022800D8B6E1001F01D100F002
+S315080002A071FD401F00D109E1401E01D100F01CFD7F
+S315080002B0401E00D1F1E0C01E0ED0801E01D100F014
+S315080002C013FDC01E01D100F00FFD00F0B6FD149815
+S315080002D00790252000F0ADFD349800680468001DDD
+S315080002E0349908600594002C00D0C2E002A83B218E
+S315080002F0405C002800D1B6E00024E4430648784470
+S31508000300163000F0AFFE201A01D000F0C5FD00F04F
+S31508000310A2FD00BF143B0000483B0000CBCCCC0C30
+S3150800032001236A4602A9280000F072FE002801D0BF
+S3150800033000F0B2FD641EF3D13295079D18AC002D6E
+S315080003400FD0329E21780498B0470490002801D136
+S3150800035000F0A2FD0D98401C0D90641C6D1EF1D195
+S3150800036032963020694608700A9C002C0DDD329DB5
+S3150800037001236A4602A9280000F04AFE002801D097
+S3150800038000F08AFD641EF3D13295059C089D002D68
+S315080003900FD0329E21780498B0470490002801D1E6
+S315080003A000F07AFD0D98401C0D90641C6D1EF1D16D
+S315080003B03296302769460F700B9C002C0DDD329D56
+S315080003C001236A4602A9280000F022FE002801D06F
+S315080003D000F062FD641EF3D1329505980899441819
+S315080003E0099D002D0FD0329E21780498B0470490BD
+S315080003F0002801D100F050FD0D98401C0D90641C9A
+S315080004006D1EF1D13296684607700C9C002C0DDDE6
+S31508000410329D01236A4602A9280000F0F9FD00284A
+S3150800042001D000F039FD641EF3D1329502A83821B7
+S31508000430405C400700D462E62020694608700198AF
+S31508000440002800DC5BE6019C329D01236A4602A96E
+S31508000450280000F0DDFD002801D000F01DFD641E17
+S31508000460F3D132954BE61B4878446830059000F086
+S31508000470F2FC0E9D002D03D5200000F017FE09E0C2
+S315080004802A000021200000F019FE002801D0001BD8
+S3150800049000E02800089000F0DEFC34980068026846
+S315080004A0001D349908600020C0430021104002AAAC
+S315080004B003C218A80590782100F0AFFC02A83B21DA
+S315080004C0415C002908D00024E4434B487844FF30B7
+S315080004D0293016E7A83900003A21405C62286AD01C
+S315080004E0682819D06A2845D06C2806D071284FD0BC
+S315080004F0742831D07A2821D06FE0349801680868CA
+S31508000500091D349A116000287AD10024E4433B4837
+S315080005107844FF301738F4E6349801680868091DEE
+S31508000520349A1160002805D10024E44333487844FE
+S31508000530CA30E6E60D99018000F08DFC3498016812
+S315080005400868091D349A1160002859D10024E4432B
+S315080005502A487844A630D4E6349801680868091D04
+S31508000560349A116000284BD10024E4432348784488
+S315080005708A30C6E6349800680268001D3499086017
+S31508000580002A13D10024E4431C4878446E30B8E6A8
+S31508000590349800680268001D34990860002A05D15D
+S315080005A00024E443154878445230AAE60D98C1174A
+S315080005B003C200F050FC349801680868091D349A93
+S315080005C01160002805D10024E4430C4878442C30F7
+S315080005D097E60D99017000F03EFC349801680868AA
+S315080005E0091D349A116000280AD10024E4430348FF
+S315080005F07844083085E600BF383800004C380000DB
+S315080006000D99016000F027FC34980068C21D072088
+S3150800061082433498026003CA349B1A6002AA03C252
+S315080006202022C80F04D007982D2118AA11540DE0CE
+S3150800063002A8008F284204D007982B2118AA115423
+S3150800064004E0C00704D5079818A90A54401C079067
+S3150800065018A8079940181390059027AD02A803C853
+S3150800066016AA03C2684600782021014368464170ED
+S31508000670612909D00E98002801D5062003E003D188
+S31508000680672901D114980E9002A803C80F0006180E
+S315080006907F417E15FF17BBA20CCA9F4212D1964214
+S315080006A010D10903020D11430003002901D10028C6
+S315080006B008D003200890613C1A2C19D324497944A0
+S315080006C08E3110E002A803C8080041004915994276
+S315080006D012D1000310D103200890613C1A2C21D3B3
+S315080006E01C4979446E310322139800F00DFDB2E3DC
+S315080006F0194979446231F6E701AA02A803C800F04D
+S3150800070010FD02AA03C268464078612813D10598ED
+S3150800071030210170811C059169460978612905D146
+S31508000720782104E00D4979443231DCE758214170DB
+S315080007300798801C079002A803C894A20CCA024016
+S315080007400B400DD1002A0BD10024002669E100BF19
+S315080007503437000038370000283700002C370000EF
+S3150800076068464078612800D097E00E98002801D5A1
+S31508000770212000E0401C1390139F7F1C16A803C875
+S315080007800022002300F0E2FC02A830C802D2802032
+S31508000790000645400198001F01909C2169440A7093
+S315080007A027A8461C002F31DD2000290000228023BF
+S315080007B05B0300F0E4FC29D81C2200F0F9FC0400D5
+S315080007C00D0000F02DFD1590FF1F002F09DD00F02C
+S315080007D061FD02000B002000290000F0C2FD0400A4
+S315080007E00D00F01D0722159900290ADD521E08D4AE
+S315080007F0401E0B071B0F03700911F5E7401E002169
+S315080008000170521EFAD5C61D002FCDDC27A83199D6
+S31508000810711A27AA551C139A0C00914200DD140080
+S31508000820002C33D48C4205DA411C095D082901DB0A
+S315080008300F2100E00021220027AB9B1801E0641E6F
+S315080008405B1E521E1E788E42F9D00F2904D1411C18
+S31508000850895C491C401C8154002A04D527AD641CB8
+S315080008600198001D0190611E10D46A186846007828
+S3150800087013783033DEB23A2E01DBC318C633137051
+S31508000880491E521E0029F3D5694608700E9800289D
+S3150800089000D4C5E0601E0E90C2E016A830C86D00F0
+S315080008A06D0801986C4948436C4900F0E7FD0190D2
+S315080008B007200199401A002805DD020020002900BA
+S315080008C000F080FB0AE042420020664900F07AFB0D
+S315080008D002000B002000290000F02AFE6A46527822
+S315080008E0662A02D1019A0A3200E006220E9B9A185D
+S315080008F0142A00DD142227AB30241C705C1C02E08D
+S3150800090016A803C8139A002A44DD16AB03C313922C
+S3150800091016A803C800F096FC159005460834042668
+S3150800092028000A2100F0ADFD0F0028000A2100F07A
+S31508000930A8FD05003037601E077028000A2100F060
+S31508000940A0FD0F0028000A2100F09BFD0500A41E4B
+S3150800095030372770761EE3D1083413980838139079
+S315080009600028CDDD159800F085FC02000B0016A8BE
+S3150800097003C800F0F6FC00223B4B00F03AFE16AA2C
+S3150800098003C2C5E7FFFFFFFFFFFFFFFFFFFFFFFFF4
+S31508000990FFFFFF7F3198201A27A94D1C04E0401E4F
+S315080009A00199491E01916D1C29783029F7D020211B
+S315080009B06A46127811436A4651706946497866292B
+S315080009C002D10199491C06E069464978652901D191
+S315080009D0149900E000210E9A5418A04200DA441E29
+S315080009E0002C1DD4844204DA285D342801DD392020
+S315080009F000E0302021006A1E531801E0641E5B1EC9
+S31508000A00491E1E788642F9D0392802D1685C401CF6
+S31508000A106854002904D51500641C0198401C0190EF
+S31508000A20019E1395684600786946887000F0A4FE12
+S31508000A30406A0078694608700E9D20B2002804DCDA
+S31508000A40149C0748784418301390684640786628FE
+S31508000A500CD1761C24E000BF97750000A086010023
+S31508000A60303400000000F03F84D79741684640784C
+S31508000A70672846D130B20321C943884247DBA842DA
+S31508000A8045DA761C02A8008F1299C0B2084203D133
+S31508000A9020B2A84200DC050030B22D1A00D5002588
+S31508000AA037B2002F00DDBAE00898411C08913021C2
+S31508000AB0059A1154002D05DC02A8008F1299C0B2C0
+S31508000AC0084206D00898411C089169460978059A93
+S31508000AD011547842854200DA6E4236B270420B9063
+S31508000AE0AD1920B2854200DA2C0024B209942200FE
+S31508000AF013990598089BC01800F006FB281B0C9054
+S31508000B00DAE068468078612818D170201BE020B2A8
+S31508000B10A84206DA02A9098F129AC9B2114200D16F
+S31508000B2005006D1E00D5002568468078672802D125
+S31508000B306520694607E04520694604E068468078EE
+S31508000B40412801D1502088700898411C08911399B2
+S31508000B500978059A11541398411C002D05DC02A842
+S31508000B60008F129AC0B2104219D00898421C0892F7
+S31508000B706A461278059B1A54002D10DD641E20B2B1
+S31508000B80854200DA2C0022B20598089BC01800F0AE
+S31508000B90BBFA24B2089800190890281B0B900598F0
+S31508000BA00899411868468078087030B2002803D43E
+S31508000BB02B2048708F1C03E02D224A708F1C46425A
+S31508000BC0002412AD300008E00A2100F057FC15AAEF
+S31508000BD003C229701598641C6D1C00B20028F3DC4A
+S31508000BE0012C08DC6846807820210143652902D15A
+S31508000BF0302038707F1C002C09D1302038707F1CBB
+S31508000C0007E0641E12A8005D303038707F1C002C87
+S31508000C10F7DC059808994018381A09904CE020B274
+S31508000C2031B288421DDA22B213990598089BC0187A
+S31508000C3000F06AFA24B2089800190890391B0B913B
+S31508000C40002D05DC02A9098F129AC9B2114206D0F5
+S31508000C5069460978059A11540998401C09900C951B
+S31508000C602AE032B213990598089BC01800F04CFA8E
+S31508000C700898C0190890A41B002D05DC02A9098F45
+S31508000C80129AC9B2114205D0411C089169460978E1
+S31508000C90059A115420B2854200DA2C0022B2139824
+S31508000CA0C1190598089BC01800F02EFA24B20898B6
+S31508000CB000190890281B0B9002A83821405C1421C3
+S31508000CC00140102900D0C6E00798089940180B99EA
+S31508000CD04018099940180C9940180F99884200DB6A
+S31508000CE0B9E0081A0A90B6E002AA3A20105C62280F
+S31508000CF008D068280ED06A2814D06C281DD0712810
+S31508000D0010D01AE0349801680868091D349B1960E8
+S31508000D10C0B218E0349801680868091D349B196048
+S31508000D2080B210E034980068C31D072083433498C6
+S31508000D30036003CB349C236006E034980168086896
+S31508000D40091D349B1960002102AB03C3108F129949
+S31508000D50C0B208425BD002A803C8002901D1002806
+S31508000D6055D0684600782021014378294FD1079845
+S31508000D7018A930220A54401C421C07926A46127867
+S31508000D800A5444E002AA3A20105C622808D068286F
+S31508000D900ED06A2814D06C281DD0712810D01AE0FD
+S31508000DA0349801680868091D349B196040B218E038
+S31508000DB0349801680868091D349B196000B210E070
+S31508000DC034980068C31D072083433498036003CB17
+S31508000DD0349C236006E0349801680868091D349B32
+S31508000DE01960C11702AB03C3002902DA07982D213F
+S31508000DF009E0108F284202D007982B2103E0C0078C
+S31508000E0005D50798202118AA1154401C079018A840
+S31508000E100799401805906846017802A800F040F83E
+S31508000E2019E014980790349801680868091D349ADF
+S31508000E3011606021694408700DE014980790252018
+S31508000E4060216944087068460078002803D0079531
+S31508000E506846007848700F980799401A0A99401A08
+S31508000E600899401A0B99401A0999401A0C99401A80
+S31508000E70019002A83821405C400701D5FFF75DFACA
+S31508000E802020694608700198002801DCFFF755FA0A
+S31508000E90019C329DFFF744FA0020C04335B0F0BDEF
+S31508000EA0F2B586B0040025696F2901D1082707E045
+S31508000EB00846FFF705F9782801D00A2700E0102729
+S31508000EC03C2603CC083C04AA03C26A46127E642A5E
+S31508000ED003D06A46127E692A09D1002907DA04A8CE
+S31508000EE003C800220023121A8B4104A80CC004A8C8
+S31508000EF003C800290DD100280BD1206B002808D182
+S31508000F00082F3DD13820205C000739D53B263020F4
+S31508000F1035E00294009504A830C8761E0196200094
+S31508000F2029003A00002300F02DFC3032D0B23A28CE
+S31508000F300DDA00988255200029003A00002300F0B7
+S31508000F4021FC04000D0007D1002C05D10AE06846F3
+S31508000F50007E8218AF32ECE70298C06800998919BA
+S31508000F608842DAD3029C009D082F09D13820205CDC
+S31508000F70000705D5A85D302802D0761E3020A85572
+S31508000F803C20801BA061A919E160216B884206DA22
+S31508000F90081A2062208F1C490140218710E0002989
+S31508000FA00ED53821615C14220A40102A08D1616BDB
+S31508000FB06269891A226A891A081A002800DD2062DD
+S31508000FC007B0F0BDF8B50026104F04000D000092DA
+S31508000FD014E0C00707D532003B002000290000F0C6
+S31508000FE008FB04000D0000984010009030003900FE
+S31508000FF032003B0000F0FDFA06000F0000980028BA
+S31508001000E7D120002900F4BDEFFF000000002440CE
+S31508001010F8B50024002B11D007000E0014001D009F
+S315080010202178B068B847B060002809D0F06A401C3B
+S31508001030F0620020641C6D1EF2D104002000F2BD8F
+S315080010400020C043F9E70268531C0360117070471B
+S31508001050C9B202788A4203D0401C002AF9D100207E
+S3150800106070472E0080B5002801D100BF07A00649A9
+S315080010700B68002B03D022220021984701E000F0DC
+S31508001080BFFB222002BD0000D8010020636F6E73EB
+S31508001090747261696E742068616E646C65723A2058
+S315080010A0626164206D65737361676500431C01782E
+S315080010B0401C0942FBD1C01A7047FEE7C9B2521E4E
+S315080010C005D30378401C8B42F9D1401E7047002097
+S315080010D07047FEE770B4103A03D378C9103A78C05F
+S315080010E0FBD2530701D318C918C001D508C908C0CF
+S315080010F0D20704D30B880380891C801C002A01D5DB
+S315080011000B78037070BC70478B0701D18307E1D059
+S31508001110124205D00B78491C0370401C521EF9D1A7
+S31508001120704710B5144600F002F8226010BD4A0058
+S3150800113053155B1C08D0520D06D003231B02FE3A3A
+S31508001140D21A1305C91A70470022704730B4012411
+S3150800115064054D00EC420BD85D00EC4208D80C0043
+S315080011601C4364000443144304D2994200D19042BC
+S3150800117030BC7047FCD08B42FAD18242F8E730B4D3
+S31508001180012464054D00EC420BD85D00EC4208D8FA
+S315080011900C001C4364000443144304D28B4200D160
+S315080011A0824230BC7047FCD09942FAD19042F8E7A7
+S315080011B0124217D40023DB435B0D9C464B005B0DA4
+S315080011C006D0634504D09B18634502D212058918D8
+S315080011D070476246090D11430905002000B500BF96
+S315080011E000BF00BD52424B005B0DF1D05B1C5B0596
+S315080011F0EED25B0D934102D91205891A70470BD1BD
+S315080012000B031B13C90FC907821C00204341134354
+S31508001210E4D912051143E1E7C90FC9070020DDE744
+S31508001220F4464A1805D200F00FF801D58017400891
+S31508001230604700F009F80121C907884200D908006B
+S31508001240404260474A1812D2400DC902084301219C
+S31508001250C9070843520D40210901521A521C06D4E7
+S3150800126052421F3201D4D0407047C0177047002041
+S315080012707047FEE7010042221201D21E004207D043
+S3150800128002D4521E0018FCD5C10A40051205891859
+S31508001290704700000100EED54042F446FFF7EBFF29
+S315080012A00122D207114360478B4200D1824205D9F9
+S315080012B08446100062468C4619006346DF184C18AF
+S315080012C0640D7F0D3AD0661C760537D0E61B352EA1
+S315080012D034DCDB022B43DB0A0C0DC9022943C91295
+S315080012E0202E0DDB1700203E06D01F00F741F340E5
+S315080012F05F400026012A7741C01871410DD217E0D8
+S315080013001700F741F2405740F3415A40B340F340C3
+S315080013105A400026801859410AD3A21C52050FD0FC
+S31508001320C207012F724117004008CB071843490826
+S31508001330641C24054208AF4170416141F0BC704706
+S31508001340641C21050020F9E76B4010E06B40ABE711
+S31508001350F742F3D1E943F1E72442EFD10020002117
+S31508001360ECE7F0B40125ED070F005F40EED40C0062
+S31508001370871A9C4105D2C01BA141D2196341694015
+S315080013806B40AE0ADF184C18F442E1D2640D7F0DAB
+S31508001390E2D0E61B362ED1DCDB022B43DB0AA44661
+S315080013A00C0DC9022943C90A012E28DC04D1D60727
+S315080013B05208DF073A435B08EF0A764290419941A3
+S315080013C014D039423BD1B61940414941761C3942BD
+S315080013D004D1761C001849413942FAD0B943674608
+S315080013E0B74208D9A41B24052143A7E70042EAD13E
+S315080013F03642E8D1A2E7E40AE10700209EE7202E5C
+S315080014000BDD203E1F00F340F7415F40012A002212
+S3150800141057417E42984191410BE01700F741F2404F
+S315080014205740F3415A40B340F3405A407E429041F8
+S3150800143099410A0303D2641EB6194041494100275F
+S31508001440641E24054208AE4178416141F0BC7047EC
+S31508001450F446002804D4494200F013F84042604795
+S315080014604042002905D45FD000F00BF840424942BB
+S315080014706047494200F005F84942604703460B4376
+S31508001480E6D40022030A8B420BD203098B4219D2F7
+S3150800149043088B422ED2411A00D2014652411046C9
+S315080014A07047FF2209023FD012068B4205D312125B
+S315080014B009028B4201D31212090203098B4219D37E
+S315080014C000E0090AC3098B4201D3CB01C01A524175
+S315080014D083098B4201D38B01C01A524143098B42BF
+S315080014E001D34B01C01A524103098B4201D30B01A8
+S315080014F0C01A5241C3088B4201D3CB00C01A5241CD
+S3150800150083088B4201D38B00C01A524143088B4291
+S3150800151001D34B00C01A5241884200D3401A5241A7
+S31508001520CFD201461046704708B500F06FF908BDDE
+S31508001530F0B40E005E400125ED072E40B446AE0A13
+S31508001540DF184C18F4423BD2F74241D2640D43D01F
+S315080015507F0D38D0E41BC902DB0229432B43CF0A8F
+S31508001560DB0A0600B61A9F4104D2641EB6197F41EB
+S31508001570B6185F416812800D24180018844222DCD0
+S31508001580E80C0021B6197F41B61A9F4102D2B61857
+S315080015905F413F1C40414941F4D3241C21DD240509
+S315080015A0B6197F41B61A9F4105D33743C607374355
+S315080015B00026012F7041614166463143F0BC7047F1
+S315080015C0FCD1F74205D20020C14349054908F3E793
+S315080015D004D00020C143F1E77F0DFAD00020614610
+S315080015E0ECE72442FAD1401C61410F03F6D30020F0
+S315080015F0E2E7F0B50E005E400125ED072E40B44641
+S31508001600AE0ADF184C18F44208D2F7420ED2640D1F
+S3150800161001D07F0D12D100206146F0BD05D1F742F9
+S3150800162001D87F0D05D10020C143F0BDFBD1640D63
+S31508001630F9D00020C143490549088FE0E419C902D9
+S31508001640DB0229432B43DB0A460DC00231438E4693
+S3150800165030B487B295B27D432E0CADB2140C7C43E0
+S31508001660A419260C240425439CB27C43A419190CFE
+S315080016707943270CC919A4B20F043C43090C000C82
+S3150800168097B247432E0CBE193543ADB2170C4743E4
+S31508001690360CBF19A6B2BF193E043543240C3E0CBE
+S315080016A036199FB24743BF19BCB23E0C89191F0CA5
+S315080016B047437F183E043443390C704680B297B2CC
+S315080016C047432E0CBE193543ADB2170C4743360CAB
+S315080016D0BF19A6B2BF193E043543240C3E0C361971
+S315080016E09FB24743BF19BCB23E0C89191F0C47432A
+S315080016F07F183E043443390C77463F0C90B2784342
+S315080017002E0C80190604ADB22E43050CA0B22D1876
+S31508001710120C7A435019020C80B2240CA4189AB2FF
+S315080017207A43121914042043120C89181B0C7B43A4
+S31508001730C91830BCEF0A394203D1B61940414941AC
+S31508001740641E6F12BF0DE41B0BDBFF19BC4211DAD6
+S31508001750240500274208AE41784161416646314377
+S31508001760F0BD641C05D1401C6141CF0201D3490874
+S31508001770F4E750E75DE7FEE7014870470000000020
+S315080017801000002012422DD0994231D970B500259B
+S315080017901B4209D00C00002112E01100FFF771FE70
+S315080017A00A000021002370BD0942F6D00024012654
+S315080017B049186441944200D3A41A7641F8D33100FB
+S315080017C0012601E0764109D2001864416D41A41A48
+S315080017D09D41F7D2A4185D41B619F5D33000220011
+S315080017E02B0070BD1B42CFD108B500F011F808BD1B
+S315080017F001D19042CAD202000B0000210020704796
+S3150800180080B5012000F006F801BDFEE77047FEE747
+S315080018107047FEE780B500BF00BF024A11001820D6
+S31508001820ABBEFBE72600020010B50400002C01D170
+S31508001830012037E0A0690028FFD188202058002819
+S3150800184005D1002084216054200000F05EFD24208C
+S315080018508821605020680068012188432168086053
+S31508001860A06A002802D0200000F02DFB200000F01E
+S3150800187047FA012801D1012014E0206840680A4986
+S31508001880014020684160206880682A2188432168D1
+S3150800189088602068006801210143206801602000F3
+S315080018A000F08EFB10BD0000FFB7FFFF70B5040007
+S315080018B00E00150088202058202852D1002E03D06B
+S315080018C0280080B2002801D101204BE0A0688021C1
+S315080018D04901884207D12069002804D13000C00791
+S315080018E001D501203EE02665542025525620255272
+S315080018F000209021605021218822A150E16F002903
+S315080019001DD01949E26FD1621849E26F116318496F
+S31508001910E26F5163E16F88632B009BB22068020077
+S315080019202832216DE06F00F049FD002807D010200D
+S3150800193090216050202088216050012012E040202C
+S3150800194021680862EFF31080012181F3108821686D
+S31508001950896880220A4321688A6080F310880020FB
+S3150800196000E0022070BD000003220008552200088E
+S3150800197071220008FEB504002068C769206805685A
+S315080019802068806800909A4838400290029800289B
+S315080019900FD1202007420CD02840002802D10098F9
+S315080019A0C00006D5606F002802D02000616F884706
+S315080019B09DE10298002800D1A9E08E4800990140CF
+S315080019C0002904D18C492940002900D19FE039001B
+S315080019D0C90709D5E90507D50121226811629022B0
+S315080019E0A25811439022A15002210F420AD0009A10
+S315080019F0D20707D5226811629022A25804231343FE
+S31508001A009022A3500422174209D0009BDB0706D573
+S31508001A1023681A629022A25811439022A1500821E5
+S31508001A200F420CD0AA0603D4009A1040002806D00C
+S31508001A302068016290202058014390202150802080
+S31508001A400001074209D0690107D52168086290207C
+S31508001A50205820210143902021509020205800280A
+S31508001A6054D0202007420BD02840002802D10098E5
+S31508001A70C00005D5606F002802D02000616F884736
+S31508001A809020205801904026206880683040002821
+S31508001A9004D1019828210140002931D0200000F006
+S31508001AA07DFB206880680640002E25D0EFF3108065
+S31508001AB0012181F3108821688968402291432268B0
+S31508001AC0916080F3108880202058002810D088481C
+S31508001AD08021615888638020205800F011FD002875
+S31508001AE014D08020205880216158896B88470DE0E2
+S31508001AF0200000F02BFE09E0200000F027FE05E09C
+S31508001B00200000F023FE002090216050EFE0E06EF8
+S31508001B10012800D0B4E01020074200D1B0E0054209
+S31508001B2000D1ADE02168086220688068400665D566
+S31508001B308020205800684668300080B2002856D0B9
+S31508001B4030005C21615A80B2884250D25E2026520B
+S31508001B5020208021615809680968014000293BD185
+S31508001B60EFF31081012282F3108822681268614B14
+S31508001B7013402268136081F31088EFF31081012265
+S31508001B8082F310882268926801239A4323689A6030
+S31508001B9081F31088EFF31081012282F310882268FE
+S31508001BA0926840239A4323689A6081F310888C21AF
+S31508001BB060500020E066EFF31080012181F3108861
+S31508001BC021680968102291432268116080F3108801
+S31508001BD08020205800F04EFC022020675C20205A06
+S31508001BE05E21615A411A89B2200000F0B0FD7EE0FC
+S31508001BF00F08000001000010200100045C20205A94
+S31508001C005E21615A461A5E20205A002837D03000D5
+S31508001C1080B2002833D0EFF31080012181F31088B9
+S31508001C2021680968344A0A4021680A6080F31088E6
+S31508001C30EFF31080012181F31088216889682F4A03
+S31508001C400A4021688A6080F3108820208C21605021
+S31508001C500020E0666067EFF31080012181F31088A9
+S31508001C6021680968102291432268116080F3108860
+S31508001C7002202067310089B2200000F068FD36E0B6
+S31508001C8080204003074208D00099490205D52168FB
+S31508001C900862200000F05CFD29E0802007420CD095
+S31508001CA02840002802D10098000206D5A06F002817
+S31508001CB002D02000A16F884719E04020074206D0CD
+S31508001CC02840002803D0200000F007FB0FE0380268
+S31508001CD005D5680003D5200000F03BFD07E0F801B4
+S31508001CE005D5002D03D5200000F034FDFFE7F7BD2C
+S31508001CF0C3220008FFFEFFFFDFFEFFFFFEFFFFEF28
+S31508001D00FEB505000026300069460870A9682869EE
+S31508001D10084369690143E869084329680968A24ACA
+S31508001D200A40024329680A60296849689F4A0A40A6
+S31508001D30E96811432A685160A9692A6A0A43029226
+S31508001D40296889689A4A0A40029911432A68916063
+S31508001D502968C96A0F2291436A6A0A432968CA62CE
+S31508001D602968944A914215D1934800688007800FE4
+S31508001D70002805D0022805D006D3032806D007E098
+S31508001D8034000EE002240CE004240AE0082408E0EB
+S31508001D90102406E028688949884201D1340000E009
+S31508001DA0102480273F02E869B84247D12000C0B214
+S31508001DB0002806D0022808D0042808D008280AD007
+S31508001DC00AE001F057F807000AE0B04F08E000F013
+S31508001DD0F1FF070004E003E03700012069460870B8
+S31508001DE0002F66D03800AA496A6A02235A43895ADC
+S31508001DF0FFF747FB022148436968490840186968A4
+S31508001E00FFF73FFB01900198102813D30198802112
+S31508001E10490288420ED201999E480840019949080C
+S31508001E204907490F01436846418068464088296842
+S31508001E30C8603EE00120694608703AE02000C0B25A
+S31508001E40002806D0022808D0042808D008280AD076
+S31508001E500AE001F00FF807000AE08C4F08E000F0EE
+S31508001E60A9FF070004E003E037000120694608706F
+S31508001E70002F1ED0380086496A6A02235A43895AB7
+S31508001E80FFF7FFFA6968490840186968FFF7F9FA21
+S31508001E9001900198102809D30198802149028842A7
+S31508001EA004D2019880B22968C86002E00120694618
+S31508001EB0087001206A216852682168526E67AE6709
+S31508001EC068460078FEBD00B52821415C090707D59C
+S31508001ED001684968704A0A40816B1143026851607B
+S31508001EE02821415CC90707D5016849686B4A0A4039
+S31508001EF0C16A1143026851602821415C890707D5E8
+S31508001F0001684968664A0A40016B114302685160D4
+S31508001F102821415C490707D501684968614A0A4092
+S31508001F20416B1143026851602821415CC90607D5F7
+S31508001F30016889685C4A0A40C16B1143026891606E
+S31508001F402821415C890607D501688968574A0A40ED
+S31508001F50016C1143026891602821415C490614D539
+S31508001F6001684968524A0A40416C11430268516047
+S31508001F70416C80225203914207D1016849684D4A53
+S31508001F800A40816C1143026851602821415C0906A8
+S31508001F9007D5016849686F4A0A40C16C114302684F
+S31508001FA0516000BD00000000F369FFCFFFCFFFFFBF
+S31508001FB0FFF4FF110038014054100240004400406D
+S31508001FC07CB50500002490202C5000F07FFF060009
+S31508001FD02868006800071ED55F4800903300002275
+S31508001FE080218903280000F067F8002813D0EFF352
+S31508001FF01080012181F3108829680968802291439D
+S315080020002A68116080F3108820208821685084206F
+S315080020102C54032039E02868006840072BD54E4821
+S315080020200090330000228021C903280000F044F8FC
+S31508002030002820D0EFF31080012181F31088296849
+S315080020400968464A0A4029680A6080F31088EFF34F
+S315080020501080012181F3108829688968012291433B
+S315080020602A68916080F3108820208C21685084208B
+S315080020702C54032009E02020882168508C216850C0
+S31508002080EC662C6784202C54002076BD0024F400CE
+S3150800209050400008F0FF0000FF7FFFFFFFFFFDFF35
+S315080020A0FFFFFEFFFFFFFBFFFFEFFFFFFFDFFFFF67
+S315080020B0FFFFEFFFFFFF9FFFFEB504000F00089D1F
+S315080020C02068C0693840B84201D1012000E00020EC
+S315080020D06946097988423BD10020C0438542EFD042
+S315080020E000F0F4FE0299401A854201D3002D01D171
+S315080020F003202EE0206800684007E1D5802FDFD056
+S31508002100402FDDD008262068C069304000280BD053
+S3150800211020680662200000F041F890202650002032
+S3150800212084216054012014E0802000012168C969D7
+S3150800213001400029C4D021680862200000F02EF86A
+S31508002140202090216050002084216054032000E064
+S315080021500020FEBDFFFFF7FFFFFFFF01DFFEFFFFC9
+S31508002160EFF31081012282F3108802681268C023F7
+S315080021709A4303681A6081F31088EFF310810122ED
+S3150800218082F3108802689268364B1340026893609F
+S3150800219081F31088202188228150704700B5EFF31B
+S315080021A01081012282F31088026812682E4B1340B0
+S315080021B00268136081F31088EFF31081012282F31D
+S315080021C0108802689268294B13400268936081F36D
+S315080021D01088C16E01290CD1EFF31081012282F318
+S315080021E010880268126810239A4303681A6081F3FC
+S315080021F0108820218C2281500021C166416700BDCC
+S31508002200000038B50400A56A2068006880061DD459
+S31508002210002056216852EFF31080012181F31088BF
+S3150800222029688968802291432A68916080F310881A
+S31508002230EFF31080012181F310882968096840228C
+S315080022400A4329680A6080F3108802E0280000F033
+S3150800225043FE31BD38B50400A56A280000F03DFEEE
+S3150800226031BD0000FFFF7FFFDFFEFFFFFEFFFFEF30
+S31508002270F8B50400A56A88202F588C202E5828689F
+S315080022808068000607D5212F05D1002056216852FF
+S315080022902800FFF765FF28688068400607D5222EC4
+S315080022A005D100205E2168522800FFF777FF9020AD
+S315080022B028581021014390202950280000F046FA9A
+S315080022C0F1BD38B50400A56A00205E216852562182
+S315080022D06852280000F03AFA31BD10B50400EFF351
+S315080022E01080012181F310882168096840229143F2
+S315080022F02268116080F31088202088216050002011
+S31508002300A067200000F0E8FD10BD704710B5040076
+S31508002310002C01D1012050E020687849401814218A
+S31508002320FFF7AFF88000206402202521605420685A
+S315080023300068974901402068016020680068A16824
+S315080023400143E06808432169014360690843A169BC
+S315080023500143E0690843216A0143206801602000BF
+S3150800236000F0C2F9A0688021C901884201D1002085
+S31508002370606020798006800E616C0860E06CA16C54
+S315080023804860606800280CD06068052809D22000DB
+S3150800239000F0C2F90020216D0860A06D616D4860EB
+S315080023A003E0002020656065A0650020E063012148
+S315080023B02522A15424216054002010BDF7B504003D
+S315080023C01F00002006002421615C012901D102209A
+S315080023D04FE0012529002422A1542521615C012909
+S315080023E040D102212522A154E0632068006801211A
+S315080023F08843216808603B00029A0199200000F092
+S315080024004BF9206B002806D0206800680E2101438E
+S31508002410206801600BE02068006804218843216871
+S315080024200860206800680A21014320680160606C22
+S315080024300068C00306D5606C006880214900014326
+S31508002440606C0160206D002806D0206D0068802130
+S3150800245049000143206D0160206800680543206833
+S31508002460056004E08021E163242160542E003000D9
+S31508002470C0B2FEBD70B50100002901D101203BE0C4
+S315080024802520085C022806D00420C86300202422E0
+S315080024908854012030E0086800680E2290430A68D4
+S315080024A010603D484A6C126802404B6C1A600A6814
+S315080024B0126801239A430B681A600122354B1C687F
+S315080024C040254D5D1C262E401500B54025431D6050
+S315080024D0CB6C8C6C63600B6D002B07D00B6D1B6887
+S315080024E018400B6D1860886D4B6D586025200A548E
+S315080024F0002024228854002070BD0000F8FFFDBF8C
+S31508002500F8B50400002005002521615C022904D0E5
+S315080025100420E0630120050036E0216809680E22E0
+S315080025209143226811602168096801229143226853
+S3150800253011601949626C12680A40636C1A600122BC
+S31508002540144B1E68B4464026A75D1C263E4017005D
+S31508002550B740664637431F60E36CA66C7360236D0D
+S31508002560002B07D0236D1B681940236D1960A16DD8
+S31508002570636D59602521625424216054A06B00289C
+S3150800258002D02000A16B88472800C0B2F2BD000027
+S315080025900F80FFFF04000240FFFEFFFFF8B50400AE
+S315080025A03C480568206806681C210420226C0A40FD
+S315080025B0030093402B40002B19D0064217D02268FF
+S315080025C01268920605D42268126804239A4323687F
+S315080025D01A60444A1368276C3940884018431060CB
+S315080025E0206B002854D02000216B884750E0022237
+S315080025F0206C0840130083402B40002B1FD0164246
+S315080026001DD020680068800608D4206800680A2360
+S3150800261098432368186001202523E054314803684D
+S31508002620276C39408A401A430260002024216054EE
+S31508002630E06A00282CD02000E16A884728E00820B4
+S31508002640226C0A40030093402B40002B20D03040D8
+S3150800265000281DD0206800680E229043226810606A
+S315080026600123204A1068276CBC460F0061460F40BC
+S315080026701900B94001431160E36325202354002063
+S3150800268024216054606B002802D02000616B8847C3
+S31508002690F1BD000000000240F0B5C46C856C6C60AA
+S315080026A0046D002C02D0846D456D6C600D4C276856
+S315080026B00125AC464025455D1C262E406546B5409D
+S315080026C03D432560046863608468102C04D104685F
+S315080026D0A2600468E16003E00468A1600468E2603F
+S315080026E0F0BD00000400024010B50400206C80080C
+S315080026F0042148431149401860642078C0B208385C
+S315080027001421FEF7BEFE0E49A16401210200D2067D
+S31508002710D20E9140E16410BD01798906890E042222
+S315080027204A43084BD2180265074A426501220B0044
+S315080027305B1E9B079B0F9A40826570470008024004
+S3150800274080080240FC080240400902407047704772
+S31508002750704770477047FEE702480168E020C001ED
+S315080027600840704708100240F8B584B00400002CF1
+S3150800277001D1012044E201262068304000285CD0BF
+S31508002780B3480068382101400291B24800688007C2
+S31508002790800F01900298102802D10198032802D0D0
+S315080027A00298082808D1AC480068800345D56068B7
+S315080027B0002842D1012023E280204002616881423C
+S315080027C004D1A5490A681043086017E06168A02289
+S315080027D0D202914209D1A0490A688023DB02134339
+S315080027E00B600A681043086008E09B480168B04A15
+S315080027F00A4002600168AF4A0A4002606068002821
+S315080028000DD000F063FB050093480068800314D4DC
+S3150800281000F05CFB401B6528F6D30320F0E100F0CE
+S3150800282055FB05008C480068800306D500F04EFB72
+S31508002830401B6528F6D30320E2E12078800776D589
+S315080028408348006838210140029182480068800761
+S31508002850800F01900298102802D10198022802D010
+S31508002860029800282CD17C490868400504D5E06800
+S31508002870002801D10120C3E1B9480268B94B1340C9
+S31508002880626912021A4302600298002810D1086889
+S31508002890BE4A0240206910430860BD480968C90A53
+S315080028A04A07520F31009140FEF7EBFDB94908601F
+S315080028B0B948006800F012FB002838D001209FE1D3
+S315080028C0E068002821D0644F3868B0490140206983
+S315080028D0084338603868802149000143396000F0B0
+S315080028E0F5FA05003868400506D400F0EFFA401BF3
+S315080028F00328F7D3032083E199480168994A0A40D7
+S31508002900616909021143016011E0534F3868BD49F6
+S315080029100140396000F0DAFA05003868400506D546
+S3150800292000F0D4FA401B0328F7D3032068E1207887
+S31508002930000734D54648006838210140182908D1CF
+S31508002940B148006880072AD5A069002827D1012048
+S3150800295056E1A069002810D0AB4F3868304338607C
+S3150800296000F0B4FA05003868800718D400F0AEFA0B
+S31508002970401B0328F7D3032042E1A34F38680121FF
+S315080029808843386000F0A2FA05003868800706D543
+S3150800299000F09CFA401B0328F7D3032030E10427F4
+S315080029A020683840002800D18FE00020694608706A
+S315080029B0274800683821014020290AD19348006831
+S315080029C0800700D481E0A068002800D07DE00120BF
+S315080029D016E1802040058E490968014000290AD180
+S315080029E08B490A6802430A600968084003900398FD
+S315080029F030006946087087480068C00514D48548C1
+S31508002A0000688021490001438248016000F05EFAAF
+S31508002A10050080480068C00506D400F057FA401B38
+S31508002A200328F6D30320EBE0A068012804D17748F1
+S31508002A3001680E4306601AE0A06805280ED173489F
+S31508002A4001680F43076001680E4306600FE000BF88
+S31508002A50081002400C100240001002406B48016842
+S31508002A600122914301600168042291430160A06834
+S31508002A7000280ED000F02AFA05006448006880078E
+S31508002A801AD400F023FA401B63498842F5D3032081
+S31508002A90B6E000F01BFA05005C48006880070BD515
+S31508002AA000F014FA401B5C498842F5D30320A7E0DE
+S31508002AB0FFFFFEFFFFFFFBFF68460078012804D1F1
+S31508002AC053480168554A0A400260E069002800D167
+S31508002AD095E05348006838210140102964D0E06920
+S31508002AE0022841D1AE4F3868AE490140396000F03E
+S31508002AF0EDF900908026B60438683040002807D0E3
+S31508002B0000F0E4F90099401A0328F3D3032077E08C
+S31508002B10A6480168A44A0A40216A1143626A0A4320
+S31508002B20A16A09021143E26A0A43216B1143016053
+S31508002B303968802252040A433A60016880225205A5
+S31508002B400A43026000F0C2F90500386830400028E0
+S31508002B5055D100F0BBF9401B0328F6D303204FE0FC
+S31508002B6004100240FF80FFFF8D4E30688D490140FA
+S31508002B70316000F0ABF90500306880010ED500F031
+S31508002B80A5F9401B0328F7D3032039E0FFC7FFFF49
+S31508002B900024F4000C000020080000208348016887
+S31508002BA0834A0A4002602AE0E069012801D101202F
+S31508002BB026E07E480068019001988007800F216A08
+S31508002BC088421AD1019870210140606A814214D165
+S31508002BD00198FE21C9010140A06A000281420CD178
+S31508002BE00198F82189030140E06A814205D10198DC
+S31508002BF0400F4007216B884201D0012000E00020E9
+S31508002C0005B0F0BDFFFEFFFF601002405C100240F9
+S31508002C103C1002400070004089130000FFFFFFEFE0
+S31508002C2008100240F3B581B00400002C01D1012040
+S31508002C30B5E007258E4E306828400299884216D29C
+S31508002C4030680721884302990143316000F03EF954
+S31508002C500090306828400299884208D000F036F97A
+S31508002C600099401A8B498842F3D3032097E0022043
+S31508002C702168014000290FD02178490705D58649E2
+S31508002C800A68E023DB0113430B6083490A68834B18
+S31508002C901340A2681A430A602178C90745D56168B6
+S31508002CA0012905D13E480068800324D4012076E036
+S31508002CB06168022905D13A48006880011BD40120C1
+S31508002CC06DE06168002905D135480068400512D4D1
+S31508002CD0012064E06168032906D171490968084042
+S31508002CE0002808D101205AE06E49096808400028E2
+S31508002CF001D1012053E0684F38680721884361688D
+S31508002D000143396000F0E2F8009038683821014044
+S31508002D106068C000814208D000F0D8F80099401ACF
+S31508002D205C498842F1D3032039E00298316829408A
+S31508002D30884216D2306807218843029901433160D8
+S31508002D4000F0C4F80090306828400299884208D0FC
+S31508002D5000F0BCF80099401A4E498842F3D3032084
+S31508002D601DE02078400706D54B4801684E4A0A40C0
+S31508002D70E1681143016000F01DF84C49464A1268A3
+S31508002D80120A1207120F04235A43895CC906C90E90
+S31508002D90C840474908604748006800F09FF8FEBDEC
+S31508002DA000100240FFFFFFFE8C80C11F0C1002407E
+S31508002DB0FCFFFEEFFCB5382037490A680240002AB6
+S31508002DC00CD101203C490968C90A4907490F8840BE
+S31508002DD006003A483100FEF754FB44E00A68024010
+S31508002DE0082A01D136483EE00A680240102A2BD14B
+S31508002DF0344F38688007800F01903868000940070B
+S31508002E00400F401C0500019803280AD12C482900C8
+S31508002E10FEF737FB3968090A4906490E4843040094
+S31508002E2009E026482900FEF72CFB3968090A4906F5
+S31508002E30490E484304003868400F401C00902000A3
+S31508002E400099FEF71EFB0EE00A680240202A02D10E
+S31508002E508020000207E009680840182802D1FA20F5
+S31508002E60C00100E00020F6BD114800687047000068
+S31508002E700020024010B5FFF7F7FF0400FFF76CFCCF
+S31508002E801149000B04225043085CC006C00EC4401A
+S31508002E90200010BD8913000008100240FFF0FFFF54
+S31508002EA0601002405C100240FF8FFFFFE43E0008FE
+S31508002EB00C00002008000020001002400024F40046
+S31508002EC000127A000C100240DC3F00080148006836
+S31508002ED0704700BFD40100207047704738B5050019
+S31508002EE000241449087800281ED0FA2080000978A2
+S31508002EF0FEF7C7FA010010480068FEF7C2FA00F0AC
+S31508002F009BF800280DD1042D08D2002229000020A4
+S31508002F10C04300F080F80948056007E00120040076
+S31508002F2004E00120040001E0012004002000C0B2F2
+S31508002F3032BD00BF4A0000200C0000200800002017
+S31508002F4000B5010049B2002905D40121C206D20EF6
+S31508002F5091403C4A116000BDF0B5020052B2002A09
+S31508002F601CD40322384B040064B2A40804256C431D
+S31508002F701C59FF251600064008277E43B540AC437A
+S31508002F808D01EDB2024008267243954025430200A2
+S31508002F9052B29208042462439D5022E00F242B4B20
+S31508002FA0032205006DB22540083DAE0804256E4390
+S31508002FB005006DB22C40083CA40804256C431F5933
+S31508002FC0FF24A44615000540082465436446AC4022
+S31508002FD0A7438C01E4B2024008256A4394403C4367
+S31508002FE09C51F0BD10B50400601E8021490488423A
+S31508002FF001D301200EE0601E154908600321002058
+S31508003000C043FFF7A9FF00201249086007201249AC
+S315080030100860002010BD70B505000C0016002100E0
+S31508003020280040B2FFF798FF70BD10B504002000D5
+S3150800303040B2FFF785FF10BD10B504002000FFF76A
+S31508003040D1FF10BD00E100E000E400E01CED00E067
+S3150800305014E000E018E000E010E000E070B50400BD
+S315080030600D00002C01D1012059E03D20205C0028EC
+S3150800307005D100203C216054200000F017FA0220F8
+S315080030803D21605420688068254901402068816098
+S31508003090211D206800F0AEF92068836820688269DF
+S315080030A02068006A296819431E4B1340AA681A4308
+S315080030B0AB691B0213431C4A1A401C4B1340EA68AF
+S315080030C01A43EB691B0213432A6916011E432A6A2F
+S315080030D01203324322239843882398436E68064393
+S315080030E0686903013343206881602068826120682B
+S315080030F003620126482026543E2026543000C0B2DA
+S315080031003F2026543000C0B2442026543000C0B2B6
+S31508003110452026543000C0B23D202654002070BDFC
+S31508003120F8BFFEFFFCFCFFFFF3F3FFFF0F0FFFFFE7
+S31508003130F8B504000D003E20205C694648703F2023
+S31508003140205C694608704420275C4520265C002DD3
+S3150800315012D168464078012803D13800C0B2012848
+S3150800316001D001207AE0022001003E22A154C9B212
+S3150800317044216054C0B236E0042D12D16846007866
+S31508003180012803D13000C0B2012801D0012065E032
+S31508003190022001003F22A154C9B245216054C0B2A1
+S315080031A021E06846407801280BD168460078012856
+S315080031B007D13800C0B2012803D13000C0B20128B7
+S315080031C001D001204AE0022001003E22A154C9B2E2
+S315080031D001003F22A154C9B201004422A154C9B238
+S315080031E045216054C0B22800002802D004280CD01B
+S315080031F017E001220021206800F046F92068C0681F
+S31508003200022101432068C16021E0012204212068CF
+S3150800321000F03AF92068C068042101432068C160BB
+S3150800322015E001220021206800F02EF90122042170
+S31508003230206800F029F92068C06802210143206847
+S31508003240C1602068C068042101432068C160206805
+S31508003250006801210143206801600020F2BDF8B52D
+S3150800326004002068C06800902068076902252F427C
+S315080032701BD000982840002817D00220C043216898
+S31508003280086101202077206880698007800F002860
+S3150800329003D0200000F086F905E0200000F0F6F9DA
+S315080032A0200000F0F4F900202077042637421BD0CE
+S315080032B000983040002817D00420C04321680861D0
+S315080032C0257720688069C02189000140002903D03C
+S315080032D0200000F067F905E0200000F0D7F920008B
+S315080032E000F0D5F90020207708252F421AD000983B
+S315080032F02840002816D00820C04321680861267790
+S315080033002068C0698007800F002803D0200000F0DD
+S3150800331049F905E0200000F0B9F9200000F0B7F9F6
+S3150800332000202077102007421BD00099084000286B
+S3150800333017D01020C0432168086125772068C06926
+S31508003340C02189000140002903D0200000F02AF995
+S3150800335005E0200000F09AF9200000F098F9002016
+S315080033602077012007420AD000990840002806D095
+S315080033700120C04321680861200000F089F98220F5
+S3150800338080013840002808D00098000605D517485F
+S3150800339021680861200000F07CF9F80508D5009836
+S315080033A0000605D5124821680861200000F072F968
+S315080033B0402007420AD000990840002806D040203D
+S315080033C0C04321680861200000F065F92020074203
+S315080033D00AD000990840002806D02020C04321685A
+S315080033E00861200000F058F9F1BD00007FDFFFFFFB
+S315080033F0FFFEFFFF10B502681D4CA04202D01D4B10
+S31508003400984204D170239A4313004A681A43A0428B
+S315080034100BD0184B984208D0174B984205D0174B3B
+S31508003420984202D0174B984203D1154B1340CA68ED
+S315080034301A4380239A434B69134303608A68C2621E
+S315080034400A688262A04205D00C4A904202D00D4A10
+S31508003450904201D10A69026301224261046922404D
+S31508003460002A03D002690124A243026110BD0000AC
+S31508003470002C0140000400400020004000440140A8
+S31508003480FFFCFFFF0048014070B41F2401230D0014
+S315080034902540AB40056A9D430562056A0E00344027
+S315080034A01600A6402E43066270BC70477047FEE7BA
+S315080034B030B58DB024210024220004AD280000F088
+S315080034C0EDF80C21220001AD280000F0E7F8802075
+S315080034D000015D490A6802430A60096808400090CD
+S315080034E0009800F02DF8594D594828606C60AC607A
+S315080034F05848E8602C616C61AC6101200490059421
+S3150800350006900794089409940A900B940C9404A9BD
+S315080035102800FFF7A3FD01940294039401A928004B
+S3150800352000F0E4F8002206210E20FFF774FD0E20B5
+S31508003530FFF77BFD00212800FFF7FAFD0DB030BD2F
+S3150800354070B586B01421002632006C46200000F0C3
+S31508003550A5F801244048016821430160016821401B
+S3150800356005910599022501682943016000682840EC
+S3150800357005900598802040000090019502960396D4
+S3150800358004956946A020C00500F0ECF808200090D4
+S3150800359001950296039604946946304800F0E2F8CD
+S315080035A006B070BD10B501680968C90612D50121B3
+S315080035B02B4A11702B490A68521C0A600A68802334
+S315080035C0DB009A4218D300220A6027490A68521C6F
+S315080035D00A6011E000210A00214B1A70234A136879
+S315080035E05B1C136013688024E400A34204D31160B3
+S315080035F01F490A68521C0A601E4909780029FBD02F
+S3150800360010BD1CB51B4C002020701B48007800908C
+S315080036101A4803681A4802681A491B4800F0A8F9AC
+S315080036200120207013BD10B5FFF7EBFF164C2000E4
+S31508003630FDF73CFD0100200000F03FFA10BD80B503
+S315080036400248FFF70CFE01BD401002403C01002075
+S31508003650002C0140FFFF0000341002400004005017
+S31508003660DC010020C8010020D0010020C401002090
+S31508003670CC0100204900002048000020040000205A
+S315080036800000002094400008880100207047704719
+S3150800369070477047704770477047FEE71206130A6F
+S315080036A01A43130C1A4300BF094205D0830705D0F5
+S315080036B00270401C491EF9D17047000013001039EA
+S315080036C006D330B41400150010393CC0FCD230BC07
+S315080036D0490700D30CC000D504C0890002D3028074
+S315080036E0801C002900D502707047FEE770B50200FD
+S315080036F03C20105C012801D102202BE001253C204A
+S31508003700155402203D23D0541068406813689C68FD
+S31508003710114E1368B34203D1104B0340486818434F
+S31508003720702398430B680343106843601068B042DF
+S3150800373003D010680A4EB04206D180208443200088
+S315080037408C680443106884603D20155400203C258D
+S315080037505055002070BD0000002C0140FFFF0FFFF0
+S3150800376000040040F1B582B000230868D84000285C
+S3150800377000D1EBE0012508682C009C400440019428
+S315080037800198002800D1DFE0032648683040012868
+S3150800379003D04868304002281ED1029887681C006A
+S315080037A0022044433000A0408743C86884461C0072
+S315080037B0022044436046A0403843029CA060029C15
+S315080037C067682C009C40A7434C6824092C409C4001
+S315080037D03C432200029C626048683040032812D0AD
+S315080037E00298C7681C00022044433000A040874363
+S315080037F0886884461C00022044436046A04038433B
+S3150800380002000298C26048683040022821D1029816
+S31508003810DC0804277C430019076A072000970F2451
+S31508003820A4461F000740042467436446BC40009F23
+S31508003830A743BC460F691C00204004246043874008
+S31508003840604607433A000298DC0804277C430019BF
+S315080038500262029807681C00022044433000A04018
+S3150800386087434868304084461C000220444360462B
+S31508003870A04038430200029802604868C024A402A7
+S315080038800440002C60D0324C98080427784320580E
+S3150800389000900F27BC461F003000384008277843A1
+S315080038A0674687400098B84300900298A027FF050E
+S315080038B0B84201D1002510E00298264A90420CD061
+S315080038C00298254A904201D1022506E00298234A29
+S315080038D0904201D1350000E0052500981A001640EF
+S315080038E008225643B54005439808042250432550FC
+S315080038F01B4A1068019CA0434C68E40202D50400E8
+S31508003900019820431060174C2268019DAA434D6810
+S31508003910AD0202D51000019A02432260124C2068BB
+S31508003920019DA8434D68AD0302D5020001981043D6
+S3150800393020600E4C2268019DAA434D68ED0302D50E
+S315080039401000019A024322605B1C0EE7F7BD0000D7
+S31508003950601802400004005000080050000C005097
+S3150800396000180240041802408418024080180240D9
+S315080039700CB418B583B004000A0006A80290019496
+S315080039800020009002AB01A9084878441E30FCF7D5
+S315080039909BFB0021019A1170002801D40198001B95
+S315080039A004B0019910BC03B0084700BF9BD6FFFFBF
+S315080039B038B586B0142100252A0001AC2000FFF78F
+S315080039C06DFE012042490A6802430A6009680140FF
+S315080039D000910099802189023E4A13680B431360BF
+S315080039E012681140009100990E210191022102915D
+S315080039F0039003210491059001A9A020C005FFF7B3
+S31508003A00B1FE354C35482060E12040026060A56073
+S31508003A10E56025610C206061A561E56125622000ED
+S31508003A20FDF702FF002300220021200000F05EF8C7
+S31508003A300021200000F0C8F8200000F0A2F800F0ED
+S31508003A400AF8002206211C20FFF7E5FA1C20FFF7DA
+S31508003A50ECFA07B030BD1CB5012021490A680243BB
+S31508003A600A6009680840009000981E4C1E482060AD
+S31508003A70352060601020A0600020E0608021216170
+S31508003A806061A061E06120622000FEF73FFC1248F9
+S31508003A90C467A062002206210920FFF7BCFA0920A4
+S31508003AA0FFF7C3FA13BD80B50B48FDF763FF01BDE9
+S31508003AB080B50C48FEF772FD01BD38B505000C004F
+S31508003AC0220092B229000448FDF7F0FE31BD00003D
+S31508003AD0341002403C1002404C00002000440040D4
+S31508003AE038100240E000002008000240F2B5040049
+S31508003AF017001D00002C01D1012041E08820205824
+S31508003B00002805D10020842160542000FEF7FDFB23
+S31508003B102420882160502068006801218843216894
+S31508003B200860A06A002802D02000FEF7CCF9200021
+S31508003B30FEF7E6F8012801D1012021E02068806817
+S31508003B408021C90101432068816020688068344962
+S31508003B500140009808432168886078052E040643CA
+S31508003B60206800682F4901403143206801602068B9
+S31508003B70006801210143206801602000FEF720FA51
+S31508003B80F2BD10B501008420085C012801D102208D
+S31508003B9019E0012084228854242088228850086845
+S31508003BA000680A68126801239A430B681A601E4A5D
+S31508003BB00240002048660B681A60202388240B51AF
+S31508003BC08423C854002010BD70B505000C0084205D
+S31508003BD0285C012801D1022020E0012084216854B4
+S31508003BE0242088216850286806682868006801210A
+S31508003BF088432968086028688068C000C008204390
+S31508003C0029688860280000F011F8286806602020D6
+S31508003C1088216850002084216854002070BD000067
+S31508003C20FF7FFFFFFFFF00FCFFFFFFDFF8B5040083
+S31508003C30606E002805D101206A2160526821605211
+S31508003C402CE0082001006A46917069464870206891
+S31508003C508068400E4007400F6946087020688068F3
+S31508003C60400F05000E4E0F4F684640782900C9B22E
+S31508003C70795C48432900C9B2715CFDF7FFFB6A21EC
+S31508003C8060526846807869460978795C484369468F
+S31508003C900978715CFDF7F2FB68216052F1BD0000FE
+S31508003CA0BC400008B440000880B500F049F800F0B0
+S31508003CB00AF8FFF77DFEFFF7FBFBFFF7B4FC64206D
+S31508003CC000F056F8F9E730B591B03421002204A87F
+S31508003CD0FFF7E4FC102100226846FFF7DFFC80208E
+S31508003CE0800000F05BF802240494802040000790CE
+S31508003CF000250895402009900B940C940D951020EA
+S31508003D000E90802080020F90C020C005109004A855
+S31508003D10FEF72AFD002801D000F00FF807200090D2
+S31508003D2001940295039502216846FEF77BFF002859
+S31508003D3001D000F002F811B030BD00B572B6FEE74A
+S31508003D4010B5002409480168802252000A4302601F
+S31508003D500020FFF7C3F8002802D00120040001E084
+S31508003D6000F048F82000C0B210BD00000020024054
+S31508003D7070B50400FFF7AAF8050026000020C04326
+S31508003D80864202D0044800783618FFF79FF8401B91
+S31508003D90B042FAD370BD00BF4A00002030B5040017
+S31508003DA00F4801680F4A0A402243026080208000BB
+S31508003DB0844212D10C480068062148430B49FDF796
+S31508003DC060FB401C05000A480068400505D5002D23
+S31508003DD001D06D1EF7E7032000E0002030BD00008B
+S31508003DE000700040FFF9FFFF0C00002040420F0062
+S31508003DF01470004081B0012009490A6802430A602C
+S31508003E0009680840009000988020400505490A681E
+S31508003E1002430A60096808400090009801B070479C
+S31508003E20401002403C100240686A6C747A4C0000EC
+S31508003E307072696E74665F733A20256E20646973C2
+S31508003E40616C6C6F776564007072696E74663A208F
+S31508003E5062616420256E20617267756D656E7400F7
+S31508003E607072696E74665F733A20626164202573A6
+S31508003E7020617267756D656E7400000000000000B1
+S31508003E806E616E004E414E00696E6600494E4600F0
+S31508003E903000FEE715CD5B07B168DE3A0400000086
+S31508003EA00024F400CE400008CE400008CE400008AA
+S31508003EB0CE400008CE400008CE400008CE4000089C
+S31508003EC0FFFFFFFFFFFFFFFF62100008CE4000085C
+S31508003ED0CE400008FFFFFFFFFFFF000001010100C1
+S31508003EE000000000000000000000000000000000C4
+S31508003EF000000000000000000000000000000000B4
+S31508003F00000000000100000002000000030000009D
+S31508003F10040000000600000007000000080000007A
+S31508003F200900000070B40121002213E00368001D97
+S31508003F300B4202D04D46EB185B1E1A601B1D241F50
+S31508003F40042CFAD21D00A60701D51A80AD1C0C4018
+S31508003F5000D02A700468001D002CE7D170BC704799
+S31508003F6030B401210EE00368C318446808300C42D7
+S31508003F7002D04D462C19641E1D6825601B1D241D84
+S31508003F80121FF9D10268001D002AECD130BC704717
+S31508003F9010B5074979441831064C7C44163404E0B8
+S31508003FA0081D0A68891888470100A142F8D110BD82
+S31508003FB008000000280000006DFFFFFF94010000C4
+S31508003FC04C0000200000000099FFFFFF4C00000095
+S31508003FD0C4FEFFFF000000200000000000000000F3
+S31508003FE000000000000000000000000001000000C2
+S31508003FF002000000030000000400000000F00DF8B5
+S31508004000002801D0FFF7C4FF00BF00BF002000BF93
+S3150800401000BFFFF749FE00F002F80120704780B59F
+S3150800402000F002F801BDFEE707463846FDF7F2FB49
+S31508004030FBE7FEE70548014603B4684680F30988AE
+S3150800404000BF00BF00BF00BFFFF7D8FFA5EDF5FE14
+S31508004050010002000400060008000A000C00100017
+S31508004060200040008000000103480168034A1278D6
+S3150800407089180160704700BFD40100204A0000205B
+S31508004080704700B5FEE77047704780B5FFF7ECFF4D
+S3150800409001BDFEE77B25752C25752C25752C7D0A1B
+S315080040A0000000000148804701480047D140000849
+S315080040B03540000801010103070100000804020455
+S315080040C008010101FEE7FEE7FEE7FEE7FEE700005E
+S307080040D0704729
+S705080040357D

+ 7 - 4
project/ewarm/desk/desk.ewp

@@ -686,15 +686,15 @@
                 <option>
                     <name>OOCOutputFormat</name>
                     <version>3</version>
-                    <state>0</state>
+                    <state>3</state>
                 </option>
                 <option>
                     <name>OCOutputOverride</name>
-                    <state>0</state>
+                    <state>1</state>
                 </option>
                 <option>
                     <name>OOCOutputFile</name>
-                    <state>desk.srec</state>
+                    <state>$PROJ_DIR$/../../../output/desk.bin</state>
                 </option>
                 <option>
                     <name>OOCCommandLineProducer</name>
@@ -702,7 +702,7 @@
                 </option>
                 <option>
                     <name>OOCObjCopyEnable</name>
-                    <state>0</state>
+                    <state>1</state>
                 </option>
             </data>
         </settings>
@@ -2570,6 +2570,9 @@
         <file>
             <name>$PROJ_DIR$\..\..\..\desk\user\main.cpp</name>
         </file>
+        <file>
+            <name>$PROJ_DIR$\..\..\..\desk\user\MicroRLConfig.h</name>
+        </file>
         <file>
             <name>$PROJ_DIR$\..\..\..\desk\user\stm32g4xx_hal_conf.h</name>
         </file>

+ 3 - 0
project/ewarm/desk/desk.ewt

@@ -3270,6 +3270,9 @@
         <file>
             <name>$PROJ_DIR$\..\..\..\desk\user\main.cpp</name>
         </file>
+        <file>
+            <name>$PROJ_DIR$\..\..\..\desk\user\MicroRLConfig.h</name>
+        </file>
         <file>
             <name>$PROJ_DIR$\..\..\..\desk\user\stm32g4xx_hal_conf.h</name>
         </file>

+ 3 - 3
project/ewarm/robot/robot.ewp

@@ -679,11 +679,11 @@
                 </option>
                 <option>
                     <name>OCOutputOverride</name>
-                    <state>0</state>
+                    <state>1</state>
                 </option>
                 <option>
                     <name>OOCOutputFile</name>
-                    <state>robot.srec</state>
+                    <state>$PROJ_DIR$/../../../output/robot.bin</state>
                 </option>
                 <option>
                     <name>OOCCommandLineProducer</name>
@@ -691,7 +691,7 @@
                 </option>
                 <option>
                     <name>OOCObjCopyEnable</name>
-                    <state>0</state>
+                    <state>1</state>
                 </option>
             </data>
         </settings>

File diff ditekan karena terlalu besar
+ 5 - 3
project/ewarm/settings/tuber.wsdt


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini