Browse Source

Доработал второй экран.

unknown 1 month ago
parent
commit
0fbd16631d

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

@@ -45,16 +45,16 @@
 // Вывод на экран
 #define SCREEN_MENU
 
-// Коэффициент 1, верхний порог
-#define FACTOR_1_UP_THR     1050
+// Коэффициент 1 (диаметр колеса),  верхний порог
+#define FACTOR_1_UP_THR     999
 
-// Коэффициент 1, нижний порог
-#define FACTOR_1_DOWN_THR   950
+// Коэффициент 1 (диаметр колеса), нижний порог
+#define FACTOR_1_DOWN_THR   10
 
-// Коэффициент 2, верхний порог
-#define FACTOR_2_UP_THR     2050
+// Коэффициент 2 (коэффициент редукции), верхний порог
+#define FACTOR_2_UP_THR     9999
 
-// Коэффициент 2, нижний порог
-#define FACTOR_2_DOWN_THR   1950
+// Коэффициент 2 (коэффициент редукции), нижний порог
+#define FACTOR_2_DOWN_THR   1
 
 #endif /* #ifndef __CONFIG_H */

+ 20 - 60
desk/modules/menu/menu_items.cpp

@@ -95,8 +95,8 @@ void draw_main(uint8_t sel)
     update_flag = true;
                
 #ifdef SCREEN_MENU    
-    //screen_draw_main(sel);
-    screen_draw_settings(sel);
+    screen_draw_main(sel);
+    //screen_draw_settings(sel);
 #endif    
     
 #ifdef KEYBOARD_MENU    
@@ -170,10 +170,12 @@ static void screen_draw_main(uint8_t sel)
 {
     uint32_t raw_forw_turns, raw_back_turns, dir;
     int total;
+    double distance;
     move_t move;
         
     get_raw_params(&raw_forw_turns, &raw_back_turns, &dir);
     get_total(&total);
+    distance = get_distance();
     move = get_move();
     
     oled_clear(BLACK);
@@ -184,7 +186,7 @@ static void screen_draw_main(uint8_t sel)
     
     // Total
     memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    sprintf(screen_str_buf, "%d", total);
+    sprintf(screen_str_buf, ".2%f", distance);
     Paint_DrawString_EN(10, 52, screen_str_buf, &Font24, 0xf, 0x0);
     
     
@@ -229,86 +231,44 @@ static void screen_draw_settings(uint8_t sel)
     bool select;
     
     oled_clear(BLACK);
-    
-    //GFX_DrawRoundRectangle(0, 0, 127, 127, 5, 15);  
-    //Paint_DrawString_EN(45, 120, "Fly Electronics", &Font8, 0xf, 0x0);
             
     select = sel == MCELL_K1 ? true : false;
     memset(screen_str_buf, 0, SCREEN_BUF_LEN);
     Paint_DrawString_EN(4, MENU_1_STR_Y, "Diameter:", &Font16, 0xf, 0x0);
     memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    sprintf(screen_str_buf, "%u", settings.factor_1);
-    Paint_DrawString_EN(50, MENU_2_STR_Y, screen_str_buf, &Font16, 0xf, 0x0);
-    //if (select)
-        oled_double_frame(0);
-    
-    memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    Paint_DrawString_EN(4, MENU_3_STR_Y + MENU_OFF_BETWEEN_DOUBLE_STR, "Diameter:", &Font16, 0xf, 0x0);
-    memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    sprintf(screen_str_buf, "%u", settings.factor_1);
-    Paint_DrawString_EN(50, MENU_4_STR_Y + MENU_OFF_BETWEEN_DOUBLE_STR, screen_str_buf, &Font16, 0xf, 0x0);
-    
-    oled_display();
-    
-#if 0    
-    // Рамка
-    GFX_DrawRoundRectangle(1, 1, 126, 125, 3, 15);
-    
-    select = sel == MCELL_K1 ? true : false;
-    memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    sprintf(screen_str_buf, "F 1: %u", settings.factor_1);
-    GFX_DrawString(8, 20, (char*)screen_str_buf, 15, 0);
-       
+    oled_int_right_alignment_post(settings.factor_1, 11, (char*)"mm", screen_str_buf);
+    Paint_DrawString_EN(4, MENU_2_STR_Y, screen_str_buf, &Font16, 0xf, 0x0);
     if (select)
-        oled_draw_string_frame(0);
-    
+        oled_frame(MENU_1_STR_Y, true);
+
     select = sel == MCELL_K2 ? true : false;
     memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    sprintf(screen_str_buf, "F 2: %u", settings.factor_2);
-    GFX_DrawString(8, 40, (char*)screen_str_buf, 15, 0);
-    
+    Paint_DrawString_EN(4, MENU_3_STR_Y, "Gearbox:", &Font16, 0xf, 0x0);
+    memset(screen_str_buf, 0, SCREEN_BUF_LEN);
+    oled_int_right_alignment(settings.factor_2, 11, screen_str_buf);
+    Paint_DrawString_EN(4, MENU_4_STR_Y, screen_str_buf, &Font16, 0xf, 0x0);
     if (select)
-        oled_draw_string_frame(1);
+        oled_frame(MENU_3_STR_Y, true);
     
     select = sel == MCELL_REV ? true : false;
     memset(screen_str_buf, 0, SCREEN_BUF_LEN);
     if (settings.revers == true)
-        sprintf(screen_str_buf, "Rev.:  yes");
+        Paint_DrawString_EN(4, MENU_5_STR_Y, "Revers: yes", &Font16, 0xf, 0x0);
     else
-        sprintf(screen_str_buf, "Rev.:  no");
-    GFX_DrawString(8, 60, (char*)screen_str_buf, 15, 0);
-    
+        Paint_DrawString_EN(4, MENU_5_STR_Y, "Revers:  no", &Font16, 0xf, 0x0);
     if (select)
-        oled_draw_string_frame(2);
+        oled_frame(MENU_5_STR_Y, false);
     
     select = sel == MCELL_RES ? true : false;
     memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    if (settings.revers == true)
-        sprintf(screen_str_buf, "Reset");
-    else
-        sprintf(screen_str_buf, "Reset");
-    GFX_DrawString(8, 80, (char*)screen_str_buf, 15, 0);
-    
+    Paint_DrawString_EN(4, MENU_6_STR_Y, "Reset", &Font16, 0xf, 0x0);
     if (select)
-        oled_draw_string_frame(3);
+        oled_frame(MENU_6_STR_Y, false);
     
     oled_display();
-    
-    select = sel == MCELL_SAVE ? true : false;
-    memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    if (settings.revers == true)
-        sprintf(screen_str_buf, "Save set");
-    else
-        sprintf(screen_str_buf, "Save set");
-    GFX_DrawString(8, 100, (char*)screen_str_buf, 15, 0);
-    
-    if (select)
-        oled_draw_string_frame(4);
-    
-    oled_display();
-#endif    
 }
 #endif
+
 // -------------------------------------------------------------------------- //
 // Консольное меню. Вспомогательные функции.
 #ifdef KEYBOARD_MENU

+ 3 - 2
desk/modules/menu/menu_tree.h

@@ -26,12 +26,13 @@ MAKE_MENU(m_k2, 		m_revers,	    m_k1,		    m_main,		    NULL_ENTRY,
 MAKE_MENU(m_revers,     m_reset,        m_k2,		    m_main,		    NULL_ENTRY,
           MCELL_REV,    false,          &draw_settings, &change_revers);
 
-MAKE_MENU(m_reset,      m_save,		    m_revers,	    m_main,		    NULL_ENTRY,
+MAKE_MENU(m_reset,      m_main,		    m_revers,	    m_main,		    NULL_ENTRY,
           MCELL_RES,    false,          &draw_settings, &empty_func_bool);
 
+/*
 MAKE_MENU(m_save,       m_main,		    m_reset,		m_main,		    NULL_ENTRY,
           MCELL_SAVE,   false,          &draw_settings, &empty_func_bool);
-
+*/
 
 
 // Экран настроек. Пока отобразим один условный коэффициент.

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

@@ -153,8 +153,8 @@ void settings_set_def(void)
     memset(settings.fw_version, 0, 20);
     strcpy(settings.fw_version, FW_VERSION);
  
-    settings.factor_1 = 1000;
-    settings.factor_2 = 2000;
+    settings.factor_1 = 100;
+    settings.factor_2 = 459;
     settings.revers = false;
 }
 

+ 30 - 12
desk/modules/ssd_1327/oled_common.cpp

@@ -9,12 +9,14 @@
 #include "SSD1327.h"
 #include "cmsis_os.h"
 #include <string.h>
+#include <stdio.h>
 
 extern "C" {
 #include "GFX_SSD1327.h"
 #include "GUI_Paint.h"  
 #include "fonts.h"
 #include "fonts_old.h"
+#include "oled_config.h"
 }
   
 #if defined(I2C_BRIDGE)
@@ -483,24 +485,40 @@ void oled_draw_string_frame(uint8_t str_num)
 }
 
 //
-void oled_single_frame(uint8_t num)
+void oled_frame(uint8_t str_y, bool double_str)
 {
-    GFX_DrawRoundRectangle(0, 0, 127, MENU_STR_HEIGHT + 6, 3, 15);  
+    // Двойная строка
+    if (double_str) {
+        GFX_DrawRoundRectangle(0, str_y - FRAME_BORDER, 127, 2*MENU_STR_HEIGHT - FRAME_BORDER, 3, 15);
+    }
+    else {
+        GFX_DrawRoundRectangle(0, str_y - FRAME_BORDER, 127, MENU_STR_HEIGHT, 3, 15);
+    }
 }
 
-//
-void oled_double_frame(uint8_t num)
+// Выравнивание по правому краю.
+// Формирует строку, дополненную пробелами слева
+void oled_int_right_alignment(int value, uint8_t char_num, char *out)
 {
-    GFX_DrawRoundRectangle(0, 0, 127, 2*MENU_STR_HEIGHT + 6 + 1, 3, 15);  
-    
-  
-    num++;
+    char buf[20];
     
-    uint8_t height = 2*MENU_STR_HEIGHT + 6;
-    uint8_t offset = 2*num*MENU_STR_HEIGHT + 6 - 1;
-  
-    GFX_DrawRoundRectangle(0, offset, 127, height, 3, 15);  
+    memset(buf, 0, 20);
+    sprintf(buf, "%i", value);
+    strncpy(out, "            ", char_num - strlen(buf));
+    strcat(out, buf);
+}
 
+// Выравнивание по правому краю с размерностью
+// Формирует строку, дополненную пробелами слева с постфиксом
+void oled_int_right_alignment_post(int value, uint8_t char_num, char *postfix, char *out)
+{
+    char buf[20];
+    
+    memset(buf, 0, 20);
+    sprintf(buf, "%i", value);
+    strncpy(out, "            ", char_num - strlen(buf) - strlen(postfix));
+    strcat(out, buf);
+    strcat(out, postfix);
 }
 
 //

+ 7 - 2
desk/modules/ssd_1327/oled_common.h

@@ -5,6 +5,8 @@
  extern "C" {
 #endif
 
+#include <stdbool.h>   
+   
 //
 void init_oled(void);
 
@@ -65,10 +67,13 @@ void oled_clear(uint8_t color);
 void oled_draw_string_frame(uint8_t str_num);
 
 //
-void oled_single_frame(uint8_t num);
+void oled_frame(uint8_t str_y, bool double_str);
 
 //
-void oled_double_frame(uint8_t num);
+void oled_int_right_alignment(int value, uint8_t char_num, char *out);
+
+//
+void oled_int_right_alignment_post(int value, uint8_t char_num, char *postfix, char *out);
 
 //
 void oled_draw_rec(int x_start, int y_start, int x_end, int y_end, uint8_t color);

+ 6 - 4
desk/modules/ssd_1327/oled_config.h

@@ -104,18 +104,20 @@ typedef enum
 
 
 // Высота строки в меню настроек
-#define MENU_STR_HEIGHT         16
+#define MENU_STR_HEIGHT         20 //16
 
 #define MENU_OFF_BETWEEN_DOUBLE_STR 4
 
+#define DOUBLE_STR_OFFSET       3
+
 // Координата Y первой и остальных строк в меню настроек
 #define MENU_1_STR_Y            6 
-#define MENU_2_STR_Y            (MENU_1_STR_Y + MENU_STR_HEIGHT)
+#define MENU_2_STR_Y            (MENU_1_STR_Y + MENU_STR_HEIGHT - DOUBLE_STR_OFFSET)
 #define MENU_3_STR_Y            (MENU_1_STR_Y + 2*MENU_STR_HEIGHT)
-#define MENU_4_STR_Y            (MENU_1_STR_Y + 3*MENU_STR_HEIGHT)
+#define MENU_4_STR_Y            (MENU_1_STR_Y + 3*MENU_STR_HEIGHT - DOUBLE_STR_OFFSET)
 #define MENU_5_STR_Y            (MENU_1_STR_Y + 4*MENU_STR_HEIGHT)
 #define MENU_6_STR_Y            (MENU_1_STR_Y + 5*MENU_STR_HEIGHT)
 
-
+#define FRAME_BORDER            3
 
 #endif // __OLED_CONFIG_H

+ 24 - 6
desk/modules/uart_bridge/uart_bridge.cpp

@@ -15,17 +15,26 @@ osMessageQId mb_rx_queue;
 osThreadId ub_task_handle;
 void vUartBridge(void const *params);
 
+// -------------------------------------------------------------------------- //
+// Переменные для парсинга протокола
 static uint8_t rx_byte;
 static uint32_t error_cnt = 0;
 static char rx_buf[DATA_BUF_SIZE];
 
-uint32_t forw_turns;
-uint32_t back_turns;
+// -------------------------------------------------------------------------- //
+// Данные, полученные из протокола и вспомогательные переменные.
+uint32_t direction;     // направление движения с энкодера (0 - вперед, 1 - назад)
+uint32_t forw_turns;    // счетчик энкодера (вперед) 
+uint32_t back_turns;    // счетчик энкодера (назад) 
+
 uint32_t forw_turns_old;
 uint32_t back_turns_old;
-int total_turns;
-move_t move = m_stop;
-uint32_t direction;
+
+// -------------------------------------------------------------------------- //
+// Вычисляемые параметры.
+int total_turns;        // счетчик энкодера с учетом реверса
+move_t move = m_stop;   // статус робота (движение вперед, назад, остановка)
+float distance;         // пройденное расстояние в метрах (выводится на экран)
 
 
 //
@@ -137,6 +146,9 @@ void calculation(uint32_t forward, uint32_t back, uint32_t dir)
         total_turns = back_turns - forw_turns;
     }
     
+    // Расчет пройденного пути в метрах (преобразуем total_turns)
+    distance = total_turns/settings.factor_2;
+    
     // Направление движения и остановка
     calc_move();
 }
@@ -228,6 +240,12 @@ void get_total(int *val)
     *val = total_turns;
 }
 
+//
+float get_distance(void)
+{
+    return distance;
+}
+
 //
 move_t get_move(void)
 {
@@ -255,7 +273,7 @@ void inc_raw_counters(void)
 {
     static uint32_t f_cnt = 0;
     static uint32_t b_cnt = 0;
-    static uint32_t dir = 1;
+    static uint32_t dir = 0;
       
     calculation(f_cnt, b_cnt, dir);
 

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

@@ -39,6 +39,9 @@ void get_raw_params(uint32_t *f_turns, uint32_t *b_turns, uint32_t *dir);
 //
 void get_total(int *val);
 
+//
+float get_distance(void);
+
 //
 move_t get_move(void);
 

+ 4 - 0
desk/user/main.cpp

@@ -49,6 +49,10 @@ void StartupTask(void const *argument)
     
     // Настройки
     settings_crc_init();
+#if 1   
+    settings_set_def();
+    settings_save();
+#endif    
     settings_load();
     
     //

BIN
output/desk.bin


File diff suppressed because it is too large
+ 2 - 2
project/ewarm/settings/tuber.wsdt


Some files were not shown because too many files changed in this diff