Files

220 lines
10 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _BS_OCPP_CTRL_H_
#define _BS_OCPP_CTRL_H_
#include "publicdata/type.h"
#include "publicdata/public_define.h"
#if BS_OCPP_EN //OCPP平台使能
#include "bs_ocpp_json_data.h"
#include "meter_calculate/meter_calculate_impl.h"
#include "publicdata/publicdata.h"
#include "main.h"
#include "flash_file_mgr/ocpp_mv_offline_flash_impl.h"
#define OCPP_TIMERCNT_NUM 12 //ocpp 计时计数
#define OCPP_ACK_STRUCT_NUM 5 //ocpp 应答结构体数量
#define OCPP_MALLOC pvPortMalloc
#define OCPP_FREE vPortFree
typedef enum{
OCPP_TIMER_BootNotification = 0, //登录帧
OCPP_TIMER_Heartbeat, //心跳帧
OCPP_TIMER_StatusNotification_GUNA, //A枪 状态上传
OCPP_TIMER_StatusNotification_GUNB, //B枪 状态上传
OCPP_TIMER_MeterValues_GUNA, //A枪电表数据上传
OCPP_TIMER_MeterValues_GUNB, //B枪电表数据上传
OCPP_TIMER_StopTransaction_GUNA, //A枪停止充电数据上传
OCPP_TIMER_StopTransaction_GUNB, //B枪停止充电数据上传
OCPP_TIMER_Authorize_GUNA, //A枪鉴权查询上传
OCPP_TIMER_Authorize_GUNB, //B枪鉴权查询上传
}OCPP_SEND_TIMER;
typedef enum{
OCPP_STATE_CHANGE_FLAG = 0, //状态变位标志
OCPP_TRADE_UPLOAD_FLAG, //交易订单上传标志
OCPP_START_RESULT_FLAG, //启动结果上送标志
OCPP_STOP_RESULT_FLAG, //停止结果上送标志
OCPP_VIN_START_FLAG, //VIN鉴权请求上送标志
OCPP_VIN_RESULT, //VIN鉴权结果
OCPP_BILL_INDEX, //上送订单索引号
}OCPP_CHARGE_FLAG;
/** DiagnosticsStatusNotification 待上送状态:外部/FTP 仅赋值;ocpp_send_mag_ctrl 监听非 0 则发送并清 0 */
typedef enum {
OCPP_DIAG_NOTIFY_PENDING_NONE = 0,
OCPP_DIAG_NOTIFY_PENDING_UPLOADING,
OCPP_DIAG_NOTIFY_PENDING_UPLOADED,
OCPP_DIAG_NOTIFY_PENDING_UPLOAD_FAILED,
} OCPP_DIAG_NOTIFY_PENDING_E;
/** FirmwareStatusNotification 待上送状态:与 Diagnostics 同套路(u8_*_notify_pending + ocpp_send_mag_ctrl */
typedef enum {
OCPP_FW_NOTIFY_PENDING_NONE = 0,
OCPP_FW_NOTIFY_PENDING_DOWNLOADING,
OCPP_FW_NOTIFY_PENDING_DOWNLOADED,
OCPP_FW_NOTIFY_PENDING_INSTALLING,
OCPP_FW_NOTIFY_PENDING_INSTALLED,
OCPP_FW_NOTIFY_PENDING_DOWNLOAD_FAILED,
OCPP_FW_NOTIFY_PENDING_INSTALLATION_FAILED,
} OCPP_FW_NOTIFY_PENDING_E;
typedef struct
{
U8_T flag; //存储标志
U8_T check_count; //查询次数
U8_T gunNo; //抢号
U16_T u16_cnt; /* 存储计数(回绕安全:v_clear_save_cmd 基于 max-min 差值检测回绕)*/
OCPP_CMD cmd; //命令值
char key[64]; //随机数密钥
}OCPP_DATA_SAVE;
typedef struct
{
OCPP_CMD cmd; //命令值
U8_T gunNo; //枪号
U8_T type; //应答数据类型 不同帧自定义
U8_T timer_cnt; //计时计数 用于超时判定
char ack_key[64]; //回复相同秘钥
char ack_data[32]; //应答数据内容 不同帧自定义
}OCPP_DATA_RECV_ACK;
/** 未结补单:先 Authorize 再 StartTransaction 的鉴权阶段 */
typedef enum {
OCPP_UNSETTLED_AUTH_NONE = 0,
OCPP_UNSETTLED_AUTH_WAIT,
OCPP_UNSETTLED_AUTH_OK
} OCPP_UNSETTLED_AUTH_PHASE_E;
typedef struct
{
U8_T id; //平台id 0-1
U8_T u8_register_flag; //登录标志
U8_T u8_ping_ack; //ping包回复标志
U8_T u8_unsettled_order_flag; //离线订单上送检查
U8_T u8_reboot_flag; //重启标志 0无动作 1平台下发重启 2本地重启
U8_T u8_log_file_upload; //日志文件上传标志
U8_T u8_diag_notify_pending; //见 OCPP_DIAG_NOTIFY_PENDING_E,仅赋值触发;发送在 ocpp_send_mag_ctrl
U8_T u8_fw_notify_pending; //见 OCPP_FW_NOTIFY_PENDING_E,与 u8_diag_notify_pending 并列、同发送机制
U8_T u8_fw_reboot_pending; //Installed 已成功上送后再 v_sys_reboot(避免未上报即复位)
U8_T u8_fw_installing_fsn_sent; //FSN(Installing) 已 sm>0 发出;STEP_FTP_SAVE 写头/复位前须为 1
S_LOG_DATA *s_unsettled_order_data;
U8_T u8_unsettled_auth_phase; // 未结补单:Authorize→StartTransaction 流水线阶段,取值见 OCPP_UNSETTLED_AUTH_PHASE_E
U32_T u32_unsettled_last_auth_s; // 未结补单:上次发出 Authorize 的秒时间戳(get_current_seconds),用于发送节流
U32_T u32_unsettled_last_stx_s; // 未结补单:上次发出 StartTransaction 的秒时间戳(get_current_seconds),用于发送节流
struct
{
U8_T u8_MeterValues_type; //数据上送标志 0无动作 1空闲数据上送 2充电中数据上送 3交易开始数据上送 4交易停止数据上送
//平台召测数据 "BootNotification","DiagnosticsStatusNotification","FirmwareStatusNotification","Heartbeat","MeterValues","StatusNotification"
U8_T u8_get_Trigger_BootNotification;
U8_T u8_get_Trigger_DiagnosticsStatusNotification;
U8_T u8_get_Trigger_FirmwareStatusNotification;
U8_T u8_get_Trigger_Heartbeat;
U8_T u8_get_Trigger_MeterValues;
U8_T u8_get_Trigger_StatusNotification;
U8_T u8_aut_cnt; //鉴权次数
U8_T u8_StatusNotification_send_cnt; //状态上传次数(保留,周期上送已取消)
U8_T u8_need_status_after_login; // BootNotification Accepted/Pending 后每枪需上送一次 StatusNotification
U8_T s_u8_mv_ws_fail_snap_req; /** MeterValues ws 发送失败时置位,下一周期强制写一条离线 MV */
int s_ocpp_live_stop_tx_id; /** 在线已上送 StopTransaction 的 transactionId(按枪),-1 表示无 */
}s_ctrl_flag[GUN_MAX_CNT]; //数据控制标志
struct
{
U16_T u16_timerCnt; //周期发送计数
U16_T u16_timeNUM ; //计数周期值
}s_timerCnt[OCPP_TIMERCNT_NUM];
U16_T u16_ocpp_ping_timer; //ping包周期计数
U32_T u32_timer; //计时计数
ULONG ulong_timer; //接收计时
OCPP_DATA_RECV_ACK *ack_ctrl[OCPP_ACK_STRUCT_NUM];
}OCPP_DATA_CTRL;
int recv_mags(char* recv_mag);
/****************************************************
*函数名称: v_ocpp_init_data()
*功能说明: OCPP 应用层全量初始化:`v_ocpp_mv_offline_init`、清 OCPP_DATA_CTRL、Flash 配置与定时器、再走联网恢复(含 4G)
*参数说明:
* 上电由平台主任务调用;TCP 长时间连不上时亦调用本函数;diag/fw 等 pending 随 memset 清零
****************************************************/
void v_ocpp_init_data(U8_T bs_flag);
/** 仅联网恢复:释放应答、可选 v_bs_4G_data_init、fd=-1、ulong_restart_timer;不执行 memset(OCPP_DATA_CTRL) */
void v_ocpp_init_data_ex(U8_T bs_flag, U8_T reset_4g_modem);
/****************************************************
*函数名称: v_ocpp_tcp_connect()
*功能说明: TCP连接功能实现 - 配置4G模块
*参数说明:
* 输入参数:
* 输出参数: 0失败 1成功
****************************************************/
U8_T v_ocpp_tcp_connect();
/****************************************************
*函数名称: v_ocpp_logo_on()
*功能说明: 平台桩信息登录 -
*参数说明:
* 输入参数:
* 输出参数: 0失败 1成功
****************************************************/
U8_T v_ocpp_logo_on();
/****************************************************
*函数名称: v_ocpp_recv_data()
*功能说明: 数据接收处理 -
*参数说明:
* 输入参数:
* 输出参数:
****************************************************/
void v_ocpp_recv_data();
/****************************************************
*函数名称: v_ocpp_send_ctrl()
*功能说明: sdk私有协议逻辑控制 -
*参数说明:
* 输入参数:
* 输出参数:
****************************************************/
void v_ocpp_send_ctrl();
/****************************************************
*函数名称: v_ocpp_private_logic()
*功能说明: sdk私有协议逻辑控制 -
*参数说明:
* 输入参数:
* 输出参数:
****************************************************/
void v_ocpp_private_logic(U8_T bs_flag);
/** 仅置 u8_diag_notify_pendingUploaded / UploadFailed);实际上送由 ocpp_send_mag_ctrl 监听该变量完成 */
void v_ocpp_set_diag_upload_notify_pending(U8_T pending);
/** 置 u8_fw_notify_pending;合法值见 OCPP_FW_NOTIFY_PENDING_E;实际上送由 ocpp_send_mag_ctrl */
void v_ocpp_set_fw_notify_pending(U8_T pending);
/** FSN(Installing) 是否已由 ocpp_send_mag_ctrl 成功发出(供 ec200a STEP_FTP_SAVE 等待) */
U8_T u8_ocpp_fw_installing_fsn_sent(void);
void v_ocpp_clr_fw_installing_fsn_sent(void);
/** Installed 上送成功后需复位:置位,由 ocpp_send_mag_ctrl 在 FSN(Installed) 发出后调用 v_sys_reboot(旧流程;FTP 升级现改 EEPROM+先复位) */
void v_ocpp_set_fw_reboot_after_installed(U8_T pending);
/** FTP 写升级头后:FRAM 置位,复位;BootNotification Accepted/Pending 后再发 FSN Installed */
void v_ocpp_fw_eeprom_set_installed_after_boot(void);
/** 在线会话已上送 StopTransaction(如 Remote)后登记 txId,避免 EEPROM 掉电单重复 StopTx PowerLoss */
void v_ocpp_mark_live_stop_tx_done(U8_T gun_idx, int transaction_id);
/** 未结/掉电补单是否应跳过(同枪同 txId 已在线停充上送) */
U8_T u8_ocpp_skip_unsettled_stop_for_live_tx(S_LOG_DATA *log);
/** 未结单与当前枪正在进行的在线充电为同一会话(勿 StopTx / 勿抢 session MV 补发) */
U8_T u8_ocpp_unsettled_is_live_charging_session(S_LOG_DATA *log);
/** 未结订单:preTradeNo 是否仍为占位/空(须先 Authorize→StartTransaction */
U8_T u8_ocpp_is_pre_trade_no_pending(const U8_T *p);
/** 补发一条离线缓存的 MeterValues(与 send_mag 主动帧格式一致) */
int32_t s32_ocpp_send_meter_values_replay(int gunNo, int transactionId, const S_OCPP_MV_OFFLINE_MV *mv);
#endif
#endif