|
@@ -68,6 +68,7 @@ const char* MegaTecCMD[] =
|
|
|
"QBV\r",
|
|
|
"QMD\r",
|
|
|
"QVFW\r",
|
|
|
+ "QVFW2\r",
|
|
|
"QID\r",
|
|
|
"QPI\r",
|
|
|
"QS\r",
|
|
@@ -86,14 +87,16 @@ void init_UPS_value(void)
|
|
|
UPS.Load = 0;
|
|
|
UPS.SOC = 0;
|
|
|
UPS.work_time = 0;
|
|
|
+ UPS.akb_work_time = 0;
|
|
|
UPS.Status = 0;
|
|
|
UPS.Alarm = 0;
|
|
|
UPS.cnt_err_ups = 0;
|
|
|
UPS.Flag_Present = false;
|
|
|
UPS.Present = false;
|
|
|
|
|
|
- memset(UPS.model, 0, 11);
|
|
|
- memset(UPS.vertion, 0, 11);
|
|
|
+ memset(UPS.model, 0, sizeof(UPS.model));
|
|
|
+ memset(UPS.vertion, 0, sizeof(UPS.vertion));
|
|
|
+ memset(UPS.serial, 0, sizeof(UPS.serial));
|
|
|
}
|
|
|
|
|
|
void send_MegaTec_cmd(cmdMegaTecEnums_t command)
|
|
@@ -447,7 +450,7 @@ void ups_remain_time_response(char *data)
|
|
|
memset(value, 0, 10);
|
|
|
strcpy(value, data);
|
|
|
//if((UPS.Status >> 7) & 0x01)
|
|
|
- UPS.work_time = atof(value);
|
|
|
+ UPS.work_time = atoi(value);
|
|
|
//else
|
|
|
// UPS.work_time = 0;
|
|
|
}
|
|
@@ -543,20 +546,45 @@ void ups_version_response(char *data)
|
|
|
|
|
|
data++;
|
|
|
|
|
|
- DBG printf("UPS ups_akb_info_parser_start: %s\r\n", data);
|
|
|
+ if(UPS.vertion[0] != 0){
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- //TODO
|
|
|
- len = get_ups_param(data, ".", value);
|
|
|
+ len = get_ups_param(data, ":", value);
|
|
|
data += (len + 1);
|
|
|
|
|
|
+ DBG printf("UPS ups_akb_info_parser_start: %s\r\n", data);
|
|
|
+
|
|
|
len = get_ups_param(data, "\r", value);
|
|
|
- if(UPS.vertion[0] == 0){
|
|
|
- strncpy(UPS.vertion, value, 2);
|
|
|
- SNMP_SetObjDescr();
|
|
|
- }
|
|
|
- else{
|
|
|
- strncpy(UPS.vertion, value, 2);
|
|
|
+ strncpy(UPS.vertion, value, 8);
|
|
|
+ strncat(UPS.vertion, "/", 1);
|
|
|
+}
|
|
|
+
|
|
|
+void ups_version_part2_response(char *data)
|
|
|
+{
|
|
|
+ char value[20];
|
|
|
+ uint8_t len = 0;
|
|
|
+ DBG printf("ups_akb_info_response: %s\r\n", data);
|
|
|
+ if(data[0] != '(')
|
|
|
+ return;
|
|
|
+ DBG printf("ups_akb_info_parser_start\r\n");
|
|
|
+ UPS.Present = true;
|
|
|
+ UPS.Flag_Present = true;
|
|
|
+ UPS.cnt_err_ups = 0;
|
|
|
+
|
|
|
+ data++;
|
|
|
+
|
|
|
+ if(UPS.vertion[9] != 0){
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ DBG printf("UPS ups_akb_info_parser_start: %s\r\n", data);
|
|
|
+
|
|
|
+ len = get_ups_param(data, ":", value);
|
|
|
+ data += (len + 1);
|
|
|
+
|
|
|
+ len = get_ups_param(data, "\r", value);
|
|
|
+ strncpy(&UPS.vertion[9], value, 8);
|
|
|
}
|
|
|
|
|
|
void ups_serial_response(char *data)
|
|
@@ -576,8 +604,8 @@ void ups_serial_response(char *data)
|
|
|
DBG printf("UPS ups_serial_parser_start: %s\r\n", data);
|
|
|
|
|
|
len = get_ups_param(data, "\r", value);
|
|
|
- strncpy(UPS.serial, &value[9], 5);
|
|
|
- UPS.serial[5] = 0;
|
|
|
+ strncpy(UPS.serial, &value[0], 14);
|
|
|
+ UPS.serial[14] = 0;
|
|
|
}
|
|
|
|
|
|
void ups_protocol_id_response(char *data)
|
|
@@ -633,6 +661,9 @@ void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
|
|
|
case ups_version_req:
|
|
|
ups_version_response(ups_pdu.data);
|
|
|
break;
|
|
|
+ case ups_version2_req:
|
|
|
+ ups_version_part2_response(ups_pdu.data);
|
|
|
+ break;
|
|
|
case ups_serial_req:
|
|
|
ups_serial_response(ups_pdu.data);
|
|
|
break;
|
|
@@ -681,7 +712,7 @@ int ups_metac_service_pdu(cmdMegaTecEnums_t command)
|
|
|
void request_task(void* params)
|
|
|
{
|
|
|
uint8_t kestar_req[3] = {ups_status_req, ups_remain_time_reg, ups_info};
|
|
|
- uint8_t voltronic_req[5] = {ups_status_req, ups_akb_info, ups_model_req, ups_version_req, ups_serial_req};//
|
|
|
+ uint8_t voltronic_req[6] = {ups_status_req, ups_akb_info, ups_model_req, ups_version_req, ups_version2_req, ups_serial_req};//
|
|
|
uint8_t num_req = 0;
|
|
|
uint8_t *req;
|
|
|
|
|
@@ -706,7 +737,7 @@ void request_task(void* params)
|
|
|
UPS.Present = false;
|
|
|
|
|
|
//memset(UPS.model, 0, 11);
|
|
|
- memset(UPS.vertion, 0, 11);
|
|
|
+ memset(UPS.vertion, 0, sizeof(UPS.vertion));
|
|
|
init_ups_rbuf();
|
|
|
}
|
|
|
}
|
|
@@ -757,9 +788,28 @@ void request_task(void* params)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void akb_time_work_task(void* params)
|
|
|
+{
|
|
|
+ static uint32_t tick_prev = 0;
|
|
|
+ for(;;) {
|
|
|
+ if(UPS.Present && ((UPS.Status >> 7) & 0x01)) {
|
|
|
+ if(tick_prev == 0) {
|
|
|
+ tick_prev = xTaskGetTickCount();
|
|
|
+ }
|
|
|
+ UPS.akb_work_time += (xTaskGetTickCount() - tick_prev)/1000;
|
|
|
+ tick_prev = xTaskGetTickCount();
|
|
|
+
|
|
|
+ } else {
|
|
|
+ tick_prev = 0;
|
|
|
+ UPS.akb_work_time = 0;
|
|
|
+ }
|
|
|
+ vTaskDelay(1000);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void ups_megatec_init(void) {
|
|
|
init_UPS_value();
|
|
|
UPS.Present = true;
|
|
|
xTaskCreate(request_task, ( char * ) "request_task", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
|
|
|
-
|
|
|
+ xTaskCreate(akb_time_work_task, ( char * ) "akb_time_work_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
|
|
|
}
|