Hi chrisgray, jonathan.thompson@nimbusnine.co, mario_castaneda
I was save from node to host successful, but I'm facing a problem when load from host to node with size greater 128 byte (with size < 128, it load successful).
On host, I use sqlite3 for storing.
On node (JN5169), implement pdm_host.c from JN-AN-1223.
PUBLIC PDM_teStatus PDM_eReadDataFromRecord( uint16 u16IdValue,
void *pvDataBuffer,
uint16 u16DataBufferLength,
uint16 *pu16DataBytesRead)
{
/* send LoadRecordRequest to host */
DBG_vPrintf(TRACE_PDM_HOST, "E_SL_MSG_LOAD_PDM_RECORD_REQUEST\n");
uint8 au8Buffer[MAX_PACKET_SIZE], *pu8Buffer, *pdmBuffer;
uint32 u32Length = 0;
uint32 u32Size,u32TotalBlocks=0,u32BlockId=0,u32BlockSize=0;
uint16 u16RecordId,u16MessageType;
bool_t bNoMoreData = FALSE;
PDM_tsRecordDescriptor *psDesc;
psDesc->u16UserId = u16IdValue;
psDesc->pu8Data = (uint8*)pvDataBuffer;
psDesc->u32DataSize = u16DataBufferLength;
psDesc->u16Id = PDM_INVALID_ID;
/* set security level of the record */
psDesc->eState = PDM_RECOVERY_STATE_NONE;
if(!bCheckPdmRecordsList(psDesc))
{
psDesc->psNext = pHead;
pHead = psDesc;
}
/* flush hardware buffer */
UART_vOverrideInterrupt(FALSE);
pu8Buffer = au8Buffer;
memcpy(pu8Buffer, &u16IdValue,sizeof(uint16));
u32Length = sizeof(uint16);
pu8Buffer += sizeof(uint16);
u16MessageType = E_SL_MSG_LOAD_PDM_RECORD_REQUEST;
vUart_WriteMessage(u16MessageType, u32Length, au8Buffer);
pdmBuffer = psDesc->pu8Data;
do
{
u8QueueByte = 0xff;
if(UART_bGetRxData((uint8*)&u8QueueByte) ){
if(TRUE==bSL_ReadMessage(&u16PacketType,&u16PacketLength,MAX_PACKET_SIZE,au8LinkRxBuffer,u8QueueByte))
{
switch(u16PacketType)
{
case(E_SL_MSG_LOAD_PDM_RECORD_RESPONSE):
{
DBG_vPrintf(TRACE_PDM_HOST, "E_SL_MSG_LOAD_PDM_RECORD_RESPONSE\n");
uint8 u8Status = au8LinkRxBuffer[0];
memcpy(&u16RecordId, &au8LinkRxBuffer[1], sizeof(uint16));
DBG_vPrintf(TRACE_PDM_HOST, "u16RecordId; %x\n", u16RecordId);
memcpy(&u32Size,&au8LinkRxBuffer[3], sizeof(uint32));
DBG_vPrintf(TRACE_PDM_HOST, "u32Size; %x\n", u32Size);
memcpy(&u32TotalBlocks, &au8LinkRxBuffer[7], sizeof(uint32));
DBG_vPrintf(TRACE_PDM_HOST, "u32TotalBlocks; %x\n", u32TotalBlocks);
memcpy(&u32BlockId, &au8LinkRxBuffer[11],sizeof(uint32));
DBG_vPrintf(TRACE_PDM_HOST, "u32BlockId; %x\n", u32BlockId);
memcpy(&u32BlockSize, &au8LinkRxBuffer[15], sizeof(uint32));
uint16 u16BlockSize = (uint16)u32BlockSize;
DBG_vPrintf(TRACE_PDM_HOST, "u16BlockSize; %x\n", u16BlockSize);
memcpy(pu16DataBytesRead, &u16BlockSize, sizeof(uint16)); /*save length data was read*/
if((u8Status != PDM_RECOVERY_STATE_NONE) && (u16RecordId == psDesc->u16UserId))
{
memcpy(pdmBuffer, &au8LinkRxBuffer[19], u16BlockSize);
/* show data received */
uint32 i;
DBG_vPrintf(TRACE_PDM_HOST, "Data: ");
for (i=0; i<u16BlockSize; i++) {
DBG_vPrintf(TRACE_PDM_HOST, "%02x", pdmBuffer[i]);
}
DBG_vPrintf(TRACE_PDM_HOST, "\n");
pdmBuffer += u16BlockSize;
if(u32TotalBlocks == u32BlockId)
{
DBG_vPrintf(TRACE_PDM_HOST, "PDM_RECOVERY_STATE_RECOVERED\n");
bNoMoreData = TRUE;
psDesc->eState = PDM_RECOVERY_STATE_RECOVERED;
}
}
if(u8Status == PDM_RECOVERY_STATE_NONE)
{
DBG_vPrintf(TRACE_PDM_HOST, "PDM_RECOVERY_STATE_NONE\n");
bNoMoreData = TRUE;
psDesc->eState = PDM_RECOVERY_STATE_NONE;
}
u8Status = 0;
memcpy(au8Buffer, &u8Status, sizeof(uint8));
memcpy(&au8Buffer[1], &u8Status, sizeof(uint8));
memcpy(&au8Buffer[2], &u16MessageType, sizeof(uint16));
/* show data received */
uint32 i;
DBG_vPrintf(TRACE_PDM_HOST, "Data: ");
for (i=0; i<4; i++) {
DBG_vPrintf(TRACE_PDM_HOST, "%02x", au8Buffer[i]);
}
vUart_WriteMessage(E_SL_MSG_STATUS, 4, au8Buffer);
DBG_vPrintf(TRACE_PDM_HOST, "\nNext block\n\n");
}
break;
default:
break;
}
}
}
}
while(!bNoMoreData);
UART_vOverrideInterrupt(TRUE);
return PDM_E_STATUS_OK;
}