147 lines
2.3 KiB
C
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;
|
|
}
|
|
|
|
|