|
|
/*****************************************************************************
|
|
|
* file lib/process/pd_dbg.c
|
|
|
* author YuLiang
|
|
|
* version 1.0.0
|
|
|
* date 01-June-2023
|
|
|
* brief This file provides all the debug server related operation functions.
|
|
|
******************************************************************************
|
|
|
* Attention
|
|
|
*
|
|
|
* <h2><center>© COPYRIGHT(c) 2021 LandPower</center></h2>
|
|
|
*
|
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
|
* are permitted provided that the following conditions are met:
|
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
|
* and/or other materials provided with the distribution.
|
|
|
* 3. Neither the name of LandPower nor the names of its contributors may be used to
|
|
|
* endorse or promote products derived from this software without specific
|
|
|
* prior written permission.
|
|
|
*
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
*
|
|
|
******************************************************************************/
|
|
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
#include "config.h"
|
|
|
#endif
|
|
|
|
|
|
#ifdef CFG_DEV_TYPE_LAND_PD
|
|
|
/* 标准C库头文件. */
|
|
|
#include <sys/socket.h>
|
|
|
#include <fcntl.h>
|
|
|
#include <netinet/in.h>
|
|
|
#include <arpa/inet.h>
|
|
|
#include <pthread.h>
|
|
|
#include <netinet/tcp.h>
|
|
|
|
|
|
/* 用户代码头文件. */
|
|
|
#include "cJSON.h"
|
|
|
#include "process.h"
|
|
|
#include "mtimer.h"
|
|
|
#include "pd_dbg.h"
|
|
|
#include "pd_csg.h"
|
|
|
#include "pd_dau.h"
|
|
|
|
|
|
/* Private define ------------------------------------------------------------*/
|
|
|
#define DEBUG_HEAD 0x55AA
|
|
|
#define DEBUG_TAIL 0x5AA5
|
|
|
|
|
|
#define DEBUG_CMD_LEN 10 * 1024 * 1024
|
|
|
|
|
|
#define DEBUG_CMU_FILE "PDMonitor"
|
|
|
#define DEBUG_CMU_FILE_BAK "PDMonitor.bak"
|
|
|
|
|
|
/* Private macro -------------------------------------------------------------*/
|
|
|
|
|
|
/* Private typedef -----------------------------------------------------------*/
|
|
|
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
|
debug_ctrl_t debug_ctrl;
|
|
|
static char cjson_buf[DEBUG_BUG_SIZE];
|
|
|
static char buf_cmd[DEBUG_CMD_LEN];
|
|
|
|
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
|
|
|
|
/* Internal functions --------------------------------------------------------*/
|
|
|
void _debug_pkt_head_int(debug_pkt_head_t *head, uint16_t cmd, uint32_t len)
|
|
|
{
|
|
|
head->head = DEBUG_HEAD;
|
|
|
head->cmd = cmd;
|
|
|
head->len = len;
|
|
|
}
|
|
|
|
|
|
void _debug_save_fatcory_param(cJSON *root)
|
|
|
{
|
|
|
cJSON *param = NULL;
|
|
|
struct in_addr addr = {0};
|
|
|
dau_t *dau_node = NULL;
|
|
|
uint16_t len = 0;
|
|
|
uint16_t field = 0;
|
|
|
uint8_t i = 0;
|
|
|
uint8_t j = 0;
|
|
|
uint8_t cnt = 0;
|
|
|
|
|
|
param = cJSON_AddObjectToObject(root, "EquipmentFactoryParam");
|
|
|
if (NULL == param)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Add json object error!\r\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
cJSON_AddStringToObject(param, "DeviceNum", host.name);
|
|
|
snprintf(cjson_buf, DEBUG_CJSON_BUG_SIZE, "%s", device_info.dev_type);
|
|
|
cJSON_AddStringToObject(param, "EquipmentType", cjson_buf);
|
|
|
cJSON_AddNumberToObject(param, "DateOfProduction", device_info.factory_date);
|
|
|
cJSON_AddNumberToObject(param, "DeploymentDate", device_info.deployment_date);
|
|
|
cJSON_AddStringToObject(param, "LocalIP1", device_info.host_ip);
|
|
|
cJSON_AddStringToObject(param, "LocalIP1_V6", "");
|
|
|
cJSON_AddStringToObject(param, "LocalMacAddress1", "");
|
|
|
cJSON_AddStringToObject(param, "LocalIP2", "");
|
|
|
cJSON_AddStringToObject(param, "LocalIP2_V6", "");
|
|
|
cJSON_AddStringToObject(param, "LocalMacAddress2", "");
|
|
|
addr.s_addr = csg.server_ip;
|
|
|
cJSON_AddStringToObject(param, "ServerIP1", inet_ntoa(addr));
|
|
|
cJSON_AddStringToObject(param, "ServerIP1_V6", "");
|
|
|
cJSON_AddStringToObject(param, "ServerIP2", "");
|
|
|
cJSON_AddStringToObject(param, "ServerIP2_V6","");
|
|
|
cJSON_AddNumberToObject(param,"ServerIP1_Port", csg.server_port);
|
|
|
cJSON_AddNumberToObject(param,"ServerIP2_Port", 0);
|
|
|
|
|
|
for(i = 0; i < PD_DAU_SUM; i++)
|
|
|
{
|
|
|
dau_node = dau[i];
|
|
|
if (!dau_node)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
for(j = 0; j < dau_node->port_num; j++)
|
|
|
{
|
|
|
field = (dau_node->port_reg[j].CR & DAU_CR_PT_Msk) >> DAU_CR_PT_Pos;
|
|
|
len += snprintf(cjson_buf + len, DEBUG_CJSON_BUG_SIZE - len, "%02x", field);
|
|
|
cnt++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for(i = cnt; i < PD_PORT_SUM; i++)
|
|
|
{
|
|
|
len += snprintf(cjson_buf + len, DEBUG_CJSON_BUG_SIZE - len, "00");
|
|
|
}
|
|
|
|
|
|
cJSON_AddStringToObject(param, "ChannelType", cjson_buf);
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
void _debug_save_user_param(cJSON *root)
|
|
|
{
|
|
|
cJSON *param = NULL;
|
|
|
|
|
|
param = cJSON_AddObjectToObject(root, "EquipmentUserParam");
|
|
|
if (NULL == param)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Add json object error!\r\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
cJSON_AddNumberToObject(param, "SystemFrequency", pd_config.config.power_frequency);
|
|
|
cJSON_AddNumberToObject(param, "SyncMode", pd_config.config.sync_mode);
|
|
|
cJSON_AddNumberToObject(param, "TimingSyncMode", pd_config.config.TimingSyncMode);
|
|
|
cJSON_AddNumberToObject(param, "DataAcquisitionCycle", pd_config.config.real_period);
|
|
|
cJSON_AddNumberToObject(param, "TrendDataReportCycle", pd_config.config.trend_period);
|
|
|
cJSON_AddNumberToObject(param, "HeartbeatCycle", pd_config.config.heartbeat_period);
|
|
|
cJSON_AddNumberToObject(param, "NumberWindowsOfPhase", pd_config.config.NumberWindowsOfPhase);
|
|
|
cJSON_AddNumberToObject(param, "SyncTime", pd_config.config.SyncTime);
|
|
|
cJSON_AddNumberToObject(param, "AlarmPeriod", pd_config.config.AlarmPeriod);
|
|
|
cJSON_AddNumberToObject(param, "TimePrpsStrategy", pd_config.config.TimePrpsStrategy);
|
|
|
cJSON_AddNumberToObject(param, "StorageTrent", pd_config.config.storage_trend);
|
|
|
cJSON_AddNumberToObject(param, "StorageAlarm", pd_config.config.StorageAlarm);
|
|
|
cJSON_AddNumberToObject(param, "StorageRun", pd_config.config.StorageRun);
|
|
|
cJSON_AddNumberToObject(param, "StorageFtPRPS", pd_config.config.storage_real);
|
|
|
cJSON_AddNumberToObject(param, "LimitEventStorageTime", pd_config.config.limit_event_time);
|
|
|
cJSON_AddNumberToObject(param, "LimitEventStorageCount", pd_config.config.limit_event_cnt);
|
|
|
cJSON_AddNumberToObject(param, "LimitEventStorageSpace", pd_config.config.limit_event_interval);
|
|
|
cJSON_AddNumberToObject(param, "prpsSaveEnable", pd_config.config.is_prps_save);
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
void _debug_save_port_param(cJSON *root)
|
|
|
{
|
|
|
cJSON *port_array = NULL;
|
|
|
cJSON *param = NULL;
|
|
|
pd_port_config_old_t *config = NULL;
|
|
|
uint8_t unit = 0;
|
|
|
uint8_t port = 0;
|
|
|
uint8_t i = 0;
|
|
|
|
|
|
port_array = cJSON_AddArrayToObject(root, "SensorConfigParam");
|
|
|
if (NULL == port_array)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Add json array error!\r\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
for(i = 1; i <= PD_PORT_SUM; i++)
|
|
|
{
|
|
|
if (dau_vport_to_port(i, &unit, &port) != E_NONE)
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
config = &pd_config.port_config[unit][port].config;
|
|
|
|
|
|
param = cJSON_CreateObject();
|
|
|
if (!param)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Create json error!\r\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
cJSON_AddNumberToObject(param,"ChannelNumber", config->vport);
|
|
|
cJSON_AddNumberToObject(param,"FilterType", config->filter);
|
|
|
cJSON_AddNumberToObject(param,"SensorType", config->sensor_type);
|
|
|
cJSON_AddNumberToObject(param,"PhaseSequence", config->phase_sequence);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor1_Number", config->NearSensor1_Number);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor1_Distance", config->NearSensor1_Distance);
|
|
|
cJSON_AddNumberToObject(param,"Signal1_AttenuationRatio", config->Signal1_AttenuationRatio);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor2_Number", config->NearSensor2_Number);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor2_Distance", config->NearSensor2_Distance);
|
|
|
cJSON_AddNumberToObject(param,"Signal2_AttenuationRatio", config->Signal2_AttenuationRatio);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor3_Number", config->NearSensor3_Number);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor3_Distance", config->NearSensor3_Distance);
|
|
|
cJSON_AddNumberToObject(param,"Signal3_AttenuationRatio", config->Signal3_AttenuationRatio);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor4_Number", config->NearSensor4_Number);
|
|
|
cJSON_AddNumberToObject(param,"NearSensor4_Distance", config->NearSensor4_Distance);
|
|
|
cJSON_AddNumberToObject(param,"Signal4_AttenuationRatio", config->Signal4_AttenuationRatio);
|
|
|
cJSON_AddNumberToObject(param,"EventTriggerThreshold", config->event_threshold);
|
|
|
cJSON_AddNumberToObject(param,"EventTriggerCounter", config->event_counter);
|
|
|
cJSON_AddNumberToObject(param,"EnvironmentalNoiseThreshold", config->env_noise);
|
|
|
cJSON_AddNumberToObject(param,"NoiseReductionLevel", config->noise_reduction);
|
|
|
cJSON_AddNumberToObject(param,"UpperLimitOfDischargeAmplitude", config->UpperLimitOfDischargeAmplitude);
|
|
|
cJSON_AddNumberToObject(param,"WaveTriggerThreshold", config->WaveTriggerThreshold);
|
|
|
cJSON_AddNumberToObject(param,"PrescalerSampleValue", config->PrescalerSampleValue);
|
|
|
cJSON_AddNumberToObject(param,"SamplePointsTotalTriggered", config->SamplePointsTotalTriggered);
|
|
|
cJSON_AddNumberToObject(param,"RecordStartAdr", config->RecordStartAdr);
|
|
|
cJSON_AddNumberToObject(param,"RecordStopAdr", config->RecordStopAdr);
|
|
|
cJSON_AddNumberToObject(param,"SampleRate", config->sample_rate);
|
|
|
cJSON_AddNumberToObject(param,"BeforeTriggerTime", config->BeforeTriggerTime);
|
|
|
cJSON_AddNumberToObject(param,"AfterTriggerTime", config->AfterTriggerTime);
|
|
|
cJSON_AddNumberToObject(param,"StorageEvent", config->storage_event);
|
|
|
cJSON_AddNumberToObject(param,"StorageAEWave", config->storage_wave);
|
|
|
|
|
|
cJSON_AddItemToArray(port_array, param);
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
cJSON* _debug_save_cfg_to_json(void)
|
|
|
{
|
|
|
cJSON *root = NULL;
|
|
|
|
|
|
root = cJSON_CreateObject();
|
|
|
if (!root)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Create json error!\r\n");
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
_debug_save_fatcory_param(root);
|
|
|
_debug_save_user_param(root);
|
|
|
_debug_save_port_param(root);
|
|
|
|
|
|
return root;
|
|
|
}
|
|
|
|
|
|
/* 调试工具修改本地ip 设备ID 服务器地址时需要重启。*/
|
|
|
void _debug_parse_fatcory_param(cJSON *root, unsigned int *changbitmap, BOOT_MSG *boottype)
|
|
|
{
|
|
|
struct sockaddr_in addr = {0};
|
|
|
cJSON *param = cJSON_GetObjectItem(root, "EquipmentFactoryParam");
|
|
|
char *str = NULL;
|
|
|
uint8_t unit = 0;
|
|
|
uint8_t port = 0;
|
|
|
uint8_t i = 0;
|
|
|
uint8_t type = 0;
|
|
|
|
|
|
if (!param)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
str = cJSON_GetStringValue(cJSON_GetObjectItem(param, "EquipmentType"));
|
|
|
if (str)
|
|
|
{
|
|
|
if (strncmp(str, device_info.dev_type, sizeof(device_info.dev_type)) != 0)
|
|
|
{
|
|
|
snprintf(device_info.dev_type, FILE_NAME_LEN, "%s", str);
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
str = cJSON_GetStringValue(cJSON_GetObjectItem(param, "DeviceNum"));
|
|
|
if (str)
|
|
|
{
|
|
|
if (strncmp(str, host.name, sizeof(host.name)) != 0)
|
|
|
{
|
|
|
snprintf(host.name, FILE_NAME_LEN, "%s", str);
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
*boottype = BOOT_LOCAL_HOST_NAME_CHANGE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
device_info.factory_date = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "DateOfProduction"));
|
|
|
device_info.deployment_date = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "DeploymentDate"));
|
|
|
|
|
|
str = cJSON_GetStringValue(cJSON_GetObjectItem(param, "LocalIP1"));
|
|
|
if (str)
|
|
|
{
|
|
|
if (strncmp(str, device_info.host_ip, sizeof(device_info.host_ip)) != 0)
|
|
|
{
|
|
|
snprintf(device_info.host_ip, INET_ADDRSTRLEN, "%s", str);
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
*changbitmap |= BITMAP_IP_CHANGE;
|
|
|
*boottype = BOOT_LOCAL_IP_CHANGE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
str = cJSON_GetStringValue(cJSON_GetObjectItem(param, "ServerIP1"));
|
|
|
if (str)
|
|
|
{
|
|
|
inet_aton(str, &addr.sin_addr);
|
|
|
if (addr.sin_addr.s_addr != csg.server_ip)
|
|
|
{
|
|
|
csg.server_ip = addr.sin_addr.s_addr;
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
*boottype = BOOT_LOCAL_SERVER_IP_CHANGE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int port_tmp = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "ServerIP1_Port"));
|
|
|
if (port_tmp > 0 && port_tmp != csg.server_port)
|
|
|
{
|
|
|
csg.server_port = port_tmp;
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
*boottype = BOOT_LOCAL_SERVER_PORT_CHANGE;
|
|
|
}
|
|
|
|
|
|
str = cJSON_GetStringValue(cJSON_GetObjectItem(param, "ChannelType"));
|
|
|
if (str)
|
|
|
{
|
|
|
for(i = 0; i < PD_PORT_SUM; i++)
|
|
|
{
|
|
|
if ('\0' == *str)
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
type = (*str - '0') << 4;
|
|
|
str++;
|
|
|
|
|
|
type += *str - '0';
|
|
|
str++;
|
|
|
|
|
|
if (dau_vport_to_port(i + 1, &unit, &port) != E_NONE)
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
dau_port_type_set(unit, port, type);
|
|
|
|
|
|
dau_reg_port_write(unit, port);
|
|
|
|
|
|
*changbitmap |= BITMAP_SAVE_FILE; // save file
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
void _debug_parse_user_param(cJSON *root, unsigned int *changbitmap)
|
|
|
{
|
|
|
unsigned int temp;
|
|
|
cJSON *param = cJSON_GetObjectItem(root,"EquipmentUserParam");
|
|
|
|
|
|
if (!param)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
pd_config.config.power_frequency = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "SystemFrequency"));
|
|
|
temp = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "SyncMode"));
|
|
|
if (pd_config.config.sync_mode != temp)
|
|
|
{
|
|
|
pd_config.config.sync_mode = (uint8_t)temp;
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
pd_sync_mode_set();
|
|
|
}
|
|
|
pd_config.config.TimingSyncMode = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "TimingSyncMode"));
|
|
|
temp = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "DataAcquisitionCycle"));
|
|
|
if (pd_config.config.real_period != temp)
|
|
|
{
|
|
|
pd_config.config.real_period = (uint8_t)temp;
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
}
|
|
|
temp = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "TrendDataReportCycle"));
|
|
|
if (pd_config.config.trend_period != temp)
|
|
|
{
|
|
|
pd_config.config.trend_period = (uint8_t)temp;
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
}
|
|
|
temp = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "HeartbeatCycle"));
|
|
|
if (pd_config.config.heartbeat_period != temp)
|
|
|
{
|
|
|
pd_config.config.heartbeat_period = (uint8_t)temp;
|
|
|
*changbitmap |= BITMAP_SAVE_FILE;
|
|
|
}
|
|
|
pd_config.config.NumberWindowsOfPhase = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NumberWindowsOfPhase"));
|
|
|
pd_config.config.SyncTime = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "SyncTime"));
|
|
|
pd_config.config.AlarmPeriod = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "AlarmPeriod"));
|
|
|
pd_config.config.TimePrpsStrategy = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "TimePrpsStrategy"));
|
|
|
pd_config.config.storage_trend = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "StorageTrent"));
|
|
|
pd_config.config.StorageAlarm = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "StorageAlarm"));
|
|
|
pd_config.config.StorageRun = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "StorageRun"));
|
|
|
pd_config.config.storage_real = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "StorageFtPRPS"));
|
|
|
pd_config.config.limit_event_time = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "LimitEventStorageTime"));
|
|
|
pd_config.config.limit_event_cnt = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "LimitEventStorageCount"));
|
|
|
pd_config.config.limit_event_interval = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "LimitEventStorageSpace"));
|
|
|
pd_config.config.is_prps_save = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "prpsSaveEnable"));
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
void _debug_parse_port_param(cJSON *root)
|
|
|
{
|
|
|
pd_port_config_old_t *config = NULL;
|
|
|
cJSON *port_array = NULL;
|
|
|
cJSON *param = NULL;
|
|
|
int size = 0;
|
|
|
uint8_t vport = 0;
|
|
|
uint8_t unit = 0;
|
|
|
uint8_t port = 0;
|
|
|
uint8_t i = 0;
|
|
|
|
|
|
port_array = cJSON_GetObjectItem(root, "SensorConfigParam");
|
|
|
if (!port_array)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
size = cJSON_GetArraySize(port_array);
|
|
|
for (i = 0; i < size; i++)
|
|
|
{
|
|
|
param = cJSON_GetArrayItem(port_array, i);
|
|
|
if (!param )
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
vport = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "ChannelNumber"));
|
|
|
if (dau_vport_to_port(vport, &unit, &port) != E_NONE)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
config = &pd_config.port_config[unit][port].config;
|
|
|
|
|
|
config->filter = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "FilterType"));
|
|
|
config->sensor_type = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "SensorType"));
|
|
|
config->phase_sequence = (uint8_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "PhaseSequence"));
|
|
|
config->NearSensor1_Number = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor1_Number"));
|
|
|
config->NearSensor1_Distance = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor1_Distance"));
|
|
|
config->Signal1_AttenuationRatio = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "Signal1_AttenuationRatio"));
|
|
|
config->NearSensor2_Number = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor2_Number"));
|
|
|
config->NearSensor2_Distance = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor2_Distance"));
|
|
|
config->Signal2_AttenuationRatio = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "Signal2_AttenuationRatio"));
|
|
|
config->NearSensor3_Number = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor3_Number"));
|
|
|
config->NearSensor3_Distance = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor3_Distance"));
|
|
|
config->Signal3_AttenuationRatio = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "Signal3_AttenuationRatio"));
|
|
|
config->NearSensor4_Number = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor4_Number"));
|
|
|
config->NearSensor4_Distance = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NearSensor4_Distance"));
|
|
|
config->Signal4_AttenuationRatio = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "Signal4_AttenuationRatio"));
|
|
|
config->event_threshold = (int16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "EventTriggerThreshold"));
|
|
|
config->event_counter = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "EventTriggerCounter"));
|
|
|
config->env_noise = (int16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "EnvironmentalNoiseThreshold"));
|
|
|
config->noise_reduction = (int16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "NoiseReductionLevel"));
|
|
|
config->UpperLimitOfDischargeAmplitude = (int16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "UpperLimitOfDischargeAmplitude"));
|
|
|
config->WaveTriggerThreshold = (int16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "WaveTriggerThreshold"));
|
|
|
config->PrescalerSampleValue = (uint16_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "PrescalerSampleValue"));
|
|
|
config->SamplePointsTotalTriggered = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "SamplePointsTotalTriggered"));
|
|
|
config->RecordStartAdr = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "RecordStartAdr"));
|
|
|
config->RecordStopAdr = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "RecordStopAdr"));
|
|
|
config->sample_rate = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "SampleRate"));
|
|
|
config->BeforeTriggerTime = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "BeforeTriggerTime"));
|
|
|
config->AfterTriggerTime = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "AfterTriggerTime"));
|
|
|
config->storage_event = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "StorageEvent"));
|
|
|
config->storage_wave = (uint32_t)cJSON_GetNumberValue(cJSON_GetObjectItem(param, "StorageAEWave"));
|
|
|
|
|
|
pd_config.port_config[unit][port].filter_cfg = pd_config.port_config[unit][port].config.filter;
|
|
|
dau_port_config_set(unit, port);
|
|
|
dau_reg_port_write(unit, port);
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
int32_t _debug_parse_json_to_cfg(cJSON *root)
|
|
|
{
|
|
|
unsigned int changbitmap = 0; //bit0:need save
|
|
|
//bit1:local ip changed
|
|
|
BOOT_MSG boottype = BOOT_NONE;
|
|
|
|
|
|
_debug_parse_fatcory_param(root, &changbitmap, &boottype);
|
|
|
_debug_parse_user_param(root, &changbitmap);
|
|
|
_debug_parse_port_param(root);
|
|
|
|
|
|
if (BITMAP_SAVE_FILE == (changbitmap & BITMAP_SAVE_FILE))
|
|
|
{
|
|
|
vtysh_config_save();
|
|
|
if (BITMAP_IP_CHANGE == (changbitmap & BITMAP_IP_CHANGE))
|
|
|
{
|
|
|
uint8_t mac[MAC_ADDR_LEN] = {0};
|
|
|
mac_generate_from_ip(device_info.host_ip, mac);
|
|
|
memcpy(device_info.mac, mac, MAC_ADDR_LEN);
|
|
|
vtysh_device_save();
|
|
|
vtysh_eth0_save();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (boottype)
|
|
|
{
|
|
|
reboot_system(DBG_M_DEBUG, boottype);
|
|
|
}
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* 回复报文处理. */
|
|
|
int32_t _debug_pkt_common_send(char *buf, uint16_t cmd, uint32_t data_len)
|
|
|
{
|
|
|
debug_pkt_head_t *head = (debug_pkt_head_t*)buf;
|
|
|
uint16_t *tail = (uint16_t*)(buf + sizeof(debug_pkt_head_t) + data_len);
|
|
|
|
|
|
_debug_pkt_head_int(head, cmd, data_len);
|
|
|
*tail = DEBUG_TAIL;
|
|
|
|
|
|
if (write(debug_ctrl.fd_client, buf, sizeof(debug_pkt_head_t) + data_len + 2) <= 0)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Write cmd %x ERROR\r\n", head->cmd);
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* 获取配置报文处理. */
|
|
|
int32_t _debug_pkt_cfg_get(char *buf, int len)
|
|
|
{
|
|
|
cJSON *root = NULL;
|
|
|
char *cfg = NULL;
|
|
|
char *cfg_json = NULL;
|
|
|
uint16_t len_pkt = 0;
|
|
|
|
|
|
/* 获取 json 格式的配置文件. */
|
|
|
root = _debug_save_cfg_to_json();
|
|
|
if (!root)
|
|
|
{
|
|
|
return E_NOT_FOUND;
|
|
|
}
|
|
|
|
|
|
/* 将 json 转为字符串. */
|
|
|
cfg_json = cJSON_PrintUnformatted(root);
|
|
|
cJSON_Delete(root);
|
|
|
len_pkt = strlen(cfg_json);
|
|
|
|
|
|
/* 复制数据. */
|
|
|
cfg = buf + sizeof(debug_pkt_head_t);
|
|
|
memcpy(cfg, cfg_json, len_pkt);
|
|
|
free(cfg_json);
|
|
|
|
|
|
/* 发送数据. */
|
|
|
return _debug_pkt_common_send(buf, DEBUG_CONFIG_GET, len_pkt);
|
|
|
}
|
|
|
|
|
|
/* 设置报文处理. */
|
|
|
int32_t _debug_pkt_cfg_set(char *buf, int len)
|
|
|
{
|
|
|
char *cfg = buf + sizeof(debug_pkt_head_t);
|
|
|
cJSON *root = cJSON_Parse(cfg);
|
|
|
|
|
|
if (!root)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Parse json error!\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
/* 将 json 配置转换成设备配置. */
|
|
|
if (_debug_parse_json_to_cfg(root) != E_NONE)
|
|
|
{
|
|
|
cJSON_Delete(root);
|
|
|
return E_BAD_PARAM;
|
|
|
}
|
|
|
cJSON_Delete(root);
|
|
|
|
|
|
/* 发送数据. */
|
|
|
return _debug_pkt_common_send(buf, DEBUG_CONFIG_SET, 0);
|
|
|
}
|
|
|
|
|
|
/* 重启报文处理. */
|
|
|
int32_t _debug_pkt_reboot(char *buf, int len)
|
|
|
{
|
|
|
/* 发送数据. */
|
|
|
_debug_pkt_common_send(buf, DEBUG_REBOOT, 0);
|
|
|
|
|
|
/* 重启. */
|
|
|
reboot_system(DBG_M_DEBUG, BOOT_LOCAL_RESET);
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* 时间设置报文处理. */
|
|
|
int32_t _debug_pkt_time_set(char *buf, int len)
|
|
|
{
|
|
|
uint32_t *timestamp = (uint32_t*)(buf + sizeof(debug_pkt_head_t));
|
|
|
|
|
|
/* 配置时间. */
|
|
|
time_set(*timestamp);
|
|
|
|
|
|
/* 发送数据. */
|
|
|
_debug_pkt_common_send(buf, DEBUG_TIME_SET, 0);
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* 数据手动设置报文处理. */
|
|
|
int32_t _debug_pkt_manual_col(char *buf, int len)
|
|
|
{
|
|
|
uint32_t *flag = (uint32_t*)(buf + sizeof(debug_pkt_head_t));
|
|
|
|
|
|
/* 修改标志位. */
|
|
|
debug_ctrl.is_manual_col = (*flag) ? TRUE : FALSE;
|
|
|
|
|
|
/* 发送数据. */
|
|
|
return _debug_pkt_common_send(buf, DEBUG_NOISE_CAREFOR, 0);
|
|
|
}
|
|
|
|
|
|
/* 获取校准系数报文处理. */
|
|
|
int32_t _debug_pkt_adj_get(char *buf, int len)
|
|
|
{
|
|
|
dau_port_reg_t *reg = NULL;
|
|
|
debug_pkt_adj_t *data = (debug_pkt_adj_t *)(buf + sizeof(debug_pkt_head_t));
|
|
|
uint8_t unit = 0;
|
|
|
uint8_t port = 0;
|
|
|
uint8_t i = 0;
|
|
|
uint8_t j = 0;
|
|
|
|
|
|
memset(data, 0, sizeof(debug_pkt_adj_t));
|
|
|
for(i = 0; i < PD_PORT_SUM; i++)
|
|
|
{
|
|
|
if (dau_vport_to_port(i + 1, &unit, &port) != E_NONE)
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
reg = &dau[unit]->port_reg[port];
|
|
|
|
|
|
for(j = 0; j < 4; j++)
|
|
|
{
|
|
|
data->vport[i].point[j] = reg->ASPR[j];
|
|
|
}
|
|
|
for(j = 0; j < 5; j++)
|
|
|
{
|
|
|
data->vport[i].param_a[j] = reg->AFAR[j];
|
|
|
}
|
|
|
for(j = 0; j < 5; j++)
|
|
|
{
|
|
|
data->vport[i].param_b[j] = reg->AFBR[j];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 发送数据. */
|
|
|
return _debug_pkt_common_send(buf, DEBUG_ADJSUT_COEFFICIENT_GET, sizeof(debug_pkt_adj_t));
|
|
|
}
|
|
|
|
|
|
/* 获取校准系数报文处理. */
|
|
|
int32_t _debug_pkt_adj_set(char *buf, int len)
|
|
|
{
|
|
|
dau_port_reg_t *reg = NULL;
|
|
|
debug_pkt_adj_t *data = (debug_pkt_adj_t*)(buf + sizeof(debug_pkt_head_t));
|
|
|
int8_t *ret = (int8_t*)(buf + sizeof(debug_pkt_head_t));
|
|
|
uint8_t unit = 0;
|
|
|
uint8_t port = 0;
|
|
|
uint8_t i = 0;
|
|
|
uint8_t j = 0;
|
|
|
|
|
|
for(i = 0; i < PD_PORT_SUM; i++)
|
|
|
{
|
|
|
if (dau_vport_to_port(i + 1, &unit, &port) != E_NONE)
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
reg = &dau[unit]->port_reg[port];
|
|
|
|
|
|
for(j = 0; j < 4; j++)
|
|
|
{
|
|
|
reg->ASPR[j] = data->vport[i].point[j];
|
|
|
}
|
|
|
reg->ASPR[j] = 65535;
|
|
|
for(j = 0; j < 5; j++)
|
|
|
{
|
|
|
reg->AFAR[j] = data->vport[i].param_a[j];
|
|
|
}
|
|
|
for(j = 0; j < 5; j++)
|
|
|
{
|
|
|
reg->AFBR[j] = data->vport[i].param_b[j];
|
|
|
}
|
|
|
dau_reg_port_write(unit, port);
|
|
|
}
|
|
|
|
|
|
/* 发送数据. */
|
|
|
for(unit = 0; unit < PD_DAU_SUM; unit++)
|
|
|
{
|
|
|
if (!dau[unit])
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
dau_param_save(unit);
|
|
|
}
|
|
|
|
|
|
*ret = 1;
|
|
|
return _debug_pkt_common_send(buf, DEBUG_ADJSUT_COEFFICIENT_SET, 1);
|
|
|
}
|
|
|
|
|
|
|
|
|
/* 获取运行状态报文处理. */
|
|
|
int32_t _debug_pkt_status_get(char *buf, int len)
|
|
|
{
|
|
|
debug_pkt_status_t *status = (debug_pkt_status_t*)(buf + sizeof(debug_pkt_head_t));
|
|
|
|
|
|
status->idx = 0;
|
|
|
status->UTC_TimeScale = time(NULL);
|
|
|
status->F50Hz_Frequency = dau_power_frequency_get();
|
|
|
status->F50Hz_SynStatus = pd_state.sync;
|
|
|
status->dau_status = dau_connect_get();
|
|
|
status->sensor_status = 0;
|
|
|
status->is_server_link = csg.is_connect;
|
|
|
status->version = version_hex;
|
|
|
status->communication_time = csg.communication_time;
|
|
|
status->run_time = status->UTC_TimeScale - start_time;
|
|
|
|
|
|
/* 发送数据. */
|
|
|
return _debug_pkt_common_send(buf, DEBUG_RUN_STATUS_GET, sizeof(debug_pkt_status_t));
|
|
|
}
|
|
|
|
|
|
/* CMU 升级报文处理. */
|
|
|
int32_t _debug_pkt_mcu_upgrade(char *buf, int len)
|
|
|
{
|
|
|
debug_pkt_head_t *head = (debug_pkt_head_t*)buf;
|
|
|
char *date = buf + sizeof(debug_pkt_head_t);
|
|
|
int fd = 0;
|
|
|
|
|
|
/* 保存文件. */
|
|
|
fd = open(DEBUG_CMU_FILE_BAK, O_WRONLY | O_CREAT | O_TRUNC, 0777);
|
|
|
if (fd <= 0)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Open " DEBUG_CMU_FILE_BAK " ERROR\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
if (write(fd, date, head->len) != head->len)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Write " DEBUG_CMU_FILE_BAK " ERROR\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
close(fd);
|
|
|
|
|
|
if (rename(DEBUG_CMU_FILE_BAK, DEBUG_CMU_FILE) < 0)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Rename " DEBUG_CMU_FILE_BAK " ERROR\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
/* 发送回复. */
|
|
|
_debug_pkt_common_send(buf, DEBUG_ARM_UPGRADE, 0);
|
|
|
|
|
|
reboot_system(DBG_M_DEBUG, BOOT_LOCAL_ARM_UPGRADE);
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* DAU 升级报文处理. */
|
|
|
int32_t _debug_pkt_dau_upgrade(char *buf, int len, uint8_t bitmap)
|
|
|
{
|
|
|
debug_pkt_head_t *head = (debug_pkt_head_t*)buf;
|
|
|
char *date = buf + sizeof(debug_pkt_head_t);
|
|
|
int8_t *ret = (int8_t*)(buf + sizeof(debug_pkt_head_t));
|
|
|
int fd = 0;
|
|
|
|
|
|
fd = open(DEBUG_DAU_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0666);
|
|
|
if (fd <= 0)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Open " DEBUG_DAU_FILE " ERROR\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
if (write(fd, date, head->len) != head->len)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Write " DEBUG_DAU_FILE " ERROR\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
close(fd);
|
|
|
|
|
|
/* 发送回复. */
|
|
|
if (dau_update() != E_NONE)
|
|
|
{
|
|
|
*ret = 0;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
*ret = 1;
|
|
|
}
|
|
|
|
|
|
_debug_pkt_common_send(buf, head->cmd, 1);
|
|
|
|
|
|
reboot_system(DBG_M_DEBUG, BOOT_LOCAL_FPGA_UPGRADE);
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
int32_t _debug_all_upgrade(char *buf, int len)
|
|
|
{
|
|
|
debug_pkt_head_t *head = (debug_pkt_head_t*)buf;
|
|
|
char *date = buf + sizeof(debug_pkt_head_t);
|
|
|
//int8_t *ret = (int8_t*)(buf + sizeof(debug_pkt_head_t));
|
|
|
int fd = 0;
|
|
|
char upgrade_file[128] = {0};
|
|
|
if (buf == NULL)
|
|
|
{
|
|
|
return E_BAD_PARAM;
|
|
|
}
|
|
|
|
|
|
printh("cmd:0x%x len:%d\n", head->cmd, head->len);
|
|
|
snprintf(upgrade_file, 127, "/home/gis/%s", UPGRADE_SOFTWARE);
|
|
|
fd = open(upgrade_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
|
|
|
if (fd <= 0)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Open " DEBUG_DAU_FILE " ERROR\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
if (write(fd, date, head->len) != head->len)
|
|
|
{
|
|
|
DBG(DBG_M_DEBUG, "Write " DEBUG_DAU_FILE " ERROR\r\n");
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
close(fd);
|
|
|
return _debug_pkt_common_send(buf, head->cmd, 1);
|
|
|
}
|
|
|
|
|
|
/* 报文校验. */
|
|
|
int32_t _debug_pkt_check(char *buf, int len)
|
|
|
{
|
|
|
debug_pkt_head_t *head = (debug_pkt_head_t*)buf;
|
|
|
uint16_t *tail = (uint16_t*)(buf + len - 2);
|
|
|
|
|
|
if (*tail != DEBUG_TAIL)
|
|
|
{
|
|
|
return E_ERROR;
|
|
|
}
|
|
|
|
|
|
if(head->head != DEBUG_HEAD)
|
|
|
{
|
|
|
return E_ERROR;
|
|
|
}
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* 调试工具报文数据处理. */
|
|
|
int32_t _debug_pkt_process(char *buf, int32_t len)
|
|
|
{
|
|
|
debug_pkt_head_t *head = (debug_pkt_head_t*)buf;
|
|
|
|
|
|
/* 报文格式检查. */
|
|
|
LD_E_RETURN(DBG_M_DEBUG, _debug_pkt_check(buf, len));
|
|
|
|
|
|
/* 报文处理. */
|
|
|
switch(head->cmd)
|
|
|
{
|
|
|
case DEBUG_CONFIG_GET:
|
|
|
_debug_pkt_cfg_get(buf, len);
|
|
|
break;
|
|
|
case DEBUG_CONFIG_SET:
|
|
|
_debug_pkt_cfg_set(buf, len);
|
|
|
break;
|
|
|
case DEBUG_ALARM_CONFIG_GET:
|
|
|
break;
|
|
|
case DEBUG_REBOOT:
|
|
|
_debug_pkt_reboot(buf, len);
|
|
|
break;
|
|
|
case DEBUG_TIME_SET:
|
|
|
_debug_pkt_time_set(buf, len);
|
|
|
break;
|
|
|
case DEBUG_NOISE_CAREFOR:
|
|
|
_debug_pkt_manual_col(buf, len);
|
|
|
break;
|
|
|
case DEBUG_RUN_STATUS_GET:
|
|
|
_debug_pkt_status_get(buf, len);
|
|
|
break;
|
|
|
case DEBUG_ADJSUT_COEFFICIENT_GET:
|
|
|
_debug_pkt_adj_get(buf, len);
|
|
|
break;
|
|
|
case DEBUG_ADJSUT_COEFFICIENT_SET:
|
|
|
_debug_pkt_adj_set(buf, len);
|
|
|
break;
|
|
|
case DEBUG_ARM_UPGRADE:
|
|
|
_debug_pkt_mcu_upgrade(buf, len);
|
|
|
break;
|
|
|
case DEBUG_FPGA1_UPGRADE:
|
|
|
_debug_pkt_dau_upgrade(buf, len, 0x01);
|
|
|
break;
|
|
|
case DEBUG_FPGA2_UPGRADE:
|
|
|
_debug_pkt_dau_upgrade(buf, len, 0x02);
|
|
|
break;
|
|
|
case DEBUG_FPGA3_UPGRADE:
|
|
|
_debug_pkt_dau_upgrade(buf, len, 0x04);
|
|
|
break;
|
|
|
case DEBUG_FPGA4_UPGRADE:
|
|
|
_debug_pkt_dau_upgrade(buf, len, 0x08);
|
|
|
break;
|
|
|
case DEBUG_FPGA_UPGRADE:
|
|
|
_debug_pkt_dau_upgrade(buf, len, 0x0f);
|
|
|
break;
|
|
|
case DEBUG_UPGRADE_ALL:
|
|
|
_debug_all_upgrade(buf, len);
|
|
|
//init_upgrade_manage();
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
DBG(DBG_M_DEBUG, "Debug not support cmd:%x\n", head->cmd);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* tcp 连接粘包处理函数. */
|
|
|
int32_t _debug_pkt_recv_adhesion(char *buf, int len, int *len_recv)
|
|
|
{
|
|
|
debug_pkt_head_t *head = NULL;
|
|
|
static int len_pkt = 0;
|
|
|
static int bytes_cnt = 0;
|
|
|
static int state = 0;
|
|
|
|
|
|
if (0 == state)
|
|
|
{
|
|
|
/* 首包处理. */
|
|
|
head = (debug_pkt_head_t*)buf;
|
|
|
bytes_cnt = 0;
|
|
|
|
|
|
if (head->len > 10485000)
|
|
|
{
|
|
|
/* 报文太长不处理. */
|
|
|
return -1;
|
|
|
}
|
|
|
else if (0x55aa == head->head)
|
|
|
{
|
|
|
/* 报文头处理, 置标志位. */
|
|
|
state = 1;
|
|
|
|
|
|
/* 计算剩余报文长度, 复制数据, 并计算收包总长度. */
|
|
|
len_pkt = head->len + 10 - len;
|
|
|
memcpy(buf_cmd + bytes_cnt, buf, len);
|
|
|
bytes_cnt += len;
|
|
|
|
|
|
/* 计算下一包应该接收多大的数据. */
|
|
|
if (len_pkt > DEBUG_BUG_SIZE)
|
|
|
{
|
|
|
*len_recv = DEBUG_BUG_SIZE;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
*len_recv = len_pkt;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
/* 在状体 0 下, 收到的报文不是以 0x55aa 开头, 无效报文不处理. */
|
|
|
return -1;
|
|
|
}
|
|
|
}
|
|
|
else if(1 == state)
|
|
|
{
|
|
|
/* 报文内容处理. */
|
|
|
/* 计算剩余报文长度, 复制数据, 并计算收包总长度. */
|
|
|
len_pkt -= len;
|
|
|
memcpy(buf_cmd + bytes_cnt, buf, len);
|
|
|
bytes_cnt += len;
|
|
|
|
|
|
/* 计算下一包应该接收多大的数据. */
|
|
|
if (len_pkt > DEBUG_BUG_SIZE)
|
|
|
{
|
|
|
*len_recv = DEBUG_BUG_SIZE;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
*len_recv = len_pkt;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 报文没有收全, 继续等待数据. */
|
|
|
if (len_pkt > 0)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
state = 0;
|
|
|
return bytes_cnt;
|
|
|
}
|
|
|
|
|
|
/* 调试工具报文接收处理线程. */
|
|
|
void *_debug_pkt_recv_handle(void *arg)
|
|
|
{
|
|
|
struct sockaddr_in client = {0};
|
|
|
char *buf = debug_ctrl.buf;
|
|
|
socklen_t sockt_len = 0;
|
|
|
int len = 0;
|
|
|
int len_pkt = 0;
|
|
|
int len_recv = DEBUG_BUG_SIZE;
|
|
|
|
|
|
while (!is_system_init)
|
|
|
{
|
|
|
sleep(1);
|
|
|
}
|
|
|
|
|
|
/* 监听端口. */
|
|
|
if ((listen(debug_ctrl.fd, 5)) != 0)
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "ERROR at socket listen return %s!", safe_strerror(errno));
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
while(1)
|
|
|
{
|
|
|
/* 连接调试工具. */
|
|
|
sockt_len = sizeof(client);
|
|
|
debug_ctrl.fd_client = accept(debug_ctrl.fd, (struct sockaddr*)&client, &sockt_len);
|
|
|
if (debug_ctrl.fd_client < 0)
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "ERROR at socket accept return %s!", safe_strerror(errno));
|
|
|
continue;
|
|
|
}
|
|
|
/* 连接成功. */
|
|
|
while(1)
|
|
|
{
|
|
|
// 开启保活,保活参数 表示60秒内无交互后,每隔6秒检测一次,40次都没得到响应时会断开连接。
|
|
|
int keep_alive = 1;
|
|
|
int keep_idle = 60;
|
|
|
int keep_interval = 6;
|
|
|
int keep_count = 40;
|
|
|
if (setsockopt(debug_ctrl.fd_client, SOL_SOCKET, SO_KEEPALIVE, &keep_alive, sizeof(keep_alive)))
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "Error setsockopt(SO_KEEPALIVE) failed, return %s!", safe_strerror(errno));
|
|
|
return NULL;
|
|
|
}
|
|
|
if (setsockopt(debug_ctrl.fd_client, IPPROTO_TCP, TCP_KEEPIDLE, &keep_idle, sizeof(keep_idle)))
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "Error setsockopt(TCP_KEEPIDLE) failed, return %s!", safe_strerror(errno));
|
|
|
return NULL;
|
|
|
}
|
|
|
if (setsockopt(debug_ctrl.fd_client, SOL_TCP, TCP_KEEPINTVL, (void *)&keep_interval, sizeof(keep_interval)))
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "Error setsockopt(TCP_KEEPINTVL) failed, return %s!", safe_strerror(errno));
|
|
|
return NULL;
|
|
|
}
|
|
|
if (setsockopt(debug_ctrl.fd_client, SOL_TCP, TCP_KEEPCNT, (void *)&keep_count, sizeof(keep_count)))
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "Error setsockopt(TCP_KEEPCNT) failed, return %s!", safe_strerror(errno));
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
/* 读取数据. */
|
|
|
len = read(debug_ctrl.fd_client, buf, len_recv);
|
|
|
if (len <= 0)
|
|
|
{
|
|
|
/* 连接中断, 关闭 socket 和手动采样. */
|
|
|
DBG(DBG_M_DEBUG, "Read len %d, close fd!\r\n", len);
|
|
|
debug_ctrl.is_manual_col = FALSE;
|
|
|
close(debug_ctrl.fd_client);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
/* 粘包处理. */
|
|
|
len_pkt = _debug_pkt_recv_adhesion(buf, len, &len_recv);
|
|
|
if (len_pkt <= 0)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
_debug_pkt_process(buf_cmd, len_pkt);
|
|
|
len_recv = DEBUG_BUG_SIZE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
/* 用于定时将端口的状态发送给调试软件. */
|
|
|
void* _debug_port_state_get(void *arg)
|
|
|
{
|
|
|
/* 如果手动采样开启, 则发送数据. */
|
|
|
if (debug_ctrl.is_manual_col)
|
|
|
{
|
|
|
dau_port_state_get(NULL);
|
|
|
}
|
|
|
|
|
|
/* 重新加入定时器. */
|
|
|
mtimer_add(_debug_port_state_get, NULL, 1, "DEBUG_PORT_STATE_GET");
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
/* Interface functions -------------------------------------------------------*/
|
|
|
/* 调试工具初始化. */
|
|
|
int32_t debug_handle_init(void)
|
|
|
{
|
|
|
struct sockaddr_in server;
|
|
|
struct sched_param param;
|
|
|
pthread_attr_t attr;
|
|
|
pthread_t pid;
|
|
|
int32_t rv = 0;
|
|
|
int fd = 0;
|
|
|
int opt = 1;
|
|
|
|
|
|
/* 创建 socket. */
|
|
|
fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
if (fd < 0)
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "ERROR at socket create return %s!", safe_strerror(errno));
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
|
|
|
/* fd 为需要端口复用的套接字. */
|
|
|
opt = 1;
|
|
|
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
|
|
|
|
|
|
/* 绑定端口. */
|
|
|
bzero(&server, sizeof(server));
|
|
|
server.sin_family = AF_INET;
|
|
|
server.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
server.sin_port = htons(DEBUG_MANAGE_TOOL_PORT);
|
|
|
if(bind(fd, (struct sockaddr*)&server, sizeof(server)) < 0)
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "ERROR at socket bind return %s!", safe_strerror(errno));
|
|
|
close(fd);
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
|
|
|
/* 保存数据. */
|
|
|
debug_ctrl.fd = fd;
|
|
|
|
|
|
/* 初始化报文处理线程. */
|
|
|
/* 配置线程RR调度, 优先级25. */
|
|
|
pthread_attr_init(&attr);
|
|
|
param.sched_priority = 25;
|
|
|
pthread_attr_setschedpolicy(&attr, SCHED_RR);
|
|
|
pthread_attr_setschedparam(&attr, ¶m);
|
|
|
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
|
|
|
rv = pthread_create(&pid, &attr, _debug_pkt_recv_handle, NULL);
|
|
|
if (rv != 0)
|
|
|
{
|
|
|
log_err(LOG_DEBUG, "PD can't create debug pthread %d!", rv);
|
|
|
return E_SYS_CALL;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
thread_m_add("PD_DEBUG", pid);
|
|
|
}
|
|
|
pthread_attr_destroy(&attr);
|
|
|
|
|
|
/* 每秒上传 DAU 状态寄存器. */
|
|
|
mtimer_add(_debug_port_state_get, NULL, 1, "DEBUG_PORT_STATE_GET");
|
|
|
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
/* 数据手动上传报文处理. */
|
|
|
int32_t debug_pkt_port_state_post(void)
|
|
|
{
|
|
|
char *buf = debug_ctrl.buf_post;
|
|
|
debug_pkt_port_t *data = (debug_pkt_port_t *)(buf + sizeof(debug_pkt_head_t));
|
|
|
uint8_t i = 0;
|
|
|
uint8_t unit = 0;
|
|
|
uint8_t port = 0;
|
|
|
|
|
|
if (!debug_ctrl.is_manual_col)
|
|
|
{
|
|
|
return E_NONE;
|
|
|
}
|
|
|
|
|
|
for(i = 0; i < PD_PORT_SUM; i++)
|
|
|
{
|
|
|
if (E_NONE == dau_vport_to_port(i + 1, &unit, &port))
|
|
|
{
|
|
|
data->vport[i].value_adc = dau[unit]->port_state_reg.MSRR[port];
|
|
|
data->vport[i].value_adj = dau[unit]->port_state_reg.AVR[port];
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
data->vport[i].value_adc = 0;
|
|
|
data->vport[i].value_adj = -800;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 发送数据. */
|
|
|
return _debug_pkt_common_send(buf, DEBUG_NOISE_POST, sizeof(debug_pkt_port_t));
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
/************************ (C) COPYRIGHT LandPower ***** END OF FILE ****************/
|