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

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

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

+ 1 - 1
config/board_bt6702.h

@@ -16,7 +16,7 @@ RS232_UART_TABLE(X) \
 SPI2_TABLE(X)
 
 #define DI_TABLE(X)                  \
-X( DIN1,       GPIOA,   0, GPIO_IN)
+X( DIN1,       GPIOA,   0, GPIO_IN_PU)
 
 #define RELAYS(X) \
 X( DOUT1,      GPIOE,  4, GPIO_OUT)\

+ 244 - 47
modules/HTTP_Server/http_server.c

@@ -86,7 +86,13 @@ bool Authenticated = false;
 /* Level of currently logged-in user */
 uint8_t seclevel = 0xFF;
 
-static uint32_t ContentLengthOffset =0;
+static volatile uint32_t DataFlag2=0;
+static volatile uint32_t DataFlag=0;
+static volatile uint32_t size =0;
+static uint32_t TotalReceived=0;
+static volatile uint32_t TotalData=0;
+
+static uint32_t ContentLengthOffset =0, BrowserFlag=0;
 
 static const char Content_Length[17] =
 /* Content Length */
@@ -130,14 +136,16 @@ static void close_conn(struct tcp_pcb *pcb, struct http_state *hs)
   */
 static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t err)
 {
-  char *data;
+  char *data, *ptr;
   struct http_state *hs;
   char CookieBuf[50];
   char *CookiePtr = NULL;
   char name[MAX_WEB_COOKIE_LEN];
   char id[MAX_WEB_COOKIE_LEN];
   uint8_t nameLen = 0, idLen = 0;
+  uint32_t DataOffset;
   struct fs_file file = {0, 0};
+  uint32_t i;
   
   hs = arg;
 
@@ -180,6 +188,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 	   /* Id of currently logged-in user */
 	   uint8_t user_id;
 
+	   if( DataFlag == 0 && DataFlag2 == 0 ){
 	   /* Level of currently logged-in user */
 	   seclevel = 0xFF;
 	   for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
@@ -192,6 +201,11 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		   Authenticated = false;
 		   seclevel = 0xFF;
 	   }
+	   }
+	   if (DataFlag >= 1)
+		 Authenticated = true;
+	   else if(DataFlag2 >= 1)
+	      Authenticated = true;
 
 	   if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
 	   {
@@ -478,9 +492,8 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 	  }	  
 	  else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
 	  {
-		SET_PAGE = SET_PAGE_PAGE2;
-		
 		if (seclevel == 0) {
+			SET_PAGE = SET_PAGE_PAGE2;
 			if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
 			{
 			  hs->file = sendBuf;
@@ -498,22 +511,118 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 			}*/
 		}
 	  }
-	  else if (strncmp(data, "POST /settings.cgi", 18) == 0)
+	  else if (strncmp(data, "POST /settings.cgi", 18) == 0  || (DataFlag2 >= 1))
 	  {
-		  //strncat(&receiveBuf,  " ", 1);
-          strncat(receiveBuf,  " ", 1);
-		  HTTP_SetSettings(receiveBuf, receivedBufLen);
-		  memset(sendBuf, 0, SEND_BUF_MAX_LEN);
+		  if (seclevel == 0) {
+			DataOffset = 0;
 
-		  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=/settings.html\"/></head></html>\r\n\r\n");
+			/* POST Packet received */
+			if (DataFlag2 == 0)
+			{
+			  BrowserFlag = 0;
+			  TotalReceived = 0;
+			  memset(sendBuf, 0, strlen(sendBuf));
 
-		  sendBufLoadLen = strlen(sendBuf);
-		  hs->file = sendBuf;
-		  hs->left = sendBufLoadLen;
-		  send_data(pcb, hs);
-		  tcp_sent(pcb, http_sent);
+			  /* parse packet for Content-length field */
+			  size = Parse_Content_Length(data, p->tot_len);
+
+			  /* parse packet for the octet-stream field */
+			  for (i = 0; i < receivedBufLen; i++)
+			  {
+				  if (strncmp ((char*)(data+i), "managerIP", 8)==0)
+				 {
+				   DataOffset = i;
+				   break;
+				 }
+			  }
+			  /* case of MSIE8 : we do not receive data in the POST packet*/
+			  if (DataOffset == 0)
+			  {
+				 DataFlag2++;
+				 BrowserFlag = 1;
+				 pbuf_free(p);
+				 return ERR_OK;
+			  }
+			  /* case of Mozilla Firefox v3.6 : we receive data in the POST packet*/
+			  else
+			  {
+				//TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
+				TotalReceived = receivedBufLen - DataOffset;
+			  }
+			}
+			if (((DataFlag2 ==1)&&(BrowserFlag==1)) || ((DataFlag2 ==0)&&(BrowserFlag==0)))
+			{
+			   if ((DataFlag2 ==0)&&(BrowserFlag==0))
+			   {
+				 DataFlag2++;
+			   }
+			   else if ((DataFlag2 ==1)&&(BrowserFlag==1))
+			   {
+				 /* parse packet for the octet-stream field */
+				 for (i = 0; i < receivedBufLen; i++)
+				 {
+					 if (strncmp ((char*)(data+i), "managerIP", 8)==0)
+					 {
+					   DataOffset = i;
+					   break;
+					 }
+				 }
+				 TotalReceived += receivedBufLen;
+				 DataFlag2++;
+			   }
+			   TotalData =0 ;
+			 }
+			 /* DataFlag >1 => the packet is data only  */
+			 else
+			 {
+			   TotalReceived +=receivedBufLen;
+			 }
+
+			 ptr = (char*)(data + DataOffset);
+			 receivedBufLen-= DataOffset;
+
+			 /* update Total data received counter */
+			 TotalData +=receivedBufLen;
+
+			 /* check if last data packet */
+			 if (TotalReceived == size)
+			 {
+				 //DBG printf("State: Received %d bytes\r\n", (int)TotalReceived);
+
+				 strncat(&sendBuf,  ptr, receivedBufLen);
+				 strncat(&sendBuf,  " ", 1);
+				 //ВBG printf("receive %s /r/n", sendBuf);
+				 HTTP_SetSettings(sendBuf, strlen(&sendBuf));
+
+				 DataFlag2=0;
+				 BrowserFlag = 0;
+				 memset(sendBuf, 0, size);
+
+				 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=/settings.html\"/></head></html>\r\n\r\n");
+
+			  sendBufLoadLen = strlen(sendBuf);
+			  hs->file = sendBuf;
+			  hs->left = sendBufLoadLen;
+				send_data(pcb, hs);
+
+			   /* Tell TCP that we wish be to informed of data that has been
+				  successfully sent by a call to the http_sent() function. */
+			   tcp_sent(pcb, http_sent);
+			}
+			 /* not last data packet */
+			 else
+			 {
+			   /* write data in flash */
+			   if(receivedBufLen)
+			   {
+
+				 strncat(&sendBuf,  ptr, receivedBufLen);
+				 //memcpy(receiveBufTemp, ptr, receivedBufLen);
+			   }
+			 }
+		  }
 	  }
 	  else if (strncmp(data, "GET /info.cgi", 13) == 0) // +
 	  {
@@ -533,22 +642,116 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 			  tcp_sent(pcb, http_sent);
 			}*/
 	  }
-	  else if (strncmp(data, "POST /info.cgi", 14) == 0)
+	  else if (strncmp(data, "POST /info.cgi", 14) == 0 || (DataFlag >= 1))
 	  {
-		  //strncat(&receiveBuf,  " ", 1);
-          strncat(receiveBuf,  " ", 1);
-		  HTTP_SetInfo(receiveBuf, receivedBufLen);
-		  memset(sendBuf, 0, SEND_BUF_MAX_LEN);
+		  if (seclevel == 0) {
+			DataOffset = 0;
 
-		  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");
+			/* POST Packet received */
+			if (DataFlag == 0)
+			{
+			  BrowserFlag = 0;
+			  TotalReceived = 0;
+			  memset(sendBuf, 0, strlen(sendBuf));
+
+			  /* parse packet for Content-length field */
+			  size = Parse_Content_Length(data, p->tot_len);
+
+			  /* parse packet for the octet-stream field */
+			  for (i = 0; i < receivedBufLen; i++)
+			  {
+				  if (strncmp ((char*)(data+i), "owner", 5)==0)
+				 {
+				   DataOffset = i;
+				   break;
+				 }
+			  }
+			  /* case of MSIE8 : we do not receive data in the POST packet*/
+			  if (DataOffset == 0)
+			  {
+				 DataFlag++;
+				 BrowserFlag = 1;
+				 pbuf_free(p);
+				 return ERR_OK;
+			  }
+			  /* case of Mozilla Firefox v3.6 : we receive data in the POST packet*/
+			  else
+			  {
+				//TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
+				TotalReceived = receivedBufLen - DataOffset;
+			  }
+			}
+			if (((DataFlag ==1)&&(BrowserFlag==1)) || ((DataFlag ==0)&&(BrowserFlag==0)))
+			{
+			   if ((DataFlag ==0)&&(BrowserFlag==0))
+			   {
+				 DataFlag++;
+			   }
+			   else if ((DataFlag ==1)&&(BrowserFlag==1))
+			   {
+				 /* parse packet for the octet-stream field */
+				 for (i = 0; i < receivedBufLen; i++)
+				 {
+					 if (strncmp ((char*)(data+i), "owner", 5)==0)
+					 {
+					   DataOffset = i;
+					   break;
+					 }
+				 }
+				 TotalReceived += receivedBufLen;
+				 DataFlag++;
+			   }
+			   TotalData =0 ;
+			 }
+			 /* DataFlag >1 => the packet is data only  */
+			 else
+			 {
+			   TotalReceived +=receivedBufLen;
+			 }
+
+			 ptr = (char*)(data + DataOffset);
+			 receivedBufLen-= DataOffset;
+
+			 /* update Total data received counter */
+			 TotalData +=receivedBufLen;
+
+			 /* check if last data packet */
+			 if (TotalReceived == size)
+			 {
+
+				 strncat(&sendBuf,  ptr, receivedBufLen);
+				 strncat(&sendBuf,  " ", 1);
+				 HTTP_SetInfo(sendBuf, strlen(&sendBuf));
+				 DataFlag=0;
+				 BrowserFlag = 0;
+				 memset(sendBuf, 0, size);
+
+				  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);
+
+				   /* Tell TCP that we wish be to informed of data that has been
+					  successfully sent by a call to the http_sent() function. */
+				   tcp_sent(pcb, http_sent);
+			}
+			 /* not last data packet */
+			 else
+			 {
+			   /* write data in flash */
+			   if(receivedBufLen)
+			   {
+
+				 strncat(&sendBuf,  ptr, receivedBufLen);
+				 //memcpy(receiveBufTemp, ptr, receivedBufLen);
+			   }
+			 }
+		  }
 
-		  sendBufLoadLen = strlen(sendBuf);
-		  hs->file = sendBuf;
-		  hs->left = sendBufLoadLen;
-		  send_data(pcb, hs);
-		  tcp_sent(pcb, http_sent);
 	  }
 	  else if (strncmp(data, "GET /history.cgi", 16) == 0)
 		{
@@ -593,7 +796,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 	  }
 	}
 	  /* Тест  АКБ ИБП */
-	  else if (strncmp(data, "POST /bat_test.cgi", 18) == 0)
+	  else if (strncmp(data, "GET /bat_test.cgi", 18) == 0)
 	  {
 		HTTP_UPSTest(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
 
@@ -603,7 +806,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		tcp_sent(pcb, http_sent);
 	  }
 	  /* Выключение ИБП */
-	  else if (strncmp(data, "POST /ups_power.cgi", 19) == 0)
+	  else if (strncmp(data, "GET /ups_power.cgi", 19) == 0)
 	  {
 		HTTP_UPSshutdown(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
 
@@ -652,7 +855,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t er
 		tcp_sent(pcb, http_sent);
 	  }
 	  /* Смена пароля пользователя */
-	  else if (strncmp(data, "POST /changepwd.cgi", 19) == 0)
+	  else if (strncmp(data, "GET /changepwd.cgi", 19) == 0)
 	  {
 		  HTTP_ChangeUserPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
 
@@ -1257,7 +1460,7 @@ void HTTP_SetSettings(char *buf, uint16_t lenBuf)
   }
   memset(value, 0, len);
 
-  GetParamValue(&buf[555], "auth=", value, &valueLen);
+  GetParamValue(buf, "swauth=", value, &valueLen);
   SetAuthEnableStateStr(value);
 
   if (strncmp(value, "on", 2) == 0){
@@ -1451,34 +1654,28 @@ void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *le
 	  value = strstr(bufIn, "func");
 	  valueLen = strpbrk(value, ":");
 	  strncpy(tempValue, (valueLen+1), (strlen(valueLen)-2));
-	  if (strcmp(tempValue, "\"cancel\"") == 0){
+	  if (strcmp(tempValue, "\"reboot\"") == 0){
 		  res = ups_metac_service_pdu(ups_cancel_shut_down);
 		  if(res == 1){
 			  log_event_data(LOG_SHUTDOWN_UPS, "Администратор(Останов)");
-			  strcat(bufOut, "Выключение ИБП отменено!");
+			  strcat(bufOut, "Выключение нагрузки ИБП отменено!");
 		  }
 		  else
-			  strcat(bufOut, "Выключение ИБП не удалось отменить!");
+			  strcat(bufOut, "Выключение нагрузки ИБП не удалось отменить!");
 		  *lenBufOut = strlen(bufOut);
 	  }
 	  else if (strncmp(tempValue, "\"off\"", 5) == 0){
 		  value = strstr(tempValue, "after");
 		  valueLen = strpbrk(value, ":");
-		  valueLenEnd = strpbrk(value, ",");
-		  memset(tempValue2, 0, 50);
-		  strncpy(tempValue2, (valueLen+2), (valueLenEnd - valueLen - 2));
-		  TimeParam = atoi(tempValue2);
-		  value = strstr(tempValue, "to");
-		  valueLen = strpbrk(value, ":");
 		  memset(tempValue2, 0, 50);
 		  strncpy(tempValue2, (valueLen+2), (strlen(valueLen) - 2));
-		  TimeParam2 = atoi(tempValue2);
-		  res = ups_metac_service_pdu(ups_shutdown_restore);
+		  TimeParamFloat = atof(tempValue2);
+		  res = ups_metac_service_pdu(ups_shutdown);
 		  if(res == 1){
-			  strcat(bufOut, "Перезагрузка ИБП!");
+			  strcat(bufOut, "Отключение нагрузки ИБП!");
 			  log_event_data(LOG_SHUTDOWN_UPS, "Администратор");
 		  }else
-			  strcat(bufOut, "Отмена перезагрузки ИБП!");
+			  strcat(bufOut, "Отключение нагрузки ИБП не удалось!");
 		  *lenBufOut = strlen(bufOut);
 	  }
 }

+ 1 - 1
modules/HTTP_Server/web_params_api.c

@@ -193,7 +193,7 @@ void HTTP_GetSettings(char *buf)
   strncat(buf, str, len);
 
   GetAuthEnableStateStr(str, &len);
-  strcat(buf, ",\"auth\":");
+  strcat(buf, ",\"swauth\":");
   strncat(buf, str, len);
 
   /* RADIUS */

+ 17 - 14
modules/MegaTec/megatec.c

@@ -117,7 +117,7 @@ void send_MegaTec_cmd(cmdMegaTecEnums_t command)
 		ups_send_block(req, strlen(req));
 	}
 	else{
-        // TODO Ñîãëàñîâàòü èçìåíåíèÿ
+        // TODO ����������� ���������
 		//ups_send_block(MegaTecCMD[command], strlen(MegaTecCMD[command]));
         ups_send_block((void*)MegaTecCMD[command], strlen(MegaTecCMD[command]));
 	}
@@ -230,8 +230,6 @@ void ups_status_response(char *data)
 void ups_info_response(char *data)
 {
 	uint8_t i = 0;
-	char *endValue;
-	uint8_t len = 0;
 	if(data[0] != '#')
 		return;
 
@@ -247,18 +245,18 @@ void ups_info_response(char *data)
 		data ++;
 		i ++;
 	}
-	if(i < 11){
-		endValue = strpbrk(data," ");
-		len = endValue - data;
+	if(i < 15){
+		/*endValue = strpbrk(data," ");
+		len = endValue - data;*/
 		if(UPS.model[0] == 0){
-			strncpy(UPS.model, data, len);
+			strncpy(UPS.model, data, 10);
 			SNMP_SetObjDescr();
 		}
 		else{
-			strncpy(UPS.model, data, len);
+			strncpy(UPS.model, data, 10);
 		}
 
-		data += (len + 1);
+		data += 11;
 	}
 	else
 	{
@@ -269,11 +267,13 @@ void ups_info_response(char *data)
 		else{
 			strcpy(UPS.model, "RTMP II");
 		}
+		data += 11;
 	}
 
-	endValue = strpbrk(data,"\r");
-	len = endValue - data;
-	strncpy(UPS.vertion, data, len);
+	strncpy(UPS.serial, data, 8);
+	data += 8;
+
+	strncpy(UPS.vertion, data, 2);
 
 }
 
@@ -291,7 +291,10 @@ void ups_remain_time_response(char *data)
 
 	memset(value, 0, 10);
 	strcpy(value, data);
-	UPS.work_time = atof(value);
+	if((UPS.Status >> 7) & 0x01)
+		UPS.work_time = atof(value);
+	else
+		UPS.work_time = 0;
 }
 
 void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
@@ -335,7 +338,7 @@ int ups_metac_service_pdu(cmdMegaTecEnums_t command)
 	return -1;
 }
 
-// TODO Ñîãëàñîâàòü èçìåíåíèÿ
+// TODO ����������� ���������
 //void request_task(void)
 void request_task(void* params)
 {

+ 3 - 1
modules/MegaTec/megatec.h

@@ -40,7 +40,8 @@ typedef struct{
 	uint8_t Status;
 	uint8_t Alarm;
 	char model[11];
-	char vertion[11];
+	char vertion[3];
+	char serial[9];
 	uint8_t cnt_err_ups;
 	bool Present;
 	bool Flag_Present;
@@ -50,6 +51,7 @@ extern UPS_value_t UPS;
 
 extern uint16_t TimeParam;
 extern uint16_t TimeParam2;
+extern float TimeParamFloat;
 
 int ups_metac_service_pdu(cmdMegaTecEnums_t command);
 

+ 14 - 13
modules/monitor/ups_monitor.c

@@ -82,7 +82,9 @@ void UPS_DI0Monitor(void)
   static uint8_t DI0OldState = 0;
   uint8_t DI0StateCurrent;
 
-  DI0StateCurrent = get_state_din_outs(DIN1);
+  DI0StateCurrent = get_state_din_outs(DIN1) ^ sSettings.sInOuts.din_type_act[0];
+
+  UPS.Alarm = (UPS.Alarm & 0x0f) | ((DI0StateCurrent^1) << 4);
 
   	if (!isValueRecv) {
 	  isValueRecv = true;
@@ -101,19 +103,18 @@ void UPS_DI0Monitor(void)
 	// Значение параметра изменилось
 	if (DI0StateCurrent != DI0OldState)
 	{
-	  if(sSettings.sInOuts.din_type_act[0] == SNMP_TRAP)
-	  {
-		  if (DI0StateCurrent){
-			log_event_data(LOG_ALARM_DIO, "Норма");
-			SNMP_SendUserTrap(DI0_NORM);
-			flUpdateLog = true;
-		  }
-		  else{
-			log_event_data(LOG_ALARM_DIO, "Авария");
-			SNMP_SendUserTrap(DI0_ALARM);
-			flUpdateLog = true;
-		  }
+
+	  if (DI0StateCurrent){
+		log_event_data(LOG_ALARM_DIO, "Норма");
+		SNMP_SendUserTrap(DI0_NORM);
+		flUpdateLog = true;
+	  }
+	  else{
+		log_event_data(LOG_ALARM_DIO, "Авария");
+		SNMP_SendUserTrap(DI0_ALARM);
+		flUpdateLog = true;
 	  }
+
 	}
 
 	DI0OldState = DI0StateCurrent;

+ 3 - 3
modules/settings_api.c

@@ -174,7 +174,7 @@ void SETTINGS_SetINOUTSDef(void)
 	sSettings.sInOuts.ro_type_source[0] = CRITICAL;
 	sSettings.sInOuts.ro_type_source[1] = SNMP_SET;
 
-	sSettings.sInOuts.din_type_act[0] = SNMP_TRAP;
+	sSettings.sInOuts.din_type_act[0] = DI_CONN;
 }
 
 /**
@@ -184,8 +184,8 @@ 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;
+  strcpy(sSettings.sRADIUS.ServerIP, "0.0.0.0");
+  sSettings.sRADIUS.port = 1812;
   sSettings.sRADIUS.key_access = 123;
   strcpy(sSettings.sRADIUS.rds_password, "12345");
 }

+ 2 - 2
modules/settings_api.h

@@ -142,8 +142,8 @@ typedef enum
   */
 typedef enum
 {
-    UPS_ON = 1,
-    SNMP_TRAP,
+	DI_DISCONN = 0,
+    DI_CONN,
     DI_MAX_ACT
 } din_type_act_t;