fix error in recall when hours more than 300
This commit is contained in:
@@ -2183,11 +2183,76 @@ int parse_file_names_by_fltnum(int fltnum, char* domname, char** filenames, int
|
|||||||
//WW2023-11-01 end
|
//WW2023-11-01 end
|
||||||
|
|
||||||
//补招部分////////////////////////////////////////////////////////////////////////////////
|
//补招部分////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////20250801
|
||||||
|
/* 最小块,每次至少扩容这么多;也可以调大一点 */
|
||||||
|
#define RECALL_CHUNK 64
|
||||||
|
|
||||||
|
/* 初始化 */
|
||||||
|
void recall_xml_init(recall_xml_t *rx) // ★
|
||||||
|
{
|
||||||
|
rx->work_cnt = rx->work_cap = 0;
|
||||||
|
rx->new_cnt = rx->new_cap = 0;
|
||||||
|
rx->work_recalls = rx->new_recalls = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 若需要,扩容 `*arr` 直到能放下 needed 条记录 */
|
||||||
|
static int ensure_cap(recall_t **arr, int *cap, int need)
|
||||||
|
{
|
||||||
|
if (need <= *cap) return 0;
|
||||||
|
|
||||||
|
int new_cap = (*cap) ? (*cap) : 16;
|
||||||
|
while (new_cap < need) new_cap <<= 1;
|
||||||
|
|
||||||
|
/* C++ 里要显式转换 */
|
||||||
|
void *mem = realloc(*arr, new_cap * sizeof(recall_t));
|
||||||
|
if (!mem) return -1;
|
||||||
|
|
||||||
|
*arr = static_cast<recall_t *>(mem); // ★ 显式 static_cast
|
||||||
|
*cap = new_cap;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* push 到 work / new 数组 */
|
||||||
|
static int push_work(recall_xml_t *rx, const recall_t *rec)
|
||||||
|
{
|
||||||
|
if (ensure_cap(&rx->work_recalls, &rx->work_cap, rx->work_cnt + 1))
|
||||||
|
return -1;
|
||||||
|
rx->work_recalls[rx->work_cnt++] = *rec;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int push_new(recall_xml_t *rx, const recall_t *rec)
|
||||||
|
{
|
||||||
|
if (ensure_cap(&rx->new_recalls, &rx->new_cap, rx->new_cnt + 1))
|
||||||
|
return -1;
|
||||||
|
rx->new_recalls[rx->new_cnt++] = *rec;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 释放内存(栈退出前或不用时调用) */
|
||||||
|
void recall_xml_free(recall_xml_t *rx) // ★
|
||||||
|
{
|
||||||
|
for (int i = 0; i < rx->work_cnt; ++i)
|
||||||
|
free(rx->work_recalls[i].line_id);
|
||||||
|
for (int i = 0; i < rx->new_cnt; ++i)
|
||||||
|
free(rx->new_recalls[i].line_id);
|
||||||
|
|
||||||
|
free(rx->work_recalls);
|
||||||
|
free(rx->new_recalls);
|
||||||
|
|
||||||
|
recall_xml_init(rx); /* 复位为全 0,防止悬挂指针 */
|
||||||
|
}
|
||||||
|
////////////////////////////20250801
|
||||||
|
|
||||||
void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& recall_e, char* id)
|
void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& recall_e, char* id)
|
||||||
{
|
{
|
||||||
recall_t recall;
|
//recall_t recall;//lnk20250801
|
||||||
|
|
||||||
recall.line_id = id;
|
//recall.line_id = id;
|
||||||
|
|
||||||
|
recall_t recall = {0};
|
||||||
|
|
||||||
|
recall.line_id = strdup(id); /* malloc 字符串 */
|
||||||
|
|
||||||
QDateTime start_dt = QDateTime::fromString(recall_e.attribute("StartTime"), "yyyy-MM-dd hh:mm:ss");
|
QDateTime start_dt = QDateTime::fromString(recall_e.attribute("StartTime"), "yyyy-MM-dd hh:mm:ss");
|
||||||
recall.start_time = start_dt.toMSecsSinceEpoch() / 1000;
|
recall.start_time = start_dt.toMSecsSinceEpoch() / 1000;
|
||||||
@@ -2201,10 +2266,12 @@ void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& reca
|
|||||||
<< " " << recall.start_time << " " << recall.end_time;
|
<< " " << recall.start_time << " " << recall.end_time;
|
||||||
|
|
||||||
if (parentTag == "Work") {
|
if (parentTag == "Work") {
|
||||||
recall_xml->work_recalls[recall_xml->work_recall_num++] = recall;
|
//recall_xml->work_recalls[recall_xml->work_recall_num++] = recall;
|
||||||
|
push_work(recall_xml, &recall);
|
||||||
}
|
}
|
||||||
else if (parentTag == "New") {
|
else if (parentTag == "New") {
|
||||||
recall_xml->new_recalls[recall_xml->new_recall_num++] = recall;
|
//recall_xml->new_recalls[recall_xml->new_recall_num++] = recall;
|
||||||
|
push_new(recall_xml, &recall);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2295,7 +2362,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
|
|||||||
return APR_SUCCESS;
|
return APR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_recall_config(recall_xml_t* recall_xml)
|
/*void process_recall_config(recall_xml_t* recall_xml)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
recall_t* recall;
|
recall_t* recall;
|
||||||
@@ -2328,13 +2395,18 @@ void process_recall_config(recall_xml_t* recall_xml)
|
|||||||
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) { //
|
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) { //
|
||||||
if (LD_info->autorecallcount != 0) {
|
if (LD_info->autorecallcount != 0) {
|
||||||
for (int j = 0; j < LD_info->autorecallcount; j++) {
|
for (int j = 0; j < LD_info->autorecallcount; j++) {
|
||||||
delete LD_info->autorecall[j];
|
delete[] LD_info->autorecall[j];//避免重复释放lnk20250801
|
||||||
}
|
}
|
||||||
delete LD_info->autorecall;
|
delete LD_info->autorecall;
|
||||||
LD_info->autorecallcount = 0;
|
LD_info->autorecallcount = 0;
|
||||||
}
|
}
|
||||||
LD_info->autorecallcount = recall_num;
|
LD_info->autorecallcount = recall_num;
|
||||||
LD_info->autorecall = new autorecall_t * [recall_num];
|
LD_info->autorecall = new autorecall_t * [recall_num];
|
||||||
|
|
||||||
|
for (int k = 0; k < recall_num; ++k) {
|
||||||
|
LD_info->autorecall[k] = nullptr; //避免野指针lnk20250801
|
||||||
|
}
|
||||||
|
|
||||||
for (int j = 0; j < recall_num; j++) {
|
for (int j = 0; j < recall_num; j++) {
|
||||||
printf("\n %d ===== %d\n", recall[j].start_time, recall[j].end_time);
|
printf("\n %d ===== %d\n", recall[j].start_time, recall[j].end_time);
|
||||||
LD_info->autorecall[j] = new autorecall_t[1];
|
LD_info->autorecall[j] = new autorecall_t[1];
|
||||||
@@ -2352,10 +2424,104 @@ void process_recall_config(recall_xml_t* recall_xml)
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//调试
|
||||||
|
printf("== autorecall count = %d ==\n", LD_info->autorecallcount);
|
||||||
|
for (int j = 0; j < LD_info->autorecallcount; ++j) {
|
||||||
|
if (LD_info->autorecall[j] == nullptr) {
|
||||||
|
printf("autorecall[%d] = nullptr !!!\n", j);
|
||||||
|
} else {
|
||||||
|
printf("autorecall[%d] = %p | start = %d, end = %d\n",
|
||||||
|
j, LD_info->autorecall[j],
|
||||||
|
LD_info->autorecall[j]->start, LD_info->autorecall[j]->end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}*/
|
||||||
|
void process_recall_config(recall_xml_t *rx)
|
||||||
|
{
|
||||||
|
if (rx->new_cnt) {
|
||||||
|
/* 预留空间 */
|
||||||
|
if (ensure_cap(&rx->work_recalls, &rx->work_cap,
|
||||||
|
rx->work_cnt + rx->new_cnt))
|
||||||
|
return; /* 内存不足,直接返回 */
|
||||||
|
|
||||||
|
memcpy(&rx->work_recalls[rx->work_cnt],
|
||||||
|
rx->new_recalls,
|
||||||
|
rx->new_cnt * sizeof(recall_t));
|
||||||
|
rx->work_cnt += rx->new_cnt;
|
||||||
|
rx->new_cnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* work 列表为空,直接结束 */
|
||||||
|
if (rx->work_cnt == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
recall_t *recall = rx->work_recalls;
|
||||||
|
int recall_num = rx->work_cnt;
|
||||||
|
|
||||||
|
LD_info_t *LD_info = find_LD_info_only_from_mp_id(recall[0].line_id);
|
||||||
|
printf("\n recall[0].line_id == %s \n", recall[0].line_id);
|
||||||
|
printf("\n recall[0].start_time == %lld \n", recall[0].start_time);
|
||||||
|
|
||||||
|
if (!LD_info || LD_info->read_flag == 0) {
|
||||||
|
printf("\n Find LD_info == null \n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n Find LD_info != null \n");
|
||||||
|
|
||||||
|
/* 若正在补招中则跳过;否则装载新补招队列 */
|
||||||
|
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) {
|
||||||
|
|
||||||
|
/* 先释放旧队列 */
|
||||||
|
if (LD_info->autorecallcount != 0) {
|
||||||
|
for (int j = 0; j < LD_info->autorecallcount; ++j)
|
||||||
|
delete[] LD_info->autorecall[j]; /* 原逻辑 */
|
||||||
|
delete LD_info->autorecall;
|
||||||
|
LD_info->autorecallcount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 重新分配新队列,大小 = recall_num */
|
||||||
|
LD_info->autorecallcount = recall_num;
|
||||||
|
LD_info->autorecall = new autorecall_t*[recall_num];
|
||||||
|
|
||||||
|
for (int k = 0; k < recall_num; ++k)
|
||||||
|
LD_info->autorecall[k] = nullptr;
|
||||||
|
|
||||||
|
for (int j = 0; j < recall_num; ++j) {
|
||||||
|
LD_info->autorecall[j] = new autorecall_t[1];
|
||||||
|
LD_info->autorecall[j]->start = recall[j].start_time;
|
||||||
|
LD_info->autorecall[j]->end = recall[j].end_time;
|
||||||
|
LD_info->autorecall[j]->need_steady = recall[j].need_steady;
|
||||||
|
LD_info->autorecall[j]->need_voltage = recall[j].need_voltage;
|
||||||
|
|
||||||
|
printf("\n %lld ===== %lld\n",
|
||||||
|
recall[j].start_time, recall[j].end_time);
|
||||||
|
}
|
||||||
|
LD_info->autorecallflag = 0; /* 重置“正在补招”标志 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 调试输出 */
|
||||||
|
if(DEBUGOPEN){
|
||||||
|
printf("== autorecall count = %d ==\n", LD_info->autorecallcount);
|
||||||
|
for (int j = 0; j < LD_info->autorecallcount; ++j) {
|
||||||
|
if (!LD_info->autorecall[j])
|
||||||
|
printf("autorecall[%d] = nullptr !!!\n", j);
|
||||||
|
else
|
||||||
|
printf("autorecall[%d] = %p | start = %lld, end = %lld\n",
|
||||||
|
j, LD_info->autorecall[j],
|
||||||
|
LD_info->autorecall[j]->start,
|
||||||
|
LD_info->autorecall[j]->end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void WebSocketThread::run()
|
void WebSocketThread::run()
|
||||||
@@ -5881,7 +6047,7 @@ void clearLDInfo(LD_info_t *ld_info) {
|
|||||||
for (int i = 0; i < ld_info->autorecallcount; ++i) {
|
for (int i = 0; i < ld_info->autorecallcount; ++i) {
|
||||||
if (ld_info->autorecall[i] != nullptr) {
|
if (ld_info->autorecall[i] != nullptr) {
|
||||||
memset(ld_info->autorecall[i], 0, sizeof(autorecall_t));
|
memset(ld_info->autorecall[i], 0, sizeof(autorecall_t));
|
||||||
delete ld_info->autorecall[i]; //删除数组元素空间,如果有正在补招的内容,则已经申请空间,需要释放
|
delete[] ld_info->autorecall[i]; //删除数组元素空间,如果有正在补招的内容,则已经申请空间,需要释放lnk20250801
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete ld_info->autorecall; //删除数组空间
|
delete ld_info->autorecall; //删除数组空间
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ mqconsumerThread mqconsumerThrd;//mq消费者线程lnk20241213
|
|||||||
|
|
||||||
OnTimerThread onTimerThrd;//定时线程
|
OnTimerThread onTimerThrd;//定时线程
|
||||||
|
|
||||||
extern int g_iSqlListSize; //Sql执行语句链表允许最大元素个数 注:Sql链表中元素超过此个数,多出元素需移除!
|
|
||||||
extern int FILE_FLAG;
|
extern int FILE_FLAG;
|
||||||
extern int SEND_FLAG;
|
extern int SEND_FLAG;
|
||||||
extern char* BROKER_LIST;
|
extern char* BROKER_LIST;
|
||||||
|
|||||||
@@ -696,7 +696,7 @@ void process_3s_config(trigger_3s_xml_t *trigger_3s_xml)
|
|||||||
create_3s_xml(trigger_3s_xml); //写入文件的work块
|
create_3s_xml(trigger_3s_xml); //写入文件的work块
|
||||||
}
|
}
|
||||||
|
|
||||||
void del_process_recall_config(recall_xml_t* recall_xml)
|
/*void del_process_recall_config(recall_xml_t* recall_xml)
|
||||||
{
|
{
|
||||||
int i,j;
|
int i,j;
|
||||||
recall_t *recall;
|
recall_t *recall;
|
||||||
@@ -733,7 +733,7 @@ void del_process_recall_config(recall_xml_t* recall_xml)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}*/
|
||||||
|
|
||||||
void check_3s_config()
|
void check_3s_config()
|
||||||
{
|
{
|
||||||
@@ -1402,9 +1402,14 @@ void Check_Recall_Config(char *id) //检查补招配置文件Recall.xml
|
|||||||
if (g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) {
|
if (g_node_id == HIS_DATA_BASE_NODE_ID || g_node_id == NEW_HIS_DATA_BASE_NODE_ID || g_node_id == RECALL_HIS_DATA_BASE_NODE_ID || (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID)) {
|
||||||
|
|
||||||
recall_xml_t recall_xml;
|
recall_xml_t recall_xml;
|
||||||
memset((char*)&recall_xml, 0, sizeof(recall_xml_t));
|
//memset((char*)&recall_xml, 0, sizeof(recall_xml_t));
|
||||||
|
|
||||||
|
recall_xml_init(&recall_xml);
|
||||||
|
|
||||||
parse_recall_xml(&recall_xml,id); //解析补招文件,目录下所有属于这个监测点的文件都读取
|
parse_recall_xml(&recall_xml,id); //解析补招文件,目录下所有属于这个监测点的文件都读取
|
||||||
process_recall_config(&recall_xml); //解析的补招数据赋值到全局变量
|
process_recall_config(&recall_xml); //解析的补招数据赋值到全局变量
|
||||||
|
|
||||||
|
recall_xml_free(&recall_xml);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
|
|||||||
|
|
||||||
extern pt61850app_t* g_pt61850app;
|
extern pt61850app_t* g_pt61850app;
|
||||||
|
|
||||||
|
extern bool DEBUGOPEN;
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/* Static function prototypes. */
|
/* Static function prototypes. */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
@@ -126,7 +128,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
|
|||||||
|
|
||||||
double start, end;
|
double start, end;
|
||||||
static double last_check_recall_config_time = 0.0;
|
static double last_check_recall_config_time = 0.0;
|
||||||
printf("\nbrf for");
|
if(DEBUGOPEN)printf("\nbrf for");
|
||||||
for (j = 0; j < jou_entry->ef.data.num_of_var; j++) {
|
for (j = 0; j < jou_entry->ef.data.num_of_var; j++) {
|
||||||
|
|
||||||
printf("\nfor %d", jou_entry->ef.data.num_of_var);
|
printf("\nfor %d", jou_entry->ef.data.num_of_var);
|
||||||
@@ -146,7 +148,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
|
|||||||
do_name++;
|
do_name++;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\nbrf if");
|
if(DEBUGOPEN)printf("\nbrf if");
|
||||||
if (sel_mvl_type_ctrl_flag(do_name) == -1)
|
if (sel_mvl_type_ctrl_flag(do_name) == -1)
|
||||||
{
|
{
|
||||||
var_type_id = mms_var_type_id_create(clientNetInfo, DOM_SPEC,
|
var_type_id = mms_var_type_id_create(clientNetInfo, DOM_SPEC,
|
||||||
@@ -157,15 +159,15 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t,
|
|||||||
add_mvl_type_ctrl(doname, var_type_id);
|
add_mvl_type_ctrl(doname, var_type_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
printf("\nbrf var_type_id");
|
if(DEBUGOPEN)printf("\nbrf var_type_id");
|
||||||
var_type_id = sel_mvl_type_ctrl_flag(do_name);
|
var_type_id = sel_mvl_type_ctrl_flag(do_name);
|
||||||
printf("\nafter var_type_id");
|
if(DEBUGOPEN)printf("\nafter var_type_id");
|
||||||
|
|
||||||
if (var_type_id < 0) {
|
if (var_type_id < 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
log_var_jou_data(var_type_id,&(jou_entry->ef.data.list_of_var[j].value_spec),&mms_dec_data, do_name);
|
log_var_jou_data(var_type_id,&(jou_entry->ef.data.list_of_var[j].value_spec),&mms_dec_data, do_name);
|
||||||
printf("\nafter log_var_jou_data");
|
if(DEBUGOPEN)printf("\nafter log_var_jou_data");
|
||||||
if (timeflag) {
|
if (timeflag) {
|
||||||
int readtime = 0;
|
int readtime = 0;
|
||||||
int readquailty = 0;
|
int readquailty = 0;
|
||||||
|
|||||||
@@ -144,13 +144,19 @@ struct recall_t{
|
|||||||
int need_voltage;
|
int need_voltage;
|
||||||
};
|
};
|
||||||
typedef struct recall_xml_t recall_xml_t;
|
typedef struct recall_xml_t recall_xml_t;
|
||||||
struct recall_xml_t{
|
/*struct recall_xml_t{
|
||||||
int work_recall_num;
|
int work_recall_num;
|
||||||
int new_recall_num;
|
int new_recall_num;
|
||||||
recall_t work_recalls[MAX_RECALL_NUM];
|
recall_t work_recalls[MAX_RECALL_NUM];
|
||||||
recall_t new_recalls[MAX_RECALL_NUM];
|
recall_t new_recalls[MAX_RECALL_NUM];
|
||||||
|
};*/
|
||||||
|
/* 动态数组 + 容量字段 lnk20250801*/
|
||||||
|
struct recall_xml_t{
|
||||||
|
int work_cnt, work_cap;
|
||||||
|
int new_cnt , new_cap;
|
||||||
|
recall_t *work_recalls;
|
||||||
|
recall_t *new_recalls;
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////
|
||||||
struct element_usr_t{
|
struct element_usr_t{
|
||||||
char* FCD_ref;
|
char* FCD_ref;
|
||||||
@@ -494,6 +500,9 @@ int delete_recall_xml(char* id);
|
|||||||
int parse_recall_xml(recall_xml_t* recall_xml,char *id);
|
int parse_recall_xml(recall_xml_t* recall_xml,char *id);
|
||||||
void process_recall_config(recall_xml_t* recall_xml);
|
void process_recall_config(recall_xml_t* recall_xml);
|
||||||
|
|
||||||
|
void recall_xml_free(recall_xml_t *rx);//lnk20250801
|
||||||
|
void recall_xml_init(recall_xml_t *rx);
|
||||||
|
|
||||||
int init_rptctrl_by_count(LD_info_t* LD_info,int rptcount);
|
int init_rptctrl_by_count(LD_info_t* LD_info,int rptcount);
|
||||||
int fill_rptctrl_by_cfg(LD_info_t* LD_info,int rptno,char *buf);
|
int fill_rptctrl_by_cfg(LD_info_t* LD_info,int rptno,char *buf);
|
||||||
int init_logctrl_by_count(LD_info_t* LD_info,int logcount);
|
int init_logctrl_by_count(LD_info_t* LD_info,int logcount);
|
||||||
|
|||||||
Reference in New Issue
Block a user