Files
chrg/apps/chrg/applications/utils/chrg_pkg.c
T
2025-10-25 23:44:23 +08:00

147 lines
2.3 KiB
C

#include <string.h>
#include <rtthread.h>
#include "chrg_north.h"
#include "chrg_south.h"
#include "chrg_pkg.h"
#include "chrg_utils.h"
int chrg_pkg_encode (eIDX_ID id, rt_uint8_t cmd, rt_uint8_t *data_in,
rt_uint8_t len_in, rt_uint8_t *data_out, rt_uint16_t *len_out)
{
if (RT_NULL == data_out) {
return -1;
}
if ((len_in > 0) && (RT_NULL == data_in)) {
return -1;
}
data_out[0] = 5+len_in;
data_out[1] = 0x00;
data_out[2] = id;
data_out[3] = cmd;
if (len_in > 0) {
memcpy(&data_out[4], data_in, len_in);
}
data_out[len_in+4] = calc_crc8(data_out, len_in+4);
*len_out = 5+len_in;
return 0;
}
int chrg_pkg_decode (rt_uint8_t *data, rt_uint16_t length, struct chrg_switch_t *pSW)
{
if ((RT_NULL == data)||(RT_NULL == pSW)||(length < 5)) {
return -1;
}
rt_uint8_t crc = calc_crc8(data, length - 1);
if (crc != data[length - 1]) {
return -2;
}
struct pkg_head_t *pH = (struct pkg_head_t *)data;
if (ID_SOURCE == pSW->id) {
struct chrg_src_t *pS = &pSW->source;
switch (pH->cmd) {
case SRC_CMD_GET_VOLTAGE: {
struct get_vol_ack_t *pAck = (struct get_vol_ack_t *)data;
pS->vc.voltage = pAck->voltage;
pS->vc.version = pAck->version;
// ?
}
break;
case SRC_CMD_GET_PROTOCOL: {
struct get_pd_pro_ack_t *pAck = (struct get_pd_pro_ack_t *)data;
pS->pd_get[0].src_type = pAck->type;
pS->pd_get[0].pps_type = pAck->pps;
pS->pd_get[0].mm[0].max_vol = pAck->vmax;
pS->pd_get[0].mm[0].min_vol = pAck->vmin;
pS->pd_get[0].mm[0].max_cur = pAck->curpwr;
}
break;
case SRC_CMD_SET_CC_LEVEL: {
}
break;
case SRC_CMD_SET_PROTOCOL: {
}
break;
default:
break;
}
} else if (ID_SINK == pSW->id) {
struct chrg_sink_t *pS = &pSW->sink;
switch (pH->cmd) {
case SINK_CMD_GET_VOLTAGE: {
}
break;
case SINK_CMD_GET_PD: {
}
break;
case SINK_CMD_SET_CC: {
}
break;
case SINK_CMD_SET_LEVEL: {
}
break;
case SINK_CMD_SET_QC20: {
}
break;
}
}
return 0;
}
int chrg_pkg_send (eIDX_TTY idx, rt_uint8_t *data, rt_uint16_t len)
{
rt_ssize_t ret = -1;
struct chrg_tty_t *pTTY = RT_NULL;
switch (idx) {
case IDX_TTY_NORTH:
pTTY = chrgnorth.tty;
break;
case IDX_TTY_SOUTH:
pTTY = chrgsouth.tty;
break;
default:
return -1;
}
if ((RT_NULL != pTTY)&&(RT_NULL != pTTY->dev)) {
ret = rt_device_write(pTTY->dev, 0, data, len);
}
return ret;
}