Преглед изворни кода

Merge branch 'master' of https://192.168.14.200:3000/dtelenkov/bt-670x

Avetisyan Karen пре 7 година
родитељ
комит
312cc35558

+ 1 - 1
config/common_config.h

@@ -34,7 +34,7 @@
 /**
   * @brief  Адрес сектора настроек
   */ 	
-#define CRC_ADDRESS             0x08007F9C
+#define CRC_ADDRESS             0x08005F9C
 
 
 /**

+ 2 - 31
iap/Modules/settings_api.c

@@ -36,7 +36,7 @@ SETTINGS_t sSettings;
   */
 void SETTINGS_SetBootParamsDef(void)
 {
-  sSettings.bootParams.loadMode = 1;
+  sSettings.bootParams.loadMode = 0;
   sSettings.bootParams.bootTry = 0;
 }
 
@@ -62,22 +62,6 @@ void SETTINGS_SetTempWebParamsDef(void)
   sSettings.sWebTempParams.dhcpEnable = 1;
 }
 
-/**
-  * @brief  Установить параметры SNMP по умолчанию
-  */
-void SETTINGS_SetSnmpDef(void)
-{
-  strcpy(sSettings.sSnmp.sysDescr, "");
-  strcpy(sSettings.sSnmp.readCommunity, "public");
-  strcpy(sSettings.sSnmp.writeCommunity, "public");
-  strcpy(sSettings.sSnmp.sysContact, "");
-  strcpy(sSettings.sSnmp.sysName, "BT-6701");
-  strcpy(sSettings.sSnmp.sysLocation, "");
-  strcpy(sSettings.sSnmp.managerIP, "0.0.0.0");
-  strcpy(sSettings.sSnmp.managerIP2, "0.0.0.0");
-  strcpy(sSettings.sSnmp.managerIP3, "0.0.0.0");
-}
-
 /**
   * @brief  Установить Информацию об устройстве по умолчанию
   */
@@ -89,13 +73,6 @@ void SETTINGS_SetInfoDef(void)
   strcpy(sSettings.sInfo.comments, "");
 }
 
-/**
-  * @brief  Установить флаги по умолчанию
-  */
-void SETTINGS_SetFlagsDef(void)
-{
-  sSettings.sFlags.netsettingsChanged = false;
-}
 
 /**
   * @brief  Сброс настроек в значения по умолчанию
@@ -104,7 +81,6 @@ void SETTINGS_SetDefault(void)
 {
   SETTINGS_SetWebParamsDef();
   SETTINGS_SetTempWebParamsDef();
-  SETTINGS_SetSnmpDef();
 
   sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
 }
@@ -115,8 +91,7 @@ void SETTINGS_SetDefault(void)
 void SETTINGS_SetPartDefault(void)
 {
   SETTINGS_SetBootParamsDef();
-  SETTINGS_SetSnmpDef();
-  SETTINGS_SetFlagsDef();
+  SETTINGS_SetInfoDef();
 
   sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
 
@@ -131,9 +106,7 @@ void SETTINGS_SetAllDefault(void)
   SETTINGS_SetBootParamsDef();
   SETTINGS_SetWebParamsDef();
   SETTINGS_SetTempWebParamsDef();
-  SETTINGS_SetSnmpDef();
   SETTINGS_SetInfoDef();
-  SETTINGS_SetFlagsDef();
 
   sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
 
@@ -147,9 +120,7 @@ void SETTINGS_SetDefaultDebug(void)
 {
   SETTINGS_SetWebParamsDef();
   SETTINGS_SetTempWebParamsDef();
-  SETTINGS_SetSnmpDef();
   SETTINGS_SetBootParamsDef();
-  SETTINGS_SetFlagsDef();
   //SETTINGS_SetInfoDef();
 
   sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();

+ 3 - 15
iap/Modules/settings_api.h

@@ -32,9 +32,9 @@ typedef struct
   */
 typedef struct
 {
-  char    ip[15];
-  char    gate[15];
-  char    mask[15];
+  char    ip[16];
+  char    gate[16];
+  char    mask[16];
   uint8_t dhcpEnable;  // 0 - DHCP отключен, 1 - включен
 	
 } WEB_PARAMS_t;
@@ -85,9 +85,7 @@ typedef struct
   BOOT_PARAMS_t bootParams;
   WEB_PARAMS_t  sWebParams;
   WEB_PARAMS_t  sWebTempParams;
-  SNMP_t        sSnmp;
   DEVICE_INFO_t sInfo;
-  FLAGS_t       sFlags;
   uint32_t      CritSecCRC;
   //uint32_t      controlWorld;  // Слово для контроля целостности структуры настроек
 
@@ -114,21 +112,11 @@ void SETTINGS_SetWebParamsDef(void);
   */
 void SETTINGS_SetTempWebParamsDef(void);
 
-/**
-  * @brief  Установить параметры SNMP по умолчанию
-  */
-void SETTINGS_SetSnmpDef(void);
-
 /**
   * @brief  Установить Информацию об устройстве по умолчанию
   */
 void SETTINGS_SetInfoDef(void);
 
-/**
-  * @brief  Установить флаги по умолчанию
-  */
-void SETTINGS_SetFlagsDef(void);
-
 /**
   * @brief  Очистка сектора настроек
   */

+ 1 - 1
modules/Ethernet/netconf.c

@@ -62,7 +62,7 @@ void LwIP_Init(void)
   char str[20];
 
   tcpip_init( NULL, NULL );	
-  sSettings.sFlags.netsettingsChanged = false;
+
   /* Если настройки изменили, то используем временные параметры */
   if (sSettings.sFlags.netsettingsChanged == true)
   {

+ 133 - 70
modules/HTTP_Server/http_server.c

@@ -182,7 +182,17 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		   seclevel = 0xFF;
 	   }
 
-	   if ( Authenticated == false )
+	   if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
+	   {
+		  HTTP_LOGIN(sendBuf, &sendBufLoadLen);
+
+		  hs->file = sendBuf;
+		  hs->left = sendBufLoadLen;
+		  send_data(pcb, hs);
+		  tcp_sent(pcb, http_sent);
+	   }
+
+	   else if ( Authenticated == false )//&& sSettings.sRADIUS.Auth_enable == true
 	  {
 		  if (strncmp(data, "GET /main.css", 13) == 0) // +
 		  {
@@ -405,11 +415,20 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 	  else if (strncmp(data, "GET /settings.html", 18) == 0) // +
 	  {
 		HTTP_UpdateUserLoginTime(user_id);
-	    fs_open("/settings.html", &file);
-        hs->file = file.data;
-        hs->left = file.len;
-        send_data(pcb, hs);
-        tcp_sent(pcb, http_sent);
+		if (seclevel == 0){
+			fs_open("/settings.html", &file);
+			hs->file = file.data;
+			hs->left = file.len;
+			send_data(pcb, hs);
+			tcp_sent(pcb, http_sent);
+		}
+		else {
+			fs_open("/index.html", &file);
+			hs->file = file.data;
+			hs->left = file.len;
+			send_data(pcb, hs);
+			tcp_sent(pcb, http_sent);
+		}
 	  }
 	  else if (strncmp(data, "GET /info.html", 14) == 0) // +
 	  {
@@ -432,21 +451,23 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 	  {
 		SET_PAGE = SET_PAGE_PAGE2;
 		
-		if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
-		{
-		  hs->file = sendBuf;
-          hs->left = sendBufLoadLen;
-		  send_data(pcb, hs);
-		  tcp_sent(pcb, http_sent);
+		if (seclevel == 0) {
+			if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
+			{
+			  hs->file = sendBuf;
+			  hs->left = sendBufLoadLen;
+			  send_data(pcb, hs);
+			  tcp_sent(pcb, http_sent);
+			}
+			/*else
+			{
+			  fs_open("/settings.html", &file);
+			  hs->file = file.data;
+			  hs->left = file.len;
+			  send_data(pcb, hs);
+			  tcp_sent(pcb, http_sent);
+			}*/
 		}
-		/*else
-		{
-		  fs_open("/settings.html", &file);
-          hs->file = file.data;
-          hs->left = file.len;
-          send_data(pcb, hs);
-          tcp_sent(pcb, http_sent);
-		}*/
 	  }
 	  else if (strncmp(data, "POST /settings.cgi", 18) == 0)
 	  {
@@ -473,14 +494,30 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 			  send_data(pcb, hs);
 			  tcp_sent(pcb, http_sent);
 			}
-			else
+		/*	else
 			{
 			  fs_open("/info.html", &file);
 			  hs->file = file.data;
 			  hs->left = file.len;
 			  send_data(pcb, hs);
 			  tcp_sent(pcb, http_sent);
-			}
+			}*/
+	  }
+	  else if (strncmp(data, "POST /info.cgi", 14) == 0)
+	  {
+		  strncat(&receiveBuf,  " ", 1);
+		  HTTP_SetInfo(receiveBuf, receivedBufLen);
+		  memset(sendBuf, 0, SEND_BUF_MAX_LEN);
+
+		  strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
+		  strcat(sendBuf, "\r\n\r\n");
+		  strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/info.html\"/></head></html>\r\n\r\n");
+
+		  sendBufLoadLen = strlen(sendBuf);
+		  hs->file = sendBuf;
+		  hs->left = sendBufLoadLen;
+		  send_data(pcb, hs);
+		  tcp_sent(pcb, http_sent);
 	  }
 	  /* Тест  АКБ ИБП */
 	  else if (strncmp(data, "POST /bat_test.cgi", 18) == 0)
@@ -532,7 +569,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		tcp_sent(pcb, http_sent);
 	  }
 	  /* Проверка пароля, переход в bootloader */
-	  else if (strncmp(data, "POST /fw_update.cgi", 18) == 0)
+	  else if (strncmp(data, "GET /fw_update.cgi", 18) == 0)
 	  {
 		HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
 
@@ -782,7 +819,7 @@ int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *le
   /* В запросе есть параметры, нужно парсить и сохранять настройки */
   else
   {
-	HTTP_SetSettings(bufIn, lenBufIn);
+	//HTTP_SetSettings(bufIn, lenBufIn);
 	
     return SEND_REQUIRED_NO;
   }
@@ -811,7 +848,7 @@ int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBuf
   /* В запросе есть параметры, нужно парсить и сохранять настройки */
   else
   {
-	HTTP_SetInfo(bufIn, lenBufIn);
+	//HTTP_SetInfo(bufIn, lenBufIn);
 	return SEND_REQUIRED_NO;
 /*	
 	HTTP_SetSettings(bufIn, lenBufIn);
@@ -906,7 +943,7 @@ void HTTP_SetSettings(char *buf, uint16_t lenBuf)
   SetDhcpStateStr(value);
   
   if (strncmp(value, "on", 2) != 0)  // Если dhcp off устанавливаем параметры
-  {
+    {
     memset(value, 0, len);
 
     GetParamValue(buf, "ipaddr=", value, &valueLen);
@@ -921,29 +958,39 @@ void HTTP_SetSettings(char *buf, uint16_t lenBuf)
     SetMaskStr(value);
     memset(value, 0, len);
   }
-  memset(value, 0, len);  
+  memset(value, 0, len);
 
-  /* параметры RADIUS*/
-  GetParamValue(buf, "rs_enabled=", value, &valueLen);
-  SetRDSEnableStateStr(value);
+  GetParamValue(buf, "auth=", value, &valueLen);
+  SetAuthEnableStateStr(value);
 
-	memset(value, 0, len);
+  memset(value, 0, len);
 
-	GetParamValue(buf, "rs_server=", value, &valueLen);
-	SetRDSIpStr(value);
-	memset(value, 0, len);
+  if (strncmp(value, "on", 2) == 0){
+		/* параметры RADIUS*/
+		GetParamValue(buf, "rs_enabled=", value, &valueLen);
+		SetRDSEnableStateStr(value);
 
-	GetParamValue(buf, "rs_port=", value, &valueLen);
-	SetRDSPortStr(value);
-	memset(value, 0, len);
+		memset(value, 0, len);
 
-	GetParamValue(buf, "rs_pwd=", value, &valueLen);
-	SetRDSPasswordkStr(value);
-	memset(value, 0, len);
+		if (strncmp(value, "on", 2) == 0)  // Если raddius off устанавливаем параметры
+		{
+			GetParamValue(buf, "rs_server=", value, &valueLen);
+			SetRDSIpStr(value);
+			memset(value, 0, len);
 
-	GetParamValue(buf, "rs_key=", value, &valueLen);
-	SetRDSKeyAccesstStr(value);
-	memset(value, 0, len);
+			GetParamValue(buf, "rs_port=", value, &valueLen);
+			SetRDSPortStr(value);
+			memset(value, 0, len);
+
+			GetParamValue(buf, "rs_pwd=", value, &valueLen);
+			SetRDSPasswordkStr(value);
+			memset(value, 0, len);
+
+			GetParamValue(buf, "rs_key=", value, &valueLen);
+			SetRDSKeyAccesstStr(value);
+			memset(value, 0, len);
+		}
+  }
 
   // Параметры реле и сухих контактов
   GetParamValue(buf, "di1=", value, &valueLen);
@@ -1008,27 +1055,28 @@ void HTTP_SetInfo(char *buf, uint16_t lenBuf)
   uint8_t valueLen = 0;
   const uint8_t len = 110;
   char value[110];
+  char str[110];
 
-  ClearParamString(buf);
+ // ClearParamString(buf);
   
   memset(value, 0, len);
   
   /* Владелец */
   GetParamValue(buf, "owner=", value, &valueLen);
-  HTTP_ReplaceSimbol(value, '+', ' ');
-  SetOwner(value);
+  url_decode(str, sizeof(str), value);
+  SetOwner(str);
   memset(value, 0, len);
   
   /* Владелец */
   GetParamValue(buf, "sysLocation=", value, &valueLen);
-  HTTP_ReplaceSimbol(value, '+', ' ');
-  SetLocation(value);
+  url_decode(str, sizeof(str), value);
+  SetLocation(str);
   memset(value, 0, len);
   
   /* Комментарий */
   GetParamValue(buf, "comment=", value, &valueLen);
-  HTTP_ReplaceSimbol(value, '+', ' ');
-  SetComment(value);
+  url_decode(str, sizeof(str), value);
+  SetComment(str);
   memset(value, 0, len);
  
   HTTP_SaveSettings();
@@ -1259,6 +1307,39 @@ int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *l
     return SEND_REQUIRED_NO;
 }
 
+void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut)
+{
+	char tempStr[50];
+	uint8_t valueLen;
+	char WebLogin[MAX_WEB_LOGIN_LEN];
+
+	GetUserLogin(ADMIN, WebLogin, &valueLen);
+
+	memset(tempStr, 0, 50);
+
+	/* TODO replace global flag with user-pass-cookie */
+	Authenticated = true;
+
+	/* Generate cookie */
+	sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
+
+	/* Set users cookie */
+	HTTP_SetUserCookie(tempStr, ADMIN);
+
+	HTTP_UpdateUserLoginTime(ADMIN);
+
+	/* Send login and cookie back */
+	strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
+	strcat(bufOut, WebLogin);
+	strcat(bufOut, "\r\nSet-Cookie: id=");
+	strcat(bufOut, tempStr);
+	strcat(bufOut, "\r\nSet-Cookie: role=0");
+	strcat(bufOut, "\r\n\r\n");
+	strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
+
+	*lenBufOut = strlen(bufOut);
+}
+
 /**
   * @brief  
   * @retval None
@@ -1372,24 +1453,6 @@ void ClearParamString(char *inBuf)
   }
 }
 
-/**
-  * @brief  Замена символа в строке
-  * @param  *str - входная строка
-  * @param  sim1 - символ который надо заменить
-  * @param  sim2 - символ на который надо заменить
-  */
-void HTTP_ReplaceSimbol(char *str, char sim1, char sim2)
-{
-  uint16_t len = strlen(str);
-  
-  for (uint16_t i = 0; i < len; i++)
-  {
-    if (*str == sim1)
-	  *str = sim2;
-	str++;
-  }
-}
-
 /**
   * @brief Чтение Cookie пользователя
   */
@@ -1479,8 +1542,8 @@ static void HTTP_ForceUserLogout(uint8_t user_id)
   */
 void LogoutTimerCallback(TimerHandle_t pxTimer) {
     uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );
-
-    HTTP_ForceUserLogout(user_id);
+	if( sSettings.sRADIUS.Auth_enable )
+		HTTP_ForceUserLogout(user_id);
 }
 
 /**

+ 2 - 0
modules/HTTP_Server/http_server.h

@@ -88,6 +88,8 @@ void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t
   */
 int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);
 
+void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut);
+
 /**
   * @brief  
   */

+ 4 - 0
modules/HTTP_Server/web_params_api.c

@@ -198,6 +198,10 @@ void HTTP_GetSettings(char *buf)
   strcat(buf, "\",\"dhcp\":");
   strncat(buf, str, len);
 
+  GetAuthEnableStateStr(str, &len);
+  strcat(buf, ",\"auth\":");
+  strncat(buf, str, len);
+
   /* RADIUS */
   GetRDSIpStr(str, &len);
   strcat(buf, ",\"rs_server\":\"");

+ 5 - 0
modules/MegaTec/megatec.c

@@ -170,6 +170,7 @@ void ups_status_response(char *data)
 	len = endValue - data;
 	strncpy(value, data, len);
 	data += (len + 1);
+	UPS.SOC = 100*(atof(value));
 
 	memset(value, 0, 10);
 	endValue = strpbrk(data," ");
@@ -212,6 +213,10 @@ void ups_info_response(char *data)
 		strncpy(UPS.model, data, len);
 		data += (len + 1);
 	}
+	else
+	{
+		strcpy(UPS.model, "RTMP II");
+	}
 
 	endValue = strpbrk(data,"\r");
 	len = endValue - data;

+ 2 - 2
modules/monitor/ups_monitor.c

@@ -86,7 +86,7 @@ void UPS_DI0Monitor(void)
 	  return;
 	}
 
-	if (DI0StateCurrent)
+	if (!DI0StateCurrent)
 	  flCriticalAlarm = true;
 
 	// Значение параметра изменилось
@@ -94,7 +94,7 @@ void UPS_DI0Monitor(void)
 	{
 	  if(sSettings.sInOuts.din_type_act[0] == SNMP_TRAP)
 	  {
-		  if (DI0StateCurrent)
+		  if (!DI0StateCurrent)
 			SNMP_SendUserTrap(DI0_NORM);
 		  else
 			SNMP_SendUserTrap(DI0_ALARM);

+ 25 - 1
modules/parameters.c

@@ -139,7 +139,7 @@ void GetPowerStr(char *str, uint8_t *len)
   */
 void GetBatCapacityStr(char *str, uint8_t *len)
 {
-  sprintf(str, "%0.1f", UPS.SOC);
+  sprintf(str, "%d", UPS.SOC);
   *len = strlen(str);
 }
 
@@ -695,6 +695,19 @@ void GetRDSEnableStateStr(char *str, uint8_t *len)
   *len = 1;
 }
 
+/**
+  * @brief  Настройка вкл/ выкл авторизации
+  */
+void GetAuthEnableStateStr(char *str, uint8_t *len)
+{
+    if (sSettings.sRADIUS.Auth_enable)
+      *str = '1';
+    else
+      *str = '0';
+
+  *len = 1;
+}
+
 // ************************************************************************** //
 //                          Флаги
 
@@ -914,6 +927,17 @@ void SetRDSEnableStateStr(char *str)
 	  sSettings.sRADIUS.RDSEnable = 0;
 }
 
+/**
+  * @brief  Настройка вкл/ выкл авторизации
+  */
+void SetAuthEnableStateStr(char *str)
+{
+  if (strncmp(str, "on", 2) == 0)
+	  sSettings.sRADIUS.Auth_enable = 1;
+  else
+	  sSettings.sRADIUS.Auth_enable = 0;
+}
+
 // ************************************************************************** //
 //                             Параметры даты и времени
 

+ 10 - 0
modules/parameters.h

@@ -241,6 +241,11 @@ void GetRDSPasswordkStr(char *str, uint8_t *len);
   */
 void GetRDSEnableStateStr(char *str, uint8_t *len);
 
+/**
+  * @brief  Настройка вкл/ выкл авторизации
+  */
+void GetAuthEnableStateStr(char *str, uint8_t *len);
+
 // ************************************************************************** //
 //                             Параметры реле/сухих контактов
 
@@ -399,6 +404,11 @@ void SetRDSPasswordkStr(char *str);
   */
 void SetRDSEnableStateStr(char *str);
 
+/**
+  * @brief  Настройка вкл/ выкл авторизации
+  */
+void SetAuthEnableStateStr(char *str);
+
 // ************************************************************************** //
 //                             Параметры даты и времени
 

+ 42 - 40
modules/settings_api.c

@@ -45,7 +45,7 @@ SETTINGS_t sSettings;
   */
 void SETTINGS_SetBootParamsDef(void)
 {
-  sSettings.bootParams.loadMode = 1;
+  sSettings.bootParams.loadMode = 0;
   sSettings.bootParams.bootTry = 0;
 }
 
@@ -94,11 +94,10 @@ void SETTINGS_SetSnmpDef(void)
   */
 void SETTINGS_SetInfoDef(void)
 {
-  strcpy(sSettings.sInfo.productionData, "08.07.2016"); 
-  //strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-90-01"); 
-  strcpy(sSettings.sInfo.mac, "EC-4C-4D-00-00-0A");
-  strcpy(sSettings.sInfo.serialNumber, "KN-03-00001"); 
-  strcpy(sSettings.sInfo.comments, ""); 
+  strcpy(sSettings.sInfo.productionData, "09.10.2015");
+  strcpy(sSettings.sInfo.mac, DEVICE_MAC);
+  strcpy(sSettings.sInfo.serialNumber, "KN-03-00003");
+  strcpy(sSettings.sInfo.comments, "");
 }  
 
 /**
@@ -116,7 +115,6 @@ void SETTINGS_SetServiceDef(void)
 {
     uint8_t user_id;
 
-
     for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
         switch (user_id) {
         /* First users in the system is always ADMIN.
@@ -163,6 +161,7 @@ void SETTINGS_SetINOUTSDef(void)
   */
 void SETTINGS_SetRADIUSDef(void)
 {
+  sSettings.sRADIUS.Auth_enable = true;
   sSettings.sRADIUS.RDSEnable = true;
   strcpy(sSettings.sRADIUS.ServerIP, "127.0.0.1");
   sSettings.sRADIUS.port = 1227;
@@ -201,7 +200,7 @@ void SETTINGS_SetPartDefault(void)
   
   sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
 
-//  sSettings.controlWorld = SETTINGS_CONTROL_WORD;
+  sSettings.controlWorld = SETTINGS_CONTROL_WORD;
 }
 
 /**
@@ -222,7 +221,7 @@ void SETTINGS_SetAllDefault(void)
   
   sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
 
- // sSettings.controlWorld = SETTINGS_CONTROL_WORD;
+  sSettings.controlWorld = SETTINGS_CONTROL_WORD;
 }
 
 /**
@@ -243,7 +242,7 @@ void SETTINGS_SetDefaultDebug(void)
   
   sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
 
- // sSettings.controlWorld = SETTINGS_CONTROL_WORD;
+  sSettings.controlWorld = SETTINGS_CONTROL_WORD;
 }
   
 /**
@@ -262,14 +261,17 @@ void SETTINGS_Save(void)
   */
 void SETTINGS_Load(void)
 {
+  uint32_t loadCRC;  // CRC из flash
+  uint32_t newCRC;   // CRC загруженной структуры настроек
+
   SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
+  /* Считываем CRC из флеш памяти */
+  loadCRC = (*(uint32_t*)CRC_ADDRESS);
 
-  /* Проверка CRC критической секции сектора настроек.
-   * Если CRC не совпадает, скорее всего настройки отсутствуют,
-   * прошиваем значения по умолчанию */
-  uint32_t crc = SETTINGS_GetCritSecCRC();
+  /* Рассчитываем CRC для структуры настроек */
+  newCRC = SETTINGS_GetCRC();
 
-   if (sSettings.CritSecCRC != crc) {
+  if (loadCRC != newCRC) {
 	   SETTINGS_SetAllDefault();
 	   SETTINGS_Save();
    }
@@ -288,34 +290,34 @@ void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
 
   for (uint8_t i = 0; i < 3; i++)
   {	
-	fAlarm = 0;
-	FLASH_Unlock();
+		fAlarm = 0;
+		FLASH_Unlock();
 
-	SETTINGS_EraseFlashSector();
+		SETTINGS_EraseFlashSector();
 
-	for (uint32_t i = 0; i < size; i++)
-	if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
-		 DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
-		 break;
-	 }
+		for (uint32_t i = 0; i < size; i++)
+		if ((status = FLASH_ProgramByte(baseAddress++, *data++)) != FLASH_COMPLETE) {
+			 DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
+			 break;
+		 }
 
-	if ((status = FLASH_ProgramWord((uint32_t)CRC_ADDRESS, crc)) != FLASH_COMPLETE) {
-		 DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
-	 }
-  
-	FLASH_Lock();
+		if ((status = FLASH_ProgramWord((uint32_t)CRC_ADDRESS, crc)) != FLASH_COMPLETE) {
+			 DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
+		 }
 
-	/* Считываем что записали */
-	SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
-	
-	checkCrc = SETTINGS_GetCRC();
+		FLASH_Lock();
 
-	/* Проверяем  CRC того что было записано */
-	if (checkCrc == crc)
-	  break;
-	else 
-	  fAlarm = 1; // Авария
-}
+		/* Считываем что записали */
+		SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
+
+		checkCrc = SETTINGS_GetCRC();
+	
+		/* Проверяем  CRC того что было записано */
+		if (checkCrc == crc)
+		  break;
+		else
+		  fAlarm = 1; // Авария
+  }
 
   /* Произошел сбой при записи - висим */
   if (fAlarm)
@@ -354,7 +356,7 @@ void SETTINGS_EraseFlashSector(void)
 uint32_t SETTINGS_GetCRC(void)
 {
   CRC_ResetDR();
-  return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4);
+  return CRC_CalcBlockCRC((uint32_t*)&sSettings, sizeof(sSettings)/4 - 1);
 }
 
 /**
@@ -369,7 +371,7 @@ uint32_t SETTINGS_GetCritSecCRC(void)
 }
 
 /**
-  * @brief  Сброс флага boottry и сохранение структуры настроек
+  * @brief   Сброс флага boottry в регистре RTC
   */
 void SETTINGS_ResetBootTry(void)
 {

+ 10 - 3
modules/settings_api.h

@@ -161,6 +161,7 @@ typedef struct
   */
 typedef struct
 {
+  bool Auth_enable;
   char    ServerIP[16];
   char    rds_password[17];
   bool RDSEnable;  // 0 - DHCP отключен, 1 - включен
@@ -177,15 +178,21 @@ typedef struct
   BOOT_PARAMS_t bootParams;
   WEB_PARAMS_t  sWebParams;
   WEB_PARAMS_t  sWebTempParams;
-  SNMP_t        sSnmp;
   DEVICE_INFO_t sInfo;
-  FLAGS_t       sFlags;
   uint32_t      CritSecCRC;
+/* WARNING! До поля CritSecCRC включительно структура настроек должна быть
+* идентичной между бутлоадером и основным ПО и не должна изменяться при обновлении ПО.
+* Контроль целостности настроек внутри IAP выполняется только для критической секции,
+* т.к. контроль целостности всей структуры не имеет смысла
+* (структура настроек всегда будет отличаться внутри основного ПО).
+* В случае повреждения критического сектора, загружаются параметры по умолчанию. */
+  FLAGS_t       sFlags;
+  SNMP_t        sSnmp;
   AUTH_t		sAuth[MAX_WEB_USERS];
   SNTP_t        sSNTP;
   INOUTS_t		sInOuts;
   RADIUS_t		sRADIUS;
-  //uint32_t      controlWorld;  // Слово для контроля целостности структуры настроек
+  uint32_t      controlWorld;  // Слово для контроля целостности структуры настроек
   
 } SETTINGS_t;
 

+ 1 - 1
user/init_task.c

@@ -180,7 +180,7 @@ void InitTask(void *params)
      некоторой задержки для запуска всех задач */
   vTaskDelay(4000);
  
- // SETTINGS_ResetBootTry();
+  SETTINGS_ResetBootTry();
   
   // Отправка трапа о перезагрузке в случае статического IP
  /* if (!dhcp)