Explorar el Código

Добавляю системные параметры.

TelenkovDmitry hace 9 meses
padre
commit
8efc35a943

+ 7 - 7
fw/modules/log/log.c

@@ -14,7 +14,7 @@
 #define DBG if(1)
 
 
-static struct ringfs fs_log;
+struct ringfs fs_log;
 struct ringfs fs_archive;
 
 SemaphoreHandle_t log_mutex;
@@ -94,7 +94,7 @@ void log_init(bool format)
     // Архив
     
 	ringfs_flash_archive.sector_size = spi_flash_desc.sector_size;
-	ringfs_flash_archive.sector_count = 4; //ARCHIVE_FLASH_SECTOR_COUNT;
+	ringfs_flash_archive.sector_count = ARCHIVE_FLASH_SECTOR_COUNT;
 
 	ringfs_init(&fs_archive, &ringfs_flash_archive, ARCHIV_ENTRY_VERSION, sizeof(archive_entry_t));
     
@@ -173,13 +173,13 @@ int log_append(void *entry, entry_type_t entry_type)
     
     if (entry_type == LOG_ENTRY) 
     {
-        log_etnry_ptr = entry;
+        log_etnry_ptr = (log_entry_t*)entry;
         log_etnry_ptr->crc = crc_8(entry, sizeof(log_entry_t) - 1);
         ret = ringfs_append(&fs_log, entry);
     }
     else if (entry_type == ARCHIVE_ENTRY) 
     {
-        archive_etnry_ptr = entry;
+        archive_etnry_ptr = (archive_entry_t*)entry;
         archive_etnry_ptr->crc = crc_8(entry, sizeof(archive_entry_t) - 1);
         ret = ringfs_append(&fs_archive, entry);
     }
@@ -289,9 +289,9 @@ int log_add_random_entry(uint8_t val, uint32_t cnt_entry)
         
         for (uint32_t i = 0; i < cnt_entry; i++)
         {
-            log_entry.code_type = log_index++;
-            log_entry.code_type = log_index++;
-            log_entry.code_type = log_index++;
+            log_entry.code_type = log_index;
+            log_entry.code_state = log_index;
+            log_entry.channel_number = log_index;
             log_entry.value = (float)log_index++;
             
             ret = log_append((void*)&log_entry, LOG_ENTRY);

+ 3 - 0
fw/modules/log/log.h

@@ -22,6 +22,9 @@ extern "C" {
 
 #define SECTOR_COUNT (spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET)
 
+#define MB_ARCHIVE_ENTRY                0x06
+  
+#define MB_LOG_ENTRY                    0x07
 
 //
 typedef enum 

+ 61 - 4
fw/modules/log/log_api.c

@@ -14,11 +14,13 @@
 #undef DBG
 #define DBG if(1)
 
+extern struct ringfs fs_log;
 extern struct ringfs fs_archive;
 
 extern SemaphoreHandle_t log_mutex;
 
 static archive_entry_t archive_entry;
+static log_entry_t log_entry;
 
 
 //
@@ -49,7 +51,7 @@ int log_get_archive_entry(uint32_t index, struct ringfs *fs, void *entry)
     
     log_fetch(entry, ARCHIVE_ENTRY, portMAX_DELAY);
 #if 1
-    printf("[entry] timestamp = % " PRId64 ", value = %u, crc = %u\r\n", 
+    printf("[archive entry] timestamp = % " PRId64 ", value = %u, crc = %u\r\n", 
            ent->timestamp, ent->input_value, ent->crc);
 #endif    
     return 0;
@@ -58,16 +60,54 @@ int log_get_archive_entry(uint32_t index, struct ringfs *fs, void *entry)
 //
 int log_get_log_entry(uint32_t index, struct ringfs *fs, void *entry)
 {
+    log_entry_t *ent = entry;
+    
+    int start = ringfs_count_estimate(fs);
+    
+    fs->cursor_position =  start - (index - 1) - 1;
+    
+	if (fs->cursor_position < 0)
+		return -1;
+	else
+    {
+		fs->cursor.sector = (fs->read.sector + fs->cursor_position/fs->slots_per_sector)%fs->flash->sector_count;
+		fs->cursor.slot = fs->cursor_position%fs->slots_per_sector;
+	}
+    
+    log_fetch(entry, LOG_ENTRY, portMAX_DELAY);
+
+#if 0    
+    uint64_t timestamp;
+    uint8_t code_type;  // код типа события
+    uint8_t code_state; // код состояния
+    uint8_t channel_number; // номер канала
+    float value;        // значение
+    uint8_t crc;
+#endif    
+#if 1    
+/*
+    printf("[log entry] timestamp = % " PRId64 ", code_type = %u, code_state = %u, \
+           channel_number = %u, value = %f, crc = %u\r\n", ent->timestamp, \
+           ent->code_type, ent->code_state, ent->channel_number, ent->value, ent->crc);
+*/    
+    printf("[log entry] timestamp = % " PRId64 ", code_type = %u",
+           ent->timestamp, ent->code_type);
+    
+    printf(" code_state = %u, channel_number = %u", ent->code_state, ent->channel_number);
     
+    printf(" value = %f, crc = %u\r\n", ent->value, ent->crc);
+    
+#endif    
+    return 0;
 }
 
 //
-int mb_log_get_entry(uint8_t *buf, uint16_t entry_index)
+int mb_archive_get_entry(uint8_t *buf, uint16_t entry_index)
 {
     uint8_t pack_len = 3;
-    buf[2] = 0x06;  // Reference type
+    buf[2] = MB_ARCHIVE_ENTRY;  // Reference type
     
-    log_get_entry(entry_index, &fs_archive, &archive_entry);
+    log_get_archive_entry(entry_index, &fs_archive, &archive_entry);
 #if 0    
     printf("[entry] timestamp = % " PRId64 ", value = %u, crc = %u\r\n", 
            archive_entry.timestamp, archive_entry.input_value, archive_entry.crc);
@@ -81,3 +121,20 @@ int mb_log_get_entry(uint8_t *buf, uint16_t entry_index)
     return pack_len;
 }
 
+//
+int mb_log_get_entry(uint8_t *buf, uint16_t entry_index)
+{
+    uint8_t pack_len = 3;
+    buf[2] = MB_LOG_ENTRY;  // Reference type
+    
+    log_get_log_entry(entry_index, &fs_log, &log_entry);
+    memcpy(&buf[3], &log_entry, sizeof(log_entry_t));
+    pack_len += sizeof(log_entry_t);
+    
+    buf[0] = pack_len; // Resp. data length, 1 byte
+    buf[1] = pack_len; // File Resp. length, 1 byte
+    
+    return pack_len;
+}
+
+

+ 3 - 0
fw/modules/log/log_api.h

@@ -12,6 +12,9 @@ void log_get_entry_count(void);
 //
 int log_get_archive_entry(uint32_t index, struct ringfs *fs, void *entry);
 
+//
+int log_get_log_entry(uint32_t index, struct ringfs *fs, void *entry);
+
 //
 int mb_log_get_entry(uint8_t *buf, uint16_t entry_index);
 

+ 36 - 13
fw/modules/modbus/modbus.c

@@ -4,6 +4,7 @@
 #include "update.h"
 #include "FreeRTOS.h"
 #include "task.h"
+#include "fr_timers.h"
 #include "mb.h"
 #include "mbport.h"
 #include "mbrtu.h"
@@ -11,7 +12,9 @@
 #include "modbus_params.h"
 #include "common_gpio.h"
 #include "io_utils.h"
+#include "log.h"
 #include "log_api.h"
+#include "settings_api.h"
 #include <stdio.h>
 #include <string.h>
 #include <stdbool.h>
@@ -32,10 +35,13 @@ static void modbus_task(void *params);
 //osThreadId modbus_params_handle;
 static void modbus_params(void *params);
 
+TimerHandle_t settings_timer_handle;
 //osTimerId reset_timer_handle;
 //osTimerId settings_timer_handle;
 //osTimerId modbus_timer_handle;
 
+void cb_settings_timer(TimerHandle_t timer);
+
 mb_delay_action_t mb_action = MB_NO_ACTION;
 uint8_t new_slave_addr;
 bool mb_package_flag = false;
@@ -54,7 +60,8 @@ void mb_init(void)
 	mb_init_params();
 
     mb_helper_tim_init(baud);
-    eMBInit(MB_RTU, mb_addr, 4, baud, par, stop_bits);
+    //eMBInit(MB_RTU, mb_addr, 4, baud, par, stop_bits);
+    settings_init_mb_port(mb_addr);
 	eMBSetSlaveID(0x34, TRUE, ucSlaveID, 3);
 	eMBEnable();
     
@@ -66,6 +73,8 @@ void mb_init(void)
     // Таймер для перехода в IAP
     update_create_timer();
     
+    settings_timer_handle = xTimerCreate("reset_timer", 10000, pdFALSE, (void *)0, cb_settings_timer);
+    
 #if 0    
 	osTimerDef(vResetTimer, modbus_reset);
 	reset_timer_handle = osTimerCreate(osTimer(vResetTimer), osTimerOnce, NULL);
@@ -107,6 +116,14 @@ void modbus_params(void *params)
                       
                 break;
                 
+                case MB_PAS_OK :
+                  
+                    //set_sys_settings_flag = true;
+                    //osTimerStart(settings_timer_handle, 30000);
+                    xTimerStart(settings_timer_handle, 0);
+                  
+                break;
+                
                 case MB_CHANGE_PORT_SETTINGS :
 #if 0                  
                     osDelay(200);
@@ -181,15 +198,6 @@ void modbus_reset(void const * params)
 }
 
 
-// Запуск таймера на изменение системных настроек
-void settings_timer(void const * params)
-{
-#if 0  
-    set_sys_settings_flag = false;
-    psw_ok = false;
-#endif    
-}
-
 
 // Запуск таймера для изменение настроек modbus
 void modbus_port_timer(void const * params)
@@ -465,7 +473,22 @@ eMBFuncReadFileRecordCB( UCHAR * pucFrame, USHORT * usLen )
                 record_index, record_num);
 #endif    
     
-    *usLen = 1 + mb_log_get_entry((uint8_t*)&pucFrame[1], record_index);
-    
+    if (reference_type == MB_ARCHIVE_ENTRY) {
+        *usLen = 1 + mb_archive_get_entry((uint8_t*)&pucFrame[1], record_index);
+    }
+    else if (reference_type == MB_LOG_ENTRY) {
+        *usLen = 1 + mb_log_get_entry((uint8_t*)&pucFrame[1], record_index);
+    }
+        
     return MB_EX_NONE;
-}
+}
+
+
+
+
+//
+void cb_settings_timer(TimerHandle_t timer)
+{
+    printf("Settings timer callback\r\n");
+    //psw_ok = false;
+}

+ 28 - 6
fw/modules/modbus/modbus_params.c

@@ -13,6 +13,8 @@
 mb_param_t mb_param[MB_PARAM_MAX];
 
 uint32_t rtc_sinhro;
+uint16_t psw;   // Пароль для установки системных настроек
+bool psw_ok = false;
 
 void get_time(uint8_t* buf, uint8_t size);
 void get_din_mode(uint8_t* buf, uint8_t size);
@@ -220,17 +222,23 @@ void mb_init_params(void)
     
     index++;
     
-/*    
-    // Емкость архива (максимальная)
-    mb_param[index].reg = 0x0901;
+	// ---------------------------------------------------------------------- //
+	//	Системные настройки
+	// ---------------------------------------------------------------------- //
+
+    
+    
+    // Пароль
+    mb_param[index].reg = 0x008A;
 	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&log_entries_capacity; // 
-	mb_param[index].set = NULL;
+	mb_param[index].param = (uint8_t*)&psw; // 
+	mb_param[index].set = mb_password;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
     index++;
-*/    
+    
+    
 }
 
 
@@ -382,6 +390,20 @@ mb_delay_action_t mb_set_time(void)
     return MB_NO_ACTION;
 }
 
+//
+mb_delay_action_t mb_password(void)
+{
+    if (psw != MB_PASSWORD)
+        return MB_PAS_ERR;
+    else {
+        if (psw_ok == false) {
+            psw_ok = true;
+            return MB_PAS_OK;
+        }
+        else
+            return MB_NO_ACTION;
+    }
+}
 
 
 // -------------------------------------------------------------------------- //

+ 4 - 1
fw/modules/modbus/modbus_params.h

@@ -16,7 +16,7 @@ extern "C" {
 
 #define SWAP_16(x, y)   {x[0] = y >> 8; x[1] = y & 0x0FF;}
   
-#define MB_PARAM_MAX			58//54
+#define MB_PARAM_MAX			59//54
 
 
 //
@@ -72,6 +72,9 @@ mb_delay_action_t mb_set_do(void);
 //
 mb_delay_action_t mb_set_do_mode(void);
 
+//
+mb_delay_action_t mb_password(void);
+
 // -------------------------------------------------------------------------- //
 //                      Проверка параметров                                   //
 // -------------------------------------------------------------------------- //

+ 522 - 315
fw/modules/settings/settings_api.c

@@ -1,315 +1,522 @@
-#include "at32f403a_407.h" 
-#include "settings_api.h"
-#include "sys_api.h"
-#include "FreeRTOS.h"
-#include "task.h"
-#include "queue.h"
-#include "semphr.h"
-#include "common_config.h"
-#include "common.h"
-#include "at32_uid.h"
-#include "hash.h"
-#include <math.h> 
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-
-SemaphoreHandle_t flash_mutex;
-
-
-// Флаг подтверждения новых сетевых параметров пользователем
-bool fConfirmWebParams = false;
-   
-// Системные настройки
-sys_settings_t sys_settings;
-
-// Общая структура настроек
-settings_t settings;
-
-
-//
-void init_settings(void)
-{
-    flash_mutex = xSemaphoreCreateMutex();
-}
-
-// Загрузка структуры настроек из flesh
-void settings_load(settings_t *settings)
-{
-    uint32_t loadCRC;  // CRC из flash
-    uint32_t newCRC;   // CRC загруженной структуры настроек
-    bool need_default = false;
-    
-    settings_read_from_flash((uint8_t*)settings, sizeof(settings_t));
-    
-    // Считываем CRC из флеш памяти
-    loadCRC = (*(uint32_t*)CRC_ADDRESS);
-    
-    // Рассчитываем CRC для структуры настроек
-    newCRC = settings_get_crc(settings);
-
-    // Если CRC не совпадают нужно прошивать дефолтные настройки
-    if (loadCRC != newCRC) {
-        need_default = true;
-    }
-    // CRC совпала, проверяем контрольное слово если слово не совпадает
-    // то это значит, что поплыла структура нстроек, прошиваем дефолт
-    else if (settings->control_word != SETTINGS_CONTROL_WORD)  
-    {
-        need_default = true;
-    }
-    // CRC и контрольное слово совпали, проверяем номер версии настроек.
-    // Если версия в настройках и прошивке не совпадают
-    // (при обновлении изменили структуру настроек), прошиваем дефолт 
-    else if (settings->settings_version != SETTINGS_VERSION)
-    {
-        need_default = true;
-    }
-    
-    // Прошиваем дефолтные настройки если нужно
-    if (need_default) 
-    {
-        settings_set_all_default();
-        settings_save(settings);
-    }
-#if 1    
-    //SETTINGS_Print();
-#endif    
-}
-
-//
-void settings_read_from_flash(uint8_t *data, uint32_t size)
-{
-    uint32_t baseAddress = SETTINGS_SECTOR;
-        
-    for (uint32_t i = 0; i < size; i++)
-        *data++ = (*(uint32_t*)baseAddress++);;
-}
-
-//
-uint32_t settings_get_crc(settings_t *settings)
-{
-    crc_data_reset();
-    return crc_block_calculate((uint32_t*)settings, sizeof(settings_t)/4 - 1);
-}
-
-//
-uint32_t settings_get_crit_sec_crc(settings_t *settings)
-{
-    crc_data_reset();
-    uint32_t critsec_len = (uint32_t)((uint8_t *)(&settings->critical_section_crc) - (uint8_t *)settings) / 4;
-    return crc_block_calculate((uint32_t *)settings, critsec_len);
-}
-
-// Сброс всех настроек в значения по умолчанию
-void settings_set_all_default(void)
-{
-    settings_set_modbus_def(&settings.com_settings.mb_port);
-    
-    memset(settings.com_settings.model, 0, MODEL_LEN);
-    memcpy(settings.com_settings.model, MODEL_STR, strlen(MODEL_STR));
-        
-    settings.settings_version = SETTINGS_VERSION;
-    settings.critical_section_crc = settings_get_crit_sec_crc(&settings);
-    settings.control_word = SETTINGS_CONTROL_WORD;
-
-    // Дискретные/счетные входы
-    settings_din_def(&settings);
-    
-    // Выходы
-    settings_do_def(&settings);
-    
-    // Безопасный режим
-    settings.save_mode = 1; 
-    
-    // Время ожидания опроса (сек.)
-    settings.save_delay = 60;
-    
-#if 0  
-    SETTINGS_SetWebParamsDef();
-    SETTINGS_SetTempWebParamsDef();
-    SETTINGS_SetInfoDef();
-    SETTINGS_SetGSMDef();
-    SETTINGS_SetFlagsDef();
-    
-    SETTINGS_SetEthternetSwitchDef();
-    SETTINGS_SetSntpDef();
-    SETTINGS_SetServerParamsDef();
-    SETTINGS_SetProxyParamsDef();
-    SETTINGS_SetPortGwDef();
-    SETTINGS_SetPSDDef();
-    SETTINGS_SetServiceDef();
-    
-    sSettings.settVer = SETTINGS_VERSION;
-    
-    sSettings.CritSecCRC = settings_get_crit_sec_crc();
-    
-    sSettings.controlWorld = SETTINGS_CONTROL_WORD;
-#endif    
-}
-
-// -------------------------------------------------------------------------- //
-// Настройки по умолчанию
-
-//
-void settings_set_modbus_def(uint16_t *mb_port)
-{
-    modbus_t mb_settings;
-    
-    mb_settings.baud = BRD_115200;
-	mb_settings.parity = NO_PAR;
-	mb_settings.databits = DATABITS_8;
-	mb_settings.stopbits = STOP_1;
-    
-    settings_conv_modbus_def(&mb_settings, mb_port);
-}
-
-//
-void settings_conv_modbus_def(modbus_t *mb_settings, uint16_t *mb_port)
-{
-	uint16_t param = 0;
-
-	// Количестро стоп бит (0-1 биты)
-	if (mb_settings->stopbits == STOP_1)
-		param = 0x00;
-	else if (mb_settings->stopbits == STOP_2)
-		param = 0x02; 		
-
-	// Длина слова (2ой бит)
-	param |= 0x00 << 2;
-
-	// Контроль четности (3-4 биты)
-	if (mb_settings->parity == NO_PAR)
-		param |= 0x00 << 3;
-	else if (mb_settings->parity == EVEN_PAR)
-		param |= 0x02 << 3;
-	else if (mb_settings->parity == ODD_PAR)
-		param |= 0x03 << 3;
-
-	// Скорость (5 - 7 биты)
-	switch (mb_settings->baud)
-	{
-		case BRD_2400 :
-			param |= 0x00 << 5;
-		break;
-
-		case BRD_4800 :
-			param |= 0x01 << 5;
-		break;
-
-		case BRD_9600 :
-			param |= 0x02 << 5;
-		break;
-
-		case BRD_19200 :
-			param |= 0x03 << 5;
-		break;
-
-		case BRD_38400 :
-			param |= 0x04 << 5;
-		break;
-
-		case BRD_57600 :
-			param |= 0x05 << 5;
-		break;
-
-		case BRD_115200 :
-			param |= 0x06 << 5;
-		break;
-
-		default : break;
-	}
-
-	*mb_port = param;
-}
-
-// Установить параметры дискретных входов по умолчанию
-void settings_din_def(settings_t *settings)
-{
-    settings->di_mode_bits = 0;
-    settings->di_norm_state_bits = 0;
-    
-    for (int i = 0; i < DI_NUMBER; i++) {
-        settings->di_debounce[i] = 50;
-    }
-}
-
-// Выходы
-void settings_do_def(settings_t *settings)
-{
-    settings->do_mode_bits = 0; // режим работы выхода (обычный выход)
-    settings->do_bits = 0;      // последнее сохраненное значение 
-    settings->do_save_bits = 0;
-    
-    for (uint8_t i = 0; i < DO_NUMBER; i++)
-    {
-        settings->do_pwm[i] = 30;
-        settings->do_pwm_save[i] = 30; // значение на выходах в бесопасном режиме работы
-        settings->do_pwm_period[i] = 50;
-        settings->do_pwm_period_save[i] = 50;
-    }
-}
-
-// -------------------------------------------------------------------------- //
-
-// Запись структуры настроек во flash
-void settings_save(settings_t *settings)
-{
-    xSemaphoreTake(flash_mutex, portMAX_DELAY);
-    
-    settings->critical_section_crc = settings_get_crit_sec_crc(settings);
-    
-    settings_write_to_flash((uint8_t*)settings, sizeof(settings_t));
-    xSemaphoreGive(flash_mutex);
-}
-
-//
-void settings_write_to_flash(uint8_t *data, uint32_t size)
-{
-    uint32_t baseAddress = SETTINGS_SECTOR;
-    uint32_t checkCrc = 0;
-    uint32_t crc = settings_get_crc((settings_t*)data);
-    flash_status_type status;
-    uint8_t *ptr = data;
-    
-    for (uint8_t i = 0; i < 3; i++)
-    {	
-        flash_unlock();
-    
-        settings_erase_flash_sector();
-
-        for (uint32_t i = 0; i < size; i++)
-            if ((status = flash_byte_program(baseAddress++, *data++)) != FLASH_OPERATE_DONE) {
-                DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
-                break;
-            }
-    
-        if ((status = flash_word_program((uint32_t)CRC_ADDRESS, crc)) != FLASH_OPERATE_DONE) {
-            DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
-        }
-    
-        flash_lock();
-    
-        /* Считываем что записали */
-        settings_read_from_flash(ptr, sizeof(settings_t));
-    
-        checkCrc = settings_get_crc((settings_t*)ptr);
-    
-        /* Проверяем  CRC того что было записано */
-        if (checkCrc == crc)
-            break;
-    }
-}
-
-// Очистка сектора настроек
-void settings_erase_flash_sector(void)
-{
-    flash_status_type status;
-
-    if ((status = flash_sector_erase(SETTINGS_SECTOR)) != FLASH_OPERATE_DONE) {
-        DBG printf("SETTINGS_EraseFlashSector error: status = %d/r/n", status);
-    }
-}
-
-
+#include "at32f403a_407.h" 
+#include "settings_api.h"
+#include "sys_api.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "semphr.h"
+#include "common_config.h"
+#include "common.h"
+#include "at32_uid.h"
+#include "hash.h"
+#include "utility.h"
+#include <math.h> 
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+SemaphoreHandle_t flash_mutex;
+
+
+// Флаг подтверждения новых сетевых параметров пользователем
+bool fConfirmWebParams = false;
+   
+// Системные настройки
+sys_settings_t sys_settings;
+
+// Общая структура настроек
+settings_t settings;
+
+// Настройки порта UART - RS485 (Modbus) в человеческом формате
+modbus_t mb_port_settings;
+
+//
+void init_settings(void)
+{
+    flash_mutex = xSemaphoreCreateMutex();
+}
+
+// Загрузка структуры настроек из flash
+void settings_load(settings_t *settings)
+{
+    uint32_t loadCRC;  // CRC из flash
+    uint32_t newCRC;   // CRC загруженной структуры настроек
+    bool need_default = false;
+    
+    settings_read_from_flash((uint8_t*)settings, sizeof(settings_t));
+    
+    // Считываем CRC из флеш памяти
+    loadCRC = (*(uint32_t*)CRC_ADDRESS);
+    
+    // Рассчитываем CRC для структуры настроек
+    newCRC = settings_get_crc(settings);
+
+    // Если CRC не совпадают нужно прошивать дефолтные настройки
+    if (loadCRC != newCRC) {
+        need_default = true;
+    }
+    // CRC совпала, проверяем контрольное слово если слово не совпадает
+    // то это значит, что поплыла структура нстроек, прошиваем дефолт
+    else if (settings->control_word != SETTINGS_CONTROL_WORD)  
+    {
+        need_default = true;
+    }
+    // CRC и контрольное слово совпали, проверяем номер версии настроек.
+    // Если версия в настройках и прошивке не совпадают
+    // (при обновлении изменили структуру настроек), прошиваем дефолт 
+    else if (settings->settings_version != SETTINGS_VERSION)
+    {
+        need_default = true;
+    }
+    
+    // Прошиваем дефолтные настройки если нужно
+    if (need_default) 
+    {
+        settings_set_all_default();
+        settings_save(settings);
+    }
+#if 1    
+    //SETTINGS_Print();
+#endif    
+}
+
+//
+void settings_read_from_flash(uint8_t *data, uint32_t size)
+{
+    uint32_t baseAddress = SETTINGS_SECTOR;
+        
+    for (uint32_t i = 0; i < size; i++)
+        *data++ = (*(uint32_t*)baseAddress++);;
+}
+
+//
+uint32_t settings_get_crc(settings_t *settings)
+{
+    crc_data_reset();
+    return crc_block_calculate((uint32_t*)settings, sizeof(settings_t)/4 - 1);
+}
+
+//
+uint32_t settings_get_crit_sec_crc(settings_t *settings)
+{
+    crc_data_reset();
+    uint32_t critsec_len = (uint32_t)((uint8_t *)(&settings->critical_section_crc) - (uint8_t *)settings) / 4;
+    return crc_block_calculate((uint32_t *)settings, critsec_len);
+}
+
+// Сброс всех настроек в значения по умолчанию
+void settings_set_all_default(void)
+{
+    settings_set_modbus_def(&settings.com_settings.mb_port);
+    
+    memset(settings.com_settings.model, 0, MODEL_LEN);
+    memcpy(settings.com_settings.model, MODEL_STR, strlen(MODEL_STR));
+        
+    settings.settings_version = SETTINGS_VERSION;
+    settings.critical_section_crc = settings_get_crit_sec_crc(&settings);
+    settings.control_word = SETTINGS_CONTROL_WORD;
+
+    // Дискретные/счетные входы
+    settings_din_def(&settings);
+    
+    // Выходы
+    settings_do_def(&settings);
+    
+    // Безопасный режим
+    settings.save_mode = 1; 
+    
+    // Время ожидания опроса (сек.)
+    settings.save_delay = 60;
+    
+    // Время ведения архива (сек.)
+    settings.period_archive = 3600;
+    
+#if 0  
+    SETTINGS_SetWebParamsDef();
+    SETTINGS_SetTempWebParamsDef();
+    SETTINGS_SetInfoDef();
+    SETTINGS_SetGSMDef();
+    SETTINGS_SetFlagsDef();
+    
+    SETTINGS_SetEthternetSwitchDef();
+    SETTINGS_SetSntpDef();
+    SETTINGS_SetServerParamsDef();
+    SETTINGS_SetProxyParamsDef();
+    SETTINGS_SetPortGwDef();
+    SETTINGS_SetPSDDef();
+    SETTINGS_SetServiceDef();
+    
+    sSettings.settVer = SETTINGS_VERSION;
+    
+    sSettings.CritSecCRC = settings_get_crit_sec_crc();
+    
+    sSettings.controlWorld = SETTINGS_CONTROL_WORD;
+#endif    
+}
+
+// -------------------------------------------------------------------------- //
+// Настройки по умолчанию
+
+//
+void settings_set_modbus_def(uint16_t *mb_port)
+{
+    modbus_t mb_settings;
+    
+    mb_settings.baud = BRD_115200;
+	mb_settings.parity = NO_PAR;
+	mb_settings.databits = DATABITS_8;
+	mb_settings.stopbits = STOP_1;
+    
+    settings_conv_modbus_def(&mb_settings, mb_port);
+}
+
+//
+void settings_conv_modbus_def(modbus_t *mb_settings, uint16_t *mb_port)
+{
+	uint16_t param = 0;
+
+	// Количестро стоп бит (0-1 биты)
+	if (mb_settings->stopbits == STOP_1)
+		param = 0x00;
+	else if (mb_settings->stopbits == STOP_2)
+		param = 0x02; 		
+
+	// Длина слова (2ой бит)
+	param |= 0x00 << 2;
+
+	// Контроль четности (3-4 биты)
+	if (mb_settings->parity == NO_PAR)
+		param |= 0x00 << 3;
+	else if (mb_settings->parity == EVEN_PAR)
+		param |= 0x02 << 3;
+	else if (mb_settings->parity == ODD_PAR)
+		param |= 0x03 << 3;
+
+	// Скорость (5 - 7 биты)
+	switch (mb_settings->baud)
+	{
+		case BRD_2400 :
+			param |= 0x00 << 5;
+		break;
+
+		case BRD_4800 :
+			param |= 0x01 << 5;
+		break;
+
+		case BRD_9600 :
+			param |= 0x02 << 5;
+		break;
+
+		case BRD_19200 :
+			param |= 0x03 << 5;
+		break;
+
+		case BRD_38400 :
+			param |= 0x04 << 5;
+		break;
+
+		case BRD_57600 :
+			param |= 0x05 << 5;
+		break;
+
+		case BRD_115200 :
+			param |= 0x06 << 5;
+		break;
+
+		default : break;
+	}
+
+	*mb_port = param;
+}
+
+// Установка параметров Modbus
+void settings_set_modbus_params(uint16_t mb_port)
+{
+	uint16_t param = 0;
+
+	// Количестро стоп бит (0-1 биты)
+	param = 0x0003 & mb_port; 
+
+	if (param == 0x00)
+		mb_port_settings.stopbits = STOP_1;
+	else if (param == 0x02)
+		mb_port_settings.stopbits = STOP_2;
+
+	// Длина слова (2ой бит)
+	param = (0x0004 & mb_port) >> 2;
+
+	mb_port_settings.databits = DATABITS_8;
+	
+	// Контроль четности (3-4 биты)
+	param = (0x0018 & mb_port) >> 3; 
+
+	if (param == 0x00)
+		mb_port_settings.parity = NO_PAR;
+	else if (param == 0x02)
+		mb_port_settings.parity = EVEN_PAR;
+	else if (param == 0x03)
+		mb_port_settings.parity = ODD_PAR;
+
+	// Скорость (5 - 7 биты)
+	param = (0x00E0 & mb_port) >> 5; 
+
+	switch (param)
+	{
+		case 0x00 :
+			mb_port_settings.baud = BRD_2400;
+		break;
+
+		case 0x01 :
+			mb_port_settings.baud = BRD_4800;
+		break;
+
+		case 0x02 :
+			mb_port_settings.baud = BRD_9600;
+		break;
+
+		case 0x03 :
+			mb_port_settings.baud = BRD_19200;
+		break;
+
+		case 0x04 :
+			mb_port_settings.baud = BRD_38400;
+		break;
+
+		case 0x05 :
+			mb_port_settings.baud = BRD_57600;
+		break;
+
+		case 0x06 :
+			mb_port_settings.baud = BRD_115200;
+		break;
+
+		default : break;
+	}
+}
+
+//
+uint32_t settings_get_mb_baud(modbus_t *mb_settings)
+{
+    switch (mb_settings->baud)
+    {
+        case BRD_1200 :
+          return 1200;
+        break;
+        
+        case BRD_2400 :
+          return 2400;
+        break;
+        
+        case BRD_4800 :
+            return 4800;
+        break;
+        
+        case BRD_9600 :
+            return 9600;
+        break;
+        
+        case BRD_19200 :
+            return 19200;
+        break;
+        
+        case BRD_38400 :
+            return 38400;
+        break;
+        
+        case BRD_57600 :
+            return 57600;
+        break;
+        
+        case BRD_115200 :
+            return 115200;
+        break;
+        
+        case BRD_230400 :
+            return 230400;
+        break;
+        
+        case BRD_460800 :
+            return 460800;
+        break;
+        
+        default :
+            return 115200; 
+        break;
+    }
+}
+
+//
+eMBParity settings_get_mb_par(modbus_t *mb_settings)
+{
+    switch (mb_settings->parity)
+    {
+        case NO_PAR :
+            return MB_PAR_NONE;
+        break;
+        
+        case ODD_PAR :
+            return MB_PAR_ODD;
+        break;
+        
+        case EVEN_PAR :
+            return MB_PAR_EVEN;
+        break;
+        
+        default :
+            return MB_PAR_NONE;
+        break;
+    }
+}
+
+//
+void settings_init_mb_port(uint8_t mb_addr)
+{
+    uint32_t baud = settings_get_mb_baud(&mb_port_settings);
+    eMBParity par = settings_get_mb_par(&mb_port_settings);
+    
+    eMBInit(MB_RTU, mb_addr, 4, baud, par, mb_port_settings.stopbits);
+}
+
+
+// Установить параметры дискретных входов по умолчанию
+void settings_din_def(settings_t *settings)
+{
+    settings->di_mode_bits = 0;
+    settings->di_norm_state_bits = 0;
+    
+    for (int i = 0; i < DI_NUMBER; i++) {
+        settings->di_debounce[i] = 50;
+    }
+}
+
+// Выходы
+void settings_do_def(settings_t *settings)
+{
+    settings->do_mode_bits = 0; // режим работы выхода (обычный выход)
+    settings->do_bits = 0;      // последнее сохраненное значение 
+    settings->do_save_bits = 0;
+    
+    for (uint8_t i = 0; i < DO_NUMBER; i++)
+    {
+        settings->do_pwm[i] = 30;
+        settings->do_pwm_save[i] = 30; // значение на выходах в бесопасном режиме работы
+        settings->do_pwm_period[i] = 50;
+        settings->do_pwm_period_save[i] = 50;
+    }
+}
+
+// -------------------------------------------------------------------------- //
+
+// Запись структуры настроек во flash
+void settings_save(settings_t *settings)
+{
+    xSemaphoreTake(flash_mutex, portMAX_DELAY);
+    
+    settings->critical_section_crc = settings_get_crit_sec_crc(settings);
+    
+    settings_write_to_flash((uint8_t*)settings, sizeof(settings_t));
+    xSemaphoreGive(flash_mutex);
+}
+
+//
+void settings_write_to_flash(uint8_t *data, uint32_t size)
+{
+    uint32_t baseAddress = SETTINGS_SECTOR;
+    uint32_t checkCrc = 0;
+    uint32_t crc = settings_get_crc((settings_t*)data);
+    flash_status_type status;
+    uint8_t *ptr = data;
+    
+    for (uint8_t i = 0; i < 3; i++)
+    {	
+        flash_unlock();
+    
+        settings_erase_flash_sector();
+
+        for (uint32_t i = 0; i < size; i++)
+            if ((status = flash_byte_program(baseAddress++, *data++)) != FLASH_OPERATE_DONE) {
+                DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
+                break;
+            }
+    
+        if ((status = flash_word_program((uint32_t)CRC_ADDRESS, crc)) != FLASH_OPERATE_DONE) {
+            DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
+        }
+    
+        flash_lock();
+    
+        /* Считываем что записали */
+        settings_read_from_flash(ptr, sizeof(settings_t));
+    
+        checkCrc = settings_get_crc((settings_t*)ptr);
+    
+        /* Проверяем  CRC того что было записано */
+        if (checkCrc == crc)
+            break;
+    }
+}
+
+// Очистка сектора настроек
+void settings_erase_flash_sector(void)
+{
+    flash_status_type status;
+
+    if ((status = flash_sector_erase(SETTINGS_SECTOR)) != FLASH_OPERATE_DONE) {
+        DBG printf("SETTINGS_EraseFlashSector error: status = %d/r/n", status);
+    }
+}
+
+// -------------------------------------------------------------------------- //
+
+void settings_print(void)
+{
+    uint16_t foo = settings.com_settings.mb_port;
+    
+    printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
+    printf("   Общие настройки для bootloader и FW");
+    printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n\n");
+    
+    printf("Настройки порта (Modbus): 0x%X\r\n", settings.com_settings.mb_port);
+    
+    // stop bits
+    foo = settings.com_settings.mb_port & MB_STOP_BIT_MASK;
+    
+    if (foo == MB_STOP_BIT_1)
+        printf("\tStop bits: STOP_1\r\n");
+    else if (foo == MB_STOP_BIT_2)
+        printf("\tStop bits: STOP_2\r\n");
+    
+    // parity
+    foo = settings.com_settings.mb_port & MB_PARITY_MASK;
+    if (foo == MB_NO_PAR)
+        printf("\tParity: NO_PAR\r\n");
+    else if (foo == MB_EVEN_PAR)
+        printf("\tParity: EVEN_PAR\r\n");
+    else if (foo == MB_ODD_PAR)
+        printf("\tParity: ODD_PAR\r\n");
+    
+    // baudrate
+    foo = settings.com_settings.mb_port & MB_BRD_MASK;
+    switch (foo) {
+        case MB_BRD_2400 :
+            printf("\tBaudrate: 2400\r\n"); break;
+        case MB_BRD_4800 :
+            printf("\tBaudrate: 4800\r\n"); break;
+        case MB_BRD_9600 :
+            printf("\tBaudrate: 9600\r\n"); break;
+        case MB_BRD_19200 :
+            printf("\tBaudrate: 19200\r\n"); break;
+        case MB_BRD_38400 :
+            printf("\tBaudrate: 38400\r\n"); break;
+        case MB_BRD_57600 :
+            printf("\tBaudrate: 57600\r\n"); break;
+        case MB_BRD_115200 :
+            printf("\tBaudrate: 115200\r\n"); break;
+        default : break;
+    }
+
+    printf("Модель: %s\r\n", settings.com_settings.model);
+    
+  
+}

+ 190 - 152
fw/modules/settings/settings_api.h

@@ -1,152 +1,190 @@
-#ifndef SETTINGS_API_H
-#define SETTINGS_API_H
-
-#include "at32f403a_407.h"
-#include "model_cfg.h"
-#include "usart.h"
-#include "sys_api.h"
-#include "io.h"
-#include <stdbool.h>
-
-
-// Изменить версию если поменялась структура настроек
-#define SETTINGS_VERSION    0x01
-
-
-
-// ------------------------------------------------------------------- //
-//					 		Draft
-// ------------------------------------------------------------------- //
-
-/*
-1. Uptime (uint32_t)                    // +
-2. Realtime (unix timestamp, uint32_t)  // +
-3. Версия прошивки                      // +
-4. Модель (char 16 байт)                // +
-
-*/
-
-
-
-// ------------------------------------------------------------------- //
-//					 		Modbus
-// ------------------------------------------------------------------- //
-
-// Modbus 
-typedef struct
-{
-	rate_t     baud;		// Скорость порта 
-	parity_t   parity;		// Четность 
-	databits_t databits;	// Число бит данных
-	stopbits_t stopbits;	// Число стоп-бит  
-
-} modbus_t;
-
-
-// Общая структура настроек для IAP и FW
-typedef struct
-{
-    uint16_t    mb_port;    // Настройки порта для modbus
-    char model[MODEL_LEN];  // Модель
-} com_settings_t;
-
-
-#if 0
-// Дискретные входы
-typedef struct
-{
-    uint16_t debounce_time; // период антидребезга в мс (0 - 10 сек)
-} dinput_t;
-#endif
-
-
-// Полная структура настроек
-typedef struct
-{
-    com_settings_t  com_settings;
-    uint32_t    critical_section_crc;
-/* WARNING! До поля CritSecCRC включительно структура настроек должна быть
-* идентичной между бутлоадером и основным ПО и не должна изменяться при обновлении ПО.
-* Контроль целостности настроек внутри IAP выполняется только для критической секции,
-* т.к. контроль целостности всей структуры не имеет смысла
-* (структура настроек всегда будет отличаться внутри основного ПО).
-* В случае повреждения критического сектора, загружаются параметры по умолчанию. */    
-    uint16_t    settings_version;   // Версия структуры настроек 
-    uint32_t    control_word;       // Слово для контроля целостности структуры настроек
-    
-    uint16_t    di_mode_bits;          // режим работы, 0 - вход, 1 - счетчик импульсов
-    uint16_t    di_norm_state_bits;    // нормальное состояние (0 - разомкнут, 1 - замкнут)        
-    uint16_t    di_debounce[DI_NUMBER]; // Дискретные входы
-    
-    uint16_t    do_mode_bits;       // режим работы выхода 0 - выход, 1 - ШИМ
-    uint16_t    do_bits;            // последнее сохраненное значение на выходах
-    uint16_t    do_save_bits;       // значение на выходах в бесопасном режиме работы
-    uint16_t    do_pwm[DO_NUMBER];  // значение заполнения ШИМ
-    uint16_t    do_pwm_save[DO_NUMBER]; // значение заполнения ШИМ в безопасном режиме
-    uint16_t    do_pwm_period[DO_NUMBER];  // период ШИМ в [0.1с (10..1000)]
-    uint16_t    do_pwm_period_save[DO_NUMBER]; // период ШИМ в безопасном режиме [0.1с (10..1000)]
-    
-    bool        save_mode;          // безопасный режим, 0 - выкл, 1 - вкл
-    uint16_t    save_delay;         // время ожидания опроса (сек.)
-    
-    
-} settings_t;
-
-
-
-// Загрузка структуры настроек из flesh
-void settings_load(settings_t *settings);
-
-//
-void init_settings(void);
-
-//
-void settings_read_from_flash(uint8_t *data, uint32_t size);
-
-//
-uint32_t settings_get_crc(settings_t *settings);
-
-//
-uint32_t settings_get_crit_sec_crc(settings_t *settings);
-
-// Сброс всех настроек в значения по умолчанию
-void settings_set_all_default(void);
-
-
-// -------------------------------------------------------------------------- //
-// Настройки по умолчанию
-
-//
-void settings_set_modbus_def(uint16_t *mb_port);
-
-//
-void settings_conv_modbus_def(modbus_t *mb_settings, uint16_t *mb_port);
-
-// Установить параметры дискретных входов по умолчанию
-void settings_din_def(settings_t *settings);
-
-// Выходы
-void settings_do_def(settings_t *settings);
-
-// -------------------------------------------------------------------------- //
-
-// Запись структуры настроек во flash
-void settings_save(settings_t *settings);
-
-//
-void settings_write_to_flash(uint8_t *data, uint32_t size);
-
-// Очистка сектора настроек
-void settings_erase_flash_sector(void);
-
-
-
-// Системные настройки
-extern sys_settings_t sys_settings;
-
-// Общая структура настроек
-extern settings_t settings;
-
-
-#endif /* #ifndef SETTINGS_API_H */
-
+#ifndef SETTINGS_API_H
+#define SETTINGS_API_H
+
+#include "at32f403a_407.h"
+#include "model_cfg.h"
+#include "usart.h"
+#include "sys_api.h"
+#include "io.h"
+#include "mb.h"
+#include "mbport.h"
+#include <stdbool.h>
+
+
+// Изменить версию если поменялась структура настроек
+#define SETTINGS_VERSION    0x01
+
+
+
+// ------------------------------------------------------------------- //
+//					 		Draft
+// ------------------------------------------------------------------- //
+
+/*
+1. Uptime (uint32_t)                    // +
+2. Realtime (unix timestamp, uint32_t)  // +
+3. Версия прошивки                      // +
+4. Модель (char 16 байт)                // +
+
+*/
+
+
+
+// ------------------------------------------------------------------- //
+//					 		Modbus
+// ------------------------------------------------------------------- //
+
+#define MB_STOP_BIT_MASK    0x03
+#define MB_STOP_BIT_1       0x00
+#define MB_STOP_BIT_2       0x02
+
+#define MB_PARITY_MASK      (0x03 << 3)
+#define MB_NO_PAR           (0x00 << 3)
+#define MB_EVEN_PAR         (0x02 << 3)
+#define MB_ODD_PAR          (0x03 << 3)
+
+#define MB_BRD_MASK         (0x07 << 5)
+#define MB_BRD_2400         (0x00 << 5)
+#define MB_BRD_4800         (0x01 << 5)
+#define MB_BRD_9600         (0x02 << 5)
+#define MB_BRD_19200        (0x03 << 5)
+#define MB_BRD_38400        (0x04 << 5)
+#define MB_BRD_57600        (0x05 << 5)
+#define MB_BRD_115200       (0x06 << 5)
+
+
+
+// Modbus 
+typedef struct
+{
+	rate_t     baud;		// Скорость порта 
+	parity_t   parity;		// Четность 
+	databits_t databits;	// Число бит данных
+	stopbits_t stopbits;	// Число стоп-бит  
+    
+} modbus_t;
+
+
+// Общая структура настроек для IAP и FW
+typedef struct
+{
+    uint16_t    mb_port;    // Настройки порта для modbus
+    char model[MODEL_LEN];  // Модель
+} com_settings_t;
+
+
+#if 0
+// Дискретные входы
+typedef struct
+{
+    uint16_t debounce_time; // период антидребезга в мс (0 - 10 сек)
+} dinput_t;
+#endif
+
+
+// Полная структура настроек
+typedef struct
+{
+    com_settings_t  com_settings;
+    uint32_t    critical_section_crc;
+/* WARNING! До поля CritSecCRC включительно структура настроек должна быть
+* идентичной между бутлоадером и основным ПО и не должна изменяться при обновлении ПО.
+* Контроль целостности настроек внутри IAP выполняется только для критической секции,
+* т.к. контроль целостности всей структуры не имеет смысла
+* (структура настроек всегда будет отличаться внутри основного ПО).
+* В случае повреждения критического сектора, загружаются параметры по умолчанию. */    
+    uint16_t    settings_version;   // Версия структуры настроек 
+    uint32_t    control_word;       // Слово для контроля целостности структуры настроек
+    
+    uint16_t    di_mode_bits;          // режим работы, 0 - вход, 1 - счетчик импульсов
+    uint16_t    di_norm_state_bits;    // нормальное состояние (0 - разомкнут, 1 - замкнут)        
+    uint16_t    di_debounce[DI_NUMBER]; // Дискретные входы
+    
+    uint16_t    do_mode_bits;       // режим работы выхода 0 - выход, 1 - ШИМ
+    uint16_t    do_bits;            // последнее сохраненное значение на выходах
+    uint16_t    do_save_bits;       // значение на выходах в бесопасном режиме работы
+    uint16_t    do_pwm[DO_NUMBER];  // значение заполнения ШИМ
+    uint16_t    do_pwm_save[DO_NUMBER]; // значение заполнения ШИМ в безопасном режиме
+    uint16_t    do_pwm_period[DO_NUMBER];  // период ШИМ в [0.1с (10..1000)]
+    uint16_t    do_pwm_period_save[DO_NUMBER]; // период ШИМ в безопасном режиме [0.1с (10..1000)]
+    
+    bool        save_mode;          // безопасный режим, 0 - выкл, 1 - вкл
+    uint16_t    save_delay;         // время ожидания опроса (сек.)
+    
+    uint16_t    period_archive;     // период архивирования
+    
+    
+} settings_t;
+
+
+
+// Загрузка структуры настроек из flesh
+void settings_load(settings_t *settings);
+
+//
+void init_settings(void);
+
+//
+void settings_read_from_flash(uint8_t *data, uint32_t size);
+
+//
+uint32_t settings_get_crc(settings_t *settings);
+
+//
+uint32_t settings_get_crit_sec_crc(settings_t *settings);
+
+// Сброс всех настроек в значения по умолчанию
+void settings_set_all_default(void);
+
+
+// -------------------------------------------------------------------------- //
+// Настройки по умолчанию
+
+//
+void settings_set_modbus_def(uint16_t *mb_port);
+
+//
+void settings_conv_modbus_def(modbus_t *mb_settings, uint16_t *mb_port);
+
+// Установка параметров Modbus
+void settings_set_modbus_params(uint16_t mb_port);
+
+//
+uint32_t settings_get_mb_baud(modbus_t *mb_settings);
+
+//
+eMBParity settings_get_mb_par(modbus_t *mb_settings);
+
+//
+void settings_init_mb_port(uint8_t mb_addr);
+
+// Установить параметры дискретных входов по умолчанию
+void settings_din_def(settings_t *settings);
+
+// Выходы
+void settings_do_def(settings_t *settings);
+
+// -------------------------------------------------------------------------- //
+
+// Запись структуры настроек во flash
+void settings_save(settings_t *settings);
+
+//
+void settings_write_to_flash(uint8_t *data, uint32_t size);
+
+// Очистка сектора настроек
+void settings_erase_flash_sector(void);
+
+//
+void settings_print(void);
+
+
+// Системные настройки
+extern sys_settings_t sys_settings;
+
+// Общая структура настроек
+extern settings_t settings;
+
+
+#endif /* #ifndef SETTINGS_API_H */
+

+ 20 - 8
fw/modules/terminal/terminal_sbs.cpp

@@ -9,9 +9,11 @@
 extern "C" {
 #include "log.h"
 #include "log_api.h"
-#include "rtc.h"  
+#include "rtc.h"
+#include "settings_api.h"
 }
 
+extern struct ringfs fs_log;
 extern struct ringfs fs_archive;
 
 SbsTerminal sbsTerminal;
@@ -38,7 +40,8 @@ void SbsTerminal::configure()
 //
 int SbsTerminal::execute(int argc, const char * const *argv)
 {
-    //char str[20];
+    log_entry_t log_entry;
+    archive_entry_t archive_entry;
   
     if (argc <= 0) {
         return -1;
@@ -97,9 +100,13 @@ int SbsTerminal::execute(int argc, const char * const *argv)
         return 0;
     }
     // 
-    if (strcmp(argv[0], "get") == 0) {
-        archive_entry_t entry;
-        log_get_archive_entry(atoi(argv[1]), &fs_archive, &entry);
+    if (strcmp(argv[0], "lget") == 0) {
+        log_get_log_entry(atoi(argv[1]), &fs_log, &log_entry);
+        return 0;
+    }
+    // 
+    if (strcmp(argv[0], "aget") == 0) {
+        log_get_archive_entry(atoi(argv[1]), &fs_archive, &archive_entry);
         return 0;
     }
     // ---------------------------------------------------------------------- //
@@ -107,7 +114,11 @@ int SbsTerminal::execute(int argc, const char * const *argv)
         printf("\r\n%" PRId64 " [ms]\r\n", rtc_get_ms());
         return 0;
     }
-    
+    // 
+    if (strcmp(argv[0], "settings") == 0) {
+        settings_print();
+        return 0;
+    }
     // ---------------------------------------------------------------------- //
     else {
         printeol();
@@ -147,8 +158,9 @@ int SbsTerminal::help(int argc, const char * const *argv)
     printl ("  ainfo          Print archive info");
     printl ("  afetch         Fetch archive entry");
     printl ("  aentry         Get archive entry [position] [sector] [slot]");
-    printll("  lformat        Format log partition");
-    printll("  aformat        Format archive partition");
+    printl ("  lformat        Format log partition");
+    printl ("  aformat        Format archive partition");
+    printl ("  settings       Print settings structure");
     
     printeol();
 

+ 3 - 0
fw/user/main.cpp

@@ -129,6 +129,9 @@ void init_task(void *argument)
     // Основные настройки
     settings_load(&settings);
     
+    // Настройки параметров порта Modbus
+    settings_set_modbus_params(settings.com_settings.mb_port);
+    
 #if 0    
     settings_set_all_default();
     settings_save(&settings);

+ 19 - 0
iap/modules/modbus/modbus.c

@@ -28,6 +28,8 @@ static void modbus_task(void *params);
 //osThreadId modbus_params_handle;
 static void modbus_params(void *params);
 
+TimerHandle_t settings_timer_handle;
+
 //osTimerId reset_timer_handle;
 //osTimerId settings_timer_handle;
 //osTimerId modbus_timer_handle;
@@ -66,6 +68,8 @@ void mb_init(void)
     
     xTaskCreate(modbus_params, "modbus_params", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
+    settings_timer_handle = xTimerCreate("reset_timer", 10000, 
+                                        pdFALSE, (void *)0, cb_settings_timer);
     
 #if 0    
 	osTimerDef(vResetTimer, modbus_reset);
@@ -108,6 +112,15 @@ void modbus_params(void *params)
                       
                 break;
                 
+                case MB_PAS_OK :
+                  
+                    //set_sys_settings_flag = true;
+                    //osTimerStart(settings_timer_handle, 30000);
+                  
+                    xTimerStart(settings_timer_handle, 0);
+                  
+                break;
+                
                 case MB_CHANGE_PORT_SETTINGS :
 #if 0                  
                     osDelay(200);
@@ -369,4 +382,10 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 }
 
 
+//
+void cb_settings_timer(TimerHandle_t timer)
+{
+    printf("Settings timer callback\r\n");
+    psw_ok = false;
+}
 

BIN
output/fw.bin


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 465 - 464
project/ewarm/iap/iap.dep


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 628 - 625
project/ewarm/module_universal_io.dep


+ 49 - 47
shared/sys/sys_api.h

@@ -1,47 +1,49 @@
-#ifndef SYS_API_H_
-#define SYS_API_H_
-
-#include <stdbool.h>
-#include <stdint.h>
-
-
-#define SN_LEN		        7
-#define PROD_LEN	        20
-#define TS_LEN              16  // Статус тестирования
-
-#define SN_DEFAULT          "0000001"
-
-
-// Cтруктура системных настроек
-typedef struct
-{
-    char sn[SN_LEN];            // Серийный номер
-    char prod_date[PROD_LEN];	// Дата производства
-    char test_state[TS_LEN];    // Статус тестирования
-    uint32_t control_word;      // Контрольное слово
-    uint32_t crc;               // CRC
-    
-} sys_settings_t;
-
-
-
-bool SYS_BackupInfo(char *mac, char *serial);
-
-bool SYS_RestoreInfo(sys_settings_t *settings);
-
-//
-uint32_t SYS_GetCRC(sys_settings_t *settings);
-
-// Загрузка структуры системных настроек из flash
-bool sys_settings_load(sys_settings_t *settings);
-
-// Запись структуры настроек во flash
-bool sys_save(sys_settings_t *settings);
-
-//
-void sys_print(sys_settings_t *settings);
-
-// Очистить сектор системных настроек
-void sys_clear(void);
-
-#endif /* SYS_API_H_ */
+#ifndef SYS_API_H_
+#define SYS_API_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+
+
+#define SN_LEN		        7
+#define PROD_LEN	        20
+#define TS_LEN              16  // Статус тестирования
+
+#define SN_DEFAULT          "0000001"
+
+#define MB_PASSWORD         (uint16_t)1234
+
+
+// Cтруктура системных настроек
+typedef struct
+{
+    char sn[SN_LEN];            // Серийный номер
+    char prod_date[PROD_LEN];	// Дата производства
+    char test_state[TS_LEN];    // Статус тестирования
+    uint32_t control_word;      // Контрольное слово
+    uint32_t crc;               // CRC
+    
+} sys_settings_t;
+
+
+
+bool SYS_BackupInfo(char *mac, char *serial);
+
+bool SYS_RestoreInfo(sys_settings_t *settings);
+
+//
+uint32_t SYS_GetCRC(sys_settings_t *settings);
+
+// Загрузка структуры системных настроек из flash
+bool sys_settings_load(sys_settings_t *settings);
+
+// Запись структуры настроек во flash
+bool sys_save(sys_settings_t *settings);
+
+//
+void sys_print(sys_settings_t *settings);
+
+// Очистить сектор системных настроек
+void sys_clear(void);
+
+#endif /* SYS_API_H_ */

+ 1 - 0
shared/utils/utility.c

@@ -7,6 +7,7 @@
 #include <stdio.h>
 
 
+
 #if 1
 // OS stack overflow hook
 #if (configCHECK_FOR_STACK_OVERFLOW > 0)

+ 7 - 0
shared/utils/utility.h

@@ -2,6 +2,13 @@
 #define __UTILITY_H_
 
 
+#define BIT_READ(value, bit) (((value) >> (bit)) & 0x01)
+#define BIT_SET(value, bit) ((value) |= (1UL << (bit)))
+#define BIT_CLEAR(value, bit) ((value) &= ~(1UL << (bit)))
+#define BIT_WRITE(value, bit, bitvalue) (bitvalue ? BIT_SET(value, bit) : BIT_CLEAR(value, bit))
+#define BIT(b) (1UL << (b))
+
+
 //
 void print_binary_byte(uint8_t val);
 

+ 6 - 10
tools/io_module.py

@@ -9,7 +9,8 @@ reg_table = {'in_bits': 0x0100, 'in_cnt': 0x0102, 'in_mode': 0x0120, 'in_norm':
              'out_cur': 0x0200, 'out_mode': 0x0202, 'out_mode_save': 0x0203, 'pwm_duty': 0x0210,
              'pwm_duty_save': 0x0220, 'pwm_per': 0x0230, 'pwm_per_save': 0x0240, 
              'rtc_unix': 0x0802, 'rtc_sinhro': 0x0804, 'uptime': 0x0800, 'log_info': 0x0900, 
-             'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903}
+             'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903,
+             'password': 0x008A}
 
 
 class IO_Module(Modbus):
@@ -214,14 +215,9 @@ class IO_Module(Modbus):
 
     def set_rtc(self, utc):
         self.write_uint32(reg_table['rtc_sinhro'], utc)
-    '''
-    def get_archive_entryes(self, ent_num, ent_index):
-        data = self.read_file_record(ARCHIVE_ENTRY, 1, 1)
-        #print(struct.unpack('<Q', data[5:13]))
-        entry = struct.unpack('<QBB', data[5:15])
-        print(entry)
-        return data
-    '''
+
+    def set_password(self, password):
+        self.write_holding_register(reg_table['password'], password)
 
 def main():
     colorama.init(autoreset=True)
@@ -241,7 +237,7 @@ def main():
     # unix_time = dev.get_rtc()
     # print(f'RTC: {time.ctime(unix_time)}. Unix time stamp:  {unix_time}')
     
-    dev.get_archive_entryes(1, 1)
+    dev.set_password(1234)
     
     return
 

+ 9 - 1
tools/log_reader.py

@@ -46,6 +46,11 @@ class DigitalLogReader(LogReader):
         entry = struct.unpack('<QBB', data[5:15])
         print(entry)
 
+    def get_random_log_entry(self):
+        data = self.read_file_record(LOG_ENTRY, randint(1, self.log_entries_number), 1)
+        entry = struct.unpack('<QBBBfB', data[5:21])
+        print(entry)
+
 
 class AnalogInputLogReader(LogReader):
     def __init__(self):
@@ -63,9 +68,12 @@ def main():
     module.get_log_info()
     module.get_archive()
 
-    for i in range(500):
+    # for i in range(500):
+    while (1):
         module.get_random_archive_entry()
         sleep(0.1)
+        module.get_random_log_entry()
+        sleep(0.1)
 
 
 

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio