FMSTR_BOOL FMSTR_ProtocolDecoder(FMSTR_BPTR pMessageIO) { FMSTR_BPTR pResponseEnd; FMSTR_U8 nCmd; /* no EX access by default */ FMSTR_SetExAddr(FMSTR_FALSE); /* command code comes first in the message */ /*lint -e{534} return value is not used */ FMSTR_ValueFromBuffer8(&nCmd, pMessageIO); /* process command */ switch (nCmd) { #if FMSTR_USE_READVAR /* read byte */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_READVAR8_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_READVAR8: #endif pResponseEnd = FMSTR_ReadVar(pMessageIO, 1U); break; /* read word */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_READVAR16_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_READVAR16: #endif pResponseEnd = FMSTR_ReadVar(pMessageIO, 2U); break; /* read dword */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_READVAR32_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_READVAR32: #endif pResponseEnd = FMSTR_ReadVar(pMessageIO, 4U); break; #endif /* FMSTR_USE_READVAR */ #if FMSTR_USE_READMEM /* read a block of memory */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_READMEM_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_READMEM: #endif pResponseEnd = FMSTR_ReadMem(pMessageIO); break; #endif /* FMSTR_USE_READMEM */ #if FMSTR_USE_SCOPE /* prepare scope variables */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_SETUPSCOPE_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_SETUPSCOPE: #endif pResponseEnd = FMSTR_SetUpScope(pMessageIO); break; case FMSTR_CMD_READSCOPE: pResponseEnd = FMSTR_ReadScope(pMessageIO); break; #endif /* FMSTR_USE_SCOPE */ #if FMSTR_USE_RECORDER /* get recorder status */ case FMSTR_CMD_GETRECSTS: pResponseEnd = FMSTR_GetRecStatus(pMessageIO); break; /* start recorder */ case FMSTR_CMD_STARTREC: pResponseEnd = FMSTR_StartRec(pMessageIO); break; /* stop recorder */ case FMSTR_CMD_STOPREC: pResponseEnd = FMSTR_StopRec(pMessageIO); break; /* setup recorder */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_SETUPREC_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_SETUPREC: #endif pResponseEnd = FMSTR_SetUpRec(pMessageIO); break; /* get recorder buffer information (force EX instead of non-EX) */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_GETRECBUFF_EX: FMSTR_SetExAddr(FMSTR_TRUE); #elif FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_GETRECBUFF: #endif pResponseEnd = FMSTR_GetRecBuff(pMessageIO); break; #endif /* FMSTR_USE_RECORDER */ #if FMSTR_USE_APPCMD /* accept the application command */ case FMSTR_CMD_SENDAPPCMD: pResponseEnd = FMSTR_StoreAppCmd(pMessageIO); break; /* get the application command status */ case FMSTR_CMD_GETAPPCMDSTS: pResponseEnd = FMSTR_GetAppCmdStatus(pMessageIO); break; /* get the application command data */ case FMSTR_CMD_GETAPPCMDDATA: pResponseEnd = FMSTR_GetAppCmdRespData(pMessageIO); break; #endif /* FMSTR_USE_APPCMD */ #if FMSTR_USE_WRITEMEM /* write a block of memory */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_WRITEMEM_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_WRITEMEM: #endif pResponseEnd = FMSTR_WriteMem(pMessageIO); break; #endif /* FMSTR_USE_WRITEMEM */ #if FMSTR_USE_WRITEMEMMASK /* write block of memory with a bit mask */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_WRITEMEMMASK_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_WRITEMEMMASK: #endif pResponseEnd = FMSTR_WriteMemMask(pMessageIO); break; #endif /* FMSTR_USE_WRITEMEMMASK */ #if FMSTR_USE_WRITEVAR && FMSTR_USE_NOEX_CMDS /* write byte */ case FMSTR_CMD_WRITEVAR8: pResponseEnd = FMSTR_WriteVar(pMessageIO, 1U); break; /* write word */ case FMSTR_CMD_WRITEVAR16: pResponseEnd = FMSTR_WriteVar(pMessageIO, 2U); break; /* write dword */ case FMSTR_CMD_WRITEVAR32: pResponseEnd = FMSTR_WriteVar(pMessageIO, 4U); break; #endif /* FMSTR_USE_WRITEVAR && FMSTR_USE_NOEX_CMDS */ #if FMSTR_USE_WRITEVARMASK && FMSTR_USE_NOEX_CMDS /* write byte with mask */ case FMSTR_CMD_WRITEVAR8MASK: pResponseEnd = FMSTR_WriteVarMask(pMessageIO, 1U); break; /* write word with mask */ case FMSTR_CMD_WRITEVAR16MASK: pResponseEnd = FMSTR_WriteVarMask(pMessageIO, 2U); break; #endif /* FMSTR_USE_WRITEVARMASK && FMSTR_USE_NOEX_CMDS */ #if FMSTR_USE_TSA /* get TSA table (force EX instead of non-EX) */ #if FMSTR_USE_EX_CMDS case FMSTR_CMD_GETTSAINFO_EX: FMSTR_SetExAddr(FMSTR_TRUE); #elif FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_GETTSAINFO: #endif pResponseEnd = FMSTR_GetTsaInfo(pMessageIO); break; #if FMSTR_USE_EX_CMDS case FMSTR_CMD_GETSTRLEN_EX: FMSTR_SetExAddr(FMSTR_TRUE); #endif #if FMSTR_USE_NOEX_CMDS /*lint -fallthrough */ case FMSTR_CMD_GETSTRLEN: #endif pResponseEnd = FMSTR_GetStringLen(pMessageIO); break; #endif /* FMSTR_USE_TSA */ #if FMSTR_USE_BRIEFINFO /* retrieve a subset of board information structure */ case FMSTR_CMD_GETINFOBRIEF: #else /* retrieve board information structure */ case FMSTR_CMD_GETINFO: #endif pResponseEnd = FMSTR_GetBoardInfo(pMessageIO); break; #if FMSTR_USE_SFIO case FMSTR_CMD_SFIOFRAME_0: case FMSTR_CMD_SFIOFRAME_1: pResponseEnd = FMSTR_SfioFrame(pMessageIO); break; case FMSTR_CMD_SFIOGETRESP_0: case FMSTR_CMD_SFIOGETRESP_1: pResponseEnd = FMSTR_SfioGetResp(pMessageIO); break; #endif /* FMSTR_USE_SFIO */ #if FMSTR_USE_PIPES case FMSTR_CMD_PIPE: pResponseEnd = FMSTR_PipeFrame(pMessageIO); break; #endif /* FMSTR_USE_PIPES */ /* unknown command */ default: pResponseEnd = FMSTR_ConstToBuffer8(pMessageIO, FMSTR_STC_INVCMD); break; } /* anything to send back? */ if(pResponseEnd != pMessageIO) { /*lint -e{946,960} subtracting pointers is appropriate here */ FMSTR_SIZE8 nSize = (FMSTR_SIZE8)(pResponseEnd - pMessageIO); FMSTR_SendResponse(pMessageIO, nSize); return FMSTR_TRUE; } else { /* nothing sent out */ return FMSTR_FALSE; } }
static void FMSTR_SendError(FMSTR_BCHR nErrCode) { /* fill & send single-byte response */ *pcm_pCommBuffer = nErrCode; FMSTR_SendResponse(pcm_pCommBuffer, 1U); }