pinebuds/services/tota/app_tota_data_handler.cpp

157 lines
4.5 KiB
C++

/**
****************************************************************************************
*
* @file app_tota_data_handler.c
*
* @date 24th April 2018
*
* @brief The framework of the tota data handler
*
* Copyright (C) 2017
*
*
****************************************************************************************
*/
#include "app_tota_data_handler.h"
#include "app_tota.h"
#include "app_tota_cmd_code.h"
#include "app_tota_cmd_handler.h"
#include "apps.h"
#include "cmsis_os.h"
#include "hal_timer.h"
#include "hal_trace.h"
#include "stdbool.h"
#include "string.h"
//#include "rwapp_config.h"
#include "app_spp_tota.h"
#include "app_spp_tota_general_service.h"
#include "app_tota_conn.h"
#include "crc32.h"
#include "tota_buffer_manager.h"
#include "tota_stream_data_transfer.h"
/**
* @brief tota data handling environment
*
*/
typedef struct {
uint8_t isDataXferInProgress;
uint8_t isCrcCheckEnabled;
uint32_t wholeDataXferLen;
uint32_t dataXferLenUntilLastSegVerification;
uint32_t currentWholeCrc32;
uint32_t wholeCrc32UntilLastSeg;
uint32_t crc32OfCurrentSeg;
} APP_TOTA_DATA_HANDLER_ENV_T;
#define APP_TOTA_TX_BUF_SIZE 2046
static uint8_t app_tota_tmpDataXferBuf[APP_TOTA_TX_BUF_SIZE];
/*static receive_data_callback recervice_data_cb = NULL;
void app_tota_data_received_callback_handler_register(receive_data_callback cb )
{
recervice_data_cb = cb;
}
__attribute__((weak)) void app_tota_data_received_callback(uint8_t* ptrData,
uint32_t dataLength)
{
if(recervice_data_cb != NULL){
recervice_data_cb(ptrData,dataLength);
}
}
*/
/**
* @brief Receive the data from the peer device and parse them
*
* @param ptrData Pointer of the received data
* @param dataLength Length of the received data
*
* @return APP_TOTA_CMD_RET_STATUS_E
*/
APP_TOTA_CMD_RET_STATUS_E app_tota_data_received(uint8_t *ptrData,
uint32_t dataLength) {
TOTA_LOG_DBG(0, ">>> app_tota_data_received");
if ((OP_TOTA_STREAM_DATA !=
(APP_TOTA_CMD_CODE_E)(((uint16_t *)ptrData)[0])) ||
(dataLength < TOTA_CMD_CODE_SIZE)) {
return TOTA_INVALID_DATA_PACKET;
}
APP_TOTA_TRANSMISSION_PATH_E dataPath = app_tota_get_datapath();
APP_TOTA_DATA_ACK_T tAck = {0};
app_tota_send_command(OP_TOTA_SPP_DATA_ACK, (uint8_t *)&tAck, sizeof(tAck),
dataPath);
return TOTA_NO_ERROR;
}
void app_tota_send_data(APP_TOTA_TRANSMISSION_PATH_E path, uint8_t *ptrData,
uint32_t dataLength) {
if (path < APP_TOTA_TRANSMISSION_PATH_COUNT) {
((uint16_t *)app_tota_tmpDataXferBuf)[0] = OP_TOTA_STREAM_DATA;
memcpy(app_tota_tmpDataXferBuf + TOTA_CMD_CODE_SIZE, ptrData, dataLength);
switch (path) {
case APP_TOTA_VIA_SPP:
app_tota_send_data_via_spp(app_tota_tmpDataXferBuf,
dataLength + TOTA_CMD_CODE_SIZE);
break;
case APP_TOTA_GEN_VIA_SPP:
app_tota_gen_send_data_via_spp(app_tota_tmpDataXferBuf,
dataLength + TOTA_CMD_CODE_SIZE);
break;
default:
break;
}
}
}
#if defined(APP_ANC_TEST)
void app_anc_tota_send_data(APP_TOTA_TRANSMISSION_PATH_E path, uint8_t *ptrData,
uint32_t dataLength) {
if (path < APP_TOTA_TRANSMISSION_PATH_COUNT) {
switch (path) {
case APP_TOTA_VIA_SPP:
app_tota_send_data_via_spp(ptrData, dataLength);
break;
default:
break;
}
}
}
#endif
void app_tota_handle_received_data(uint8_t *buffer, uint16_t maxBytes) {
TOTA_LOG_DBG(2, "[%s]data receive data length = %d", __func__, maxBytes);
uint8_t *_buf = buffer;
uint32_t _bufLen = maxBytes;
if (OP_TOTA_STREAM_DATA == *(uint16_t *)buffer) {
TOTA_LOG_DBG(0, "APP TOTA DATA RECEIVED");
app_tota_data_received(_buf, _bufLen);
} else {
if (OP_TOTA_STRING == *(uint16_t *)buffer) {
TOTA_LOG_DBG(0, "APP TOTA STRING RECEIVED");
} else {
#if defined(TOTA_ENCODE) && TOTA_ENCODE
if (is_tota_connected()) {
TOTA_LOG_DBG(0, "APP TOTA ENCRYPT DATA RECEIVED");
_buf = tota_decrypt_packet(buffer, maxBytes, &_bufLen);
} else {
if (*(uint16_t *)buffer <= OP_TOTA_CONN_CONFIRM) {
TOTA_LOG_DBG(0, "APP TOTA UNCRYPT CONN COMMAND");
} else {
// TODO
TOTA_LOG_DBG(0, "TOTA UNCONNECT: COMMAND NOT SUPPORT");
return;
}
}
app_tota_cmd_received(_buf, _bufLen);
#else
TOTA_LOG_DBG(0, "APP TOTA CMD RECEIVED");
app_tota_cmd_received(_buf, _bufLen);
#endif
}
}
}