Browse Source

Добавил сброс счетчиков.

TelenkovDmitry 1 month ago
parent
commit
ad61ab81ee

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

@@ -102,6 +102,9 @@ void change_factor_2(bool dir);
 //
 void change_revers(bool dir);
 
+//
+void change_reset_distance(bool dir);
+
 // -------------------------------------------------------------------------- //
 // Заглушки
 

+ 27 - 12
desk/modules/menu/menu_items.cpp

@@ -65,10 +65,10 @@ void menuFocus(void)
 {
     // Пункт "Сбросить счетчики"
     if (selectedMenuItem->Select == MCELL_RES) {
-        set_raw_counters(0, 0, 0);
+        reset_distance();
         return;
     }
-    
+
     // Пункт "Сохранить настройки"
     if (selectedMenuItem->Select == MCELL_SAVE) {
         settings_save();
@@ -160,6 +160,12 @@ void change_revers(bool dir)
         settings.revers = true;
 }
 
+// Сброс дистанции
+void change_reset_distance(bool dir)
+{
+    reset_distance();
+}
+
 // -------------------------------------------------------------------------- //
 // Экранное меню OLDED.
 
@@ -181,13 +187,22 @@ static void screen_draw_main(uint8_t sel)
     oled_clear(BLACK);
     
     // Скругленная рамка и логотип
-    GFX_DrawRoundRectangle(0, 0, 127, 127, 5, 15);  
-    Paint_DrawString_EN(45, 120, "Fly Electronics", &Font8, 0xf, 0x0);
+    //GFX_DrawRoundRectangle(0, 0, 127, 127, 5, 15);  
+    Paint_DrawString_EN(50, 120, "Fly Electronics", &Font8, 0xf, 0x0);
     
     // Total
+    //memset(screen_str_buf, 0, SCREEN_BUF_LEN);
+    //oled_float_right_aligment(distance, 7, screen_str_buf);
+    Paint_DrawString_EN(1, 36, "Distance (m):", &Font12, 0xf, 0x0);
+    
     memset(screen_str_buf, 0, SCREEN_BUF_LEN);
-    sprintf(screen_str_buf, ".2%f", distance);
-    Paint_DrawString_EN(10, 52, screen_str_buf, &Font24, 0xf, 0x0);
+    oled_float_right_aligment(distance, 7, screen_str_buf);
+    Paint_DrawString_EN(4, 52, screen_str_buf, &Font24, 0xf, 0x0);
+    
+    //sprintf(screen_str_buf, "%.2f", distance);
+    //Paint_DrawString_EN(10, 52, screen_str_buf, &Font24, 0xf, 0x0);
+    //Paint_DrawString_EN(4, 0, "01234567890", &Font24, 0xf, 0x0);
+    //Paint_DrawString_EN(4, 52, "01234567890", &Font24, 0xf, 0x0);
     
     
     //Paint_DrawString_EN(10, 52, "0.0", &Font24, 0xf, 0x0);
@@ -275,16 +290,19 @@ static void screen_draw_settings(uint8_t sel)
 static void cli_draw_main(uint8_t sel)
 {
     uint32_t raw_forw_turns, raw_back_turns, dir;
+    double distance = get_distance();
     
     get_raw_params(&raw_forw_turns, &raw_back_turns, &dir);
     
     DBG printf("\033c");
     DBG printf("~~~ MAIN SCREEN ~~~\r\n\n");
-    
+   
+    DBG printf("Total (m): %.2f\r\n", distance);
+#if 0    
     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);
-    
+#endif    
     update_flag = true;
 }
 
@@ -310,10 +328,7 @@ static void cli_draw_settings(uint8_t sel)
     
     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);
 }
 

+ 1 - 1
desk/modules/menu/menu_tree.h

@@ -27,7 +27,7 @@ MAKE_MENU(m_revers,     m_reset,        m_k2,		    m_main,		    NULL_ENTRY,
           MCELL_REV,    false,          &draw_settings, &change_revers);
 
 MAKE_MENU(m_reset,      m_main,		    m_revers,	    m_main,		    NULL_ENTRY,
-          MCELL_RES,    false,          &draw_settings, &empty_func_bool);
+          MCELL_RES,    false,          &draw_settings, &change_reset_distance);
 
 /*
 MAKE_MENU(m_save,       m_main,		    m_reset,		m_main,		    NULL_ENTRY,

+ 11 - 0
desk/modules/ssd_1327/oled_common.cpp

@@ -521,6 +521,17 @@ void oled_int_right_alignment_post(int value, uint8_t char_num, char *postfix, c
     strcat(out, postfix);
 }
 
+//
+void oled_float_right_aligment(float value, uint8_t char_num, char *out)
+{
+    char buf[20];
+    
+    memset(buf, 0, 20);
+    sprintf(buf, "%.2f", value);
+    strncpy(out, "            ", char_num - strlen(buf));
+    strcat(out, buf);
+}
+
 //
 void test_oled_old(void)
 {

+ 3 - 0
desk/modules/ssd_1327/oled_common.h

@@ -75,6 +75,9 @@ 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_float_right_aligment(float value, uint8_t char_num, char *out);
+
 //
 void oled_draw_rec(int x_start, int y_start, int x_end, int y_end, uint8_t color);
 

+ 35 - 17
desk/modules/uart_bridge/uart_bridge.cpp

@@ -32,9 +32,11 @@ uint32_t back_turns_old;
 
 // -------------------------------------------------------------------------- //
 // Вычисляемые параметры.
-int total_turns;        // счетчик энкодера с учетом реверса
+uint64_t clean_forw_turns;  // приращение
+uint64_t clean_back_turns;  // приращение
+long int total_turns;        // счетчик энкодера с учетом реверса
 move_t move = m_stop;   // статус робота (движение вперед, назад, остановка)
-float distance;         // пройденное расстояние в метрах (выводится на экран)
+double distance = 0.0;         // пройденное расстояние в метрах (выводится на экран)
 
 
 //
@@ -114,8 +116,8 @@ void vUartBridge(void const *params)
                 forw_turns = get_uint_param(rx_buf, 0);
                 back_turns = get_uint_param(rx_buf, 1);
                 direction = get_uint_param(rx_buf, 2);
-
-                calculation(forw_turns, back_turns, direction);
+                                
+                calculation(forw_turns, back_turns, forw_turns_old, back_turns_old, direction);
                 
                 begin = false;
                 cnt = 0;
@@ -132,22 +134,31 @@ void vUartBridge(void const *params)
 }
 
 // На вход поступают сырые данные из протокола
-void calculation(uint32_t forward, uint32_t back, uint32_t dir)
+void calculation(uint32_t forward, uint32_t back, 
+                 uint32_t forward_old, uint32_t back_old, uint32_t dir)
 {
-    forw_turns = forward;
-    back_turns = back;
+    if (forward >= forward_old)
+        clean_forw_turns += forward - forward_old;
+    else
+        clean_forw_turns += 0xFFFFFFFF - forward_old + forward;
+    
+    if (back >= back_old)
+        clean_back_turns += back - back_old;
+    else
+        clean_back_turns += 0xFFFFFFFF - back_old + back;
+
+    // Направление
     direction = dir;
     
     // Расчет пройденного пути
-    if (settings.revers == false) {
-        total_turns = forw_turns - back_turns;
-    }
-    else {
-        total_turns = back_turns - forw_turns;
-    }
-    
+    if (settings.revers == false)
+        total_turns = clean_forw_turns - clean_back_turns;
+    else
+        total_turns = clean_back_turns - clean_forw_turns;
+        
     // Расчет пройденного пути в метрах (преобразуем total_turns)
-    distance = total_turns/settings.factor_2;
+    distance = 3.141592*settings.factor_1/1000.0 * total_turns/settings.factor_2;
+    //distance = total_turns/settings.factor_2;
     
     // Направление движения и остановка
     calc_move();
@@ -226,6 +237,13 @@ void calc_move(void)
 // -------------------------------------------------------------------------- //
 // API
 
+//
+void reset_distance(void)
+{
+    clean_forw_turns = 0;
+    clean_back_turns = 0;
+}
+
 // Сырые счетчики и направления из канала связи без обработки.
 void get_raw_params(uint32_t *f_turns, uint32_t *b_turns, uint32_t *dir)
 {
@@ -241,7 +259,7 @@ void get_total(int *val)
 }
 
 //
-float get_distance(void)
+double get_distance(void)
 {
     return distance;
 }
@@ -275,7 +293,7 @@ void inc_raw_counters(void)
     static uint32_t b_cnt = 0;
     static uint32_t dir = 0;
       
-    calculation(f_cnt, b_cnt, dir);
+    //calculation(f_cnt, b_cnt, dir);
 
     f_cnt++;
             

+ 6 - 2
desk/modules/uart_bridge/uart_bridge.h

@@ -25,7 +25,8 @@ void usart_bridge_rx_cb(void);
 // Расчет параметров
 
 // На вход поступают сырые данные из протокола
-void calculation(uint32_t forward, uint32_t back, uint32_t dir);
+void calculation(uint32_t forward, uint32_t back, 
+                 uint32_t forward_old, uint32_t back_old, uint32_t dir);
 
 //
 void calc_move(void);
@@ -33,6 +34,9 @@ void calc_move(void);
 // -------------------------------------------------------------------------- //
 // API
 
+//
+void reset_distance(void);
+
 //
 void get_raw_params(uint32_t *f_turns, uint32_t *b_turns, uint32_t *dir);
 
@@ -40,7 +44,7 @@ void get_raw_params(uint32_t *f_turns, uint32_t *b_turns, uint32_t *dir);
 void get_total(int *val);
 
 //
-float get_distance(void);
+double get_distance(void);
 
 //
 move_t get_move(void);

+ 1 - 1
desk/user/main.cpp

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

BIN
output/desk.bin


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


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