FMSTR_BPTR FMSTR_WriteMemMask(FMSTR_BPTR pMessageIO) { FMSTR_BPTR pResponse = pMessageIO; FMSTR_ADDR nAddr; FMSTR_U8 nSize,nResponseCode; pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 2U); pMessageIO = FMSTR_ValueFromBuffer8(&nSize, pMessageIO); pMessageIO = FMSTR_AddressFromBuffer(&nAddr, pMessageIO); #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(nAddr, (FMSTR_SIZE8)nSize, FMSTR_TRUE)) { nResponseCode = FMSTR_STC_EACCESS; goto FMSTR_WriteMemMask_exit; } #endif #if FMSTR_CFG_BUS_WIDTH > 1U /* size must be divisible by bus width (mask must not begin in half of memory word) */ if(nSize % FMSTR_CFG_BUS_WIDTH) { nResponseCode = FMSTR_STC_INVSIZE; goto FMSTR_WriteMemMask_exit; } #endif /* put the data */ FMSTR_CopyFromBufferWithMask(nAddr, pMessageIO, (FMSTR_SIZE8)nSize); nResponseCode = FMSTR_STS_OK; //FMSTR_WriteMemMask_exit: return FMSTR_ConstToBuffer8(pResponse, nResponseCode); }
FMSTR_BPTR FMSTR_WriteMem(FMSTR_BPTR pMessageIO) { FMSTR_BPTR pResponse = pMessageIO; FMSTR_ADDR nAddr; FMSTR_U8 nSize,nResponseCode; pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 2U); pMessageIO = FMSTR_ValueFromBuffer8(&nSize, pMessageIO); pMessageIO = FMSTR_AddressFromBuffer(&nAddr, pMessageIO); #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(nAddr, (FMSTR_SIZE8) nSize, FMSTR_TRUE)) { nResponseCode = FMSTR_STC_EACCESS; goto FMSTR_WriteMem_exit; } #endif /*lint -e{534} ignoring function return value */ FMSTR_CopyFromBuffer(nAddr, pMessageIO, (FMSTR_SIZE8) nSize); nResponseCode = FMSTR_STS_OK; //FMSTR_WriteMem_exit: return FMSTR_ConstToBuffer8(pResponse, nResponseCode); }
FMSTR_BPTR FMSTR_ReadMem(FMSTR_BPTR pMessageIO) { FMSTR_BPTR pResponse = pMessageIO; FMSTR_ADDR nAddr; FMSTR_U8 nSize; pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 2U); pMessageIO = FMSTR_ValueFromBuffer8(&nSize, pMessageIO); pMessageIO = FMSTR_AddressFromBuffer(&nAddr, pMessageIO); #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(nAddr, (FMSTR_SIZE8) nSize, FMSTR_FALSE)) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_EACCESS); } #endif /* check the response will safely fit into comm buffer */ if(nSize > (FMSTR_U8)FMSTR_COMM_BUFFER_SIZE) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_RSPBUFFOVF); } /* success */ pResponse = FMSTR_ConstToBuffer8(pResponse, FMSTR_STS_OK); return FMSTR_CopyToBuffer(pResponse, nAddr, (FMSTR_SIZE8) nSize); }
FMSTR_BPTR FMSTR_SetUpScope(FMSTR_BPTR pMessageIO) { FMSTR_BPTR pResponse = pMessageIO; FMSTR_U8 i, sz, nVarCnt; /* uninitialize scope */ pcm_nScopeVarCount = 0U; /* seek the setup data */ pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 2U); /* scope variable count */ pMessageIO = FMSTR_ValueFromBuffer8(&nVarCnt, pMessageIO); /* scope variable information must fit into our buffers */ if(!nVarCnt || nVarCnt > (FMSTR_U8)FMSTR_MAX_SCOPE_VARS) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_INVBUFF); } /* get all addresses and sizes */ for(i=0U; i<nVarCnt; i++) { /* variable size */ pMessageIO = FMSTR_ValueFromBuffer8(&sz, pMessageIO); pcm_pScopeVarSize[i] = sz; /* variable address */ pMessageIO = FMSTR_AddressFromBuffer(&pcm_pScopeVarAddr[i], pMessageIO); /* valid numeric variable sizes only */ if(sz == 0U || sz > 8U) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_INVSIZE); } #if FMSTR_CFG_BUS_WIDTH > 1U /* even sizes only */ if(sz & 0x1) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_INVSIZE); } #endif #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(pcm_pScopeVarAddr[i], (FMSTR_SIZE8) sz, 0U)) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_EACCESS); } #endif } /* activate scope */ pcm_nScopeVarCount = nVarCnt; /* return just a status */ return FMSTR_ConstToBuffer8(pResponse, FMSTR_STS_OK); }
FMSTR_BPTR FMSTR_ReadVar(FMSTR_BPTR pMessageIO, FMSTR_SIZE8 nSize) { FMSTR_BPTR pResponse = pMessageIO; FMSTR_ADDR nAddr; pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 1U); pMessageIO = FMSTR_AddressFromBuffer(&nAddr, pMessageIO); #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(nAddr, nSize, FMSTR_FALSE)) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_EACCESS); } #endif /* success */ pResponse = FMSTR_ConstToBuffer8(pResponse, FMSTR_STS_OK); return FMSTR_CopyToBuffer(pResponse, nAddr, nSize); }
FMSTR_BPTR FMSTR_WriteVarMask(FMSTR_BPTR pMessageIO, FMSTR_SIZE8 nSize) { FMSTR_BPTR pResponse = pMessageIO; FMSTR_ADDR nAddr; FMSTR_U8 nResponseCode; pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 1U); pMessageIO = FMSTR_AddressFromBuffer(&nAddr, pMessageIO); #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(nAddr, nSize, FMSTR_TRUE)) { nResponseCode = FMSTR_STC_EACCESS; goto FMSTR_WriteVarMask_exit; } #endif /* put the data */ FMSTR_CopyFromBufferWithMask(nAddr, pMessageIO, nSize); nResponseCode = FMSTR_STS_OK; //FMSTR_WriteVarMask_exit: return FMSTR_ConstToBuffer8(pResponse, nResponseCode); }
FMSTR_BPTR FMSTR_SetUpRec(FMSTR_BPTR pMessageIO) { FMSTR_BPTR pResponse = pMessageIO; FMSTR_SIZE8 nRecVarsetSize; FMSTR_SIZE blen; FMSTR_U8 i, sz; FMSTR_U8 nResponseCode; /* de-initialize first */ FMSTR_AbortRec(); #if FMSTR_REC_OWNBUFF /* user wants to use his own buffer, check if it is valid */ if(!pcm_nRecBuffAddr || !pcm_wRecBuffSize) { return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_INVBUFF); } #elif (FMSTR_USE_FASTREC) == 0 /* size in native sizeof units (=bytes on most platforms) */ FMSTR_ARR2ADDR(pcm_nRecBuffAddr, pcm_pOwnRecBuffer); #endif /* seek the setup data */ #if (FMSTR_USE_FASTREC) == 0 pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 2U); pMessageIO = FMSTR_ValueFromBuffer8(&pcm_nRecTriggerMode, pMessageIO); #else /* (FMSTR_USE_FASTREC) == 0 */ pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 3U); #endif /* (FMSTR_USE_FASTREC) == 0 */ pMessageIO = FMSTR_ValueFromBuffer16(&pcm_wRecTotalSmps, pMessageIO); #if (FMSTR_REC_STATIC_POSTTRIG) == 0 pMessageIO = FMSTR_ValueFromBuffer16(&pcm_wRecPostTrigger, pMessageIO); #else /* (FMSTR_REC_STATIC_POSTTRIG) == 0 */ pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 2U); #endif /* (FMSTR_REC_STATIC_POSTTRIG) == 0 */ #if (FMSTR_REC_STATIC_DIVISOR) == 0 pMessageIO = FMSTR_ValueFromBuffer16(&pcm_wRecTimeDiv, pMessageIO); #else /* (FMSTR_REC_STATIC_DIVISOR) == 0 */ pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 2U); #endif /* (FMSTR_REC_STATIC_DIVISOR) == 0 */ #if (FMSTR_USE_FASTREC) == 0 /* address & size of trigger variable */ pMessageIO = FMSTR_AddressFromBuffer(&pcm_nTrgVarAddr, pMessageIO); pMessageIO = FMSTR_ValueFromBuffer8(&pcm_nTrgVarSize, pMessageIO); /* trigger compare mode */ pMessageIO = FMSTR_ValueFromBuffer8(&pcm_bTrgVarSigned, pMessageIO); /* threshold value */ pMessageIO = FMSTR_ValueFromBuffer32(&pcm_uTrgThreshold.u32, pMessageIO); #else /* (FMSTR_USE_FASTREC) == 0 */ pMessageIO = FMSTR_SkipInBuffer(pMessageIO, 8U); #endif /* (FMSTR_USE_FASTREC) == 0 */ /* recorder variable count */ pMessageIO = FMSTR_ValueFromBuffer8(&pcm_nRecVarCount, pMessageIO); /* rec variable information must fit into our buffers */ if(!pcm_nRecVarCount || pcm_nRecVarCount > (FMSTR_U8)FMSTR_MAX_REC_VARS) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_INVBUFF; goto FMSTR_SetUpRec_exit; #endif } /* calculate sum of sizes of all variables */ nRecVarsetSize = 0U; /* get all addresses and sizes */ for(i=0U; i<pcm_nRecVarCount; i++) { /* variable size */ pMessageIO = FMSTR_ValueFromBuffer8(&sz, pMessageIO); pcm_pRecVarSize[i] = sz; nRecVarsetSize += sz; /* variable address */ pMessageIO = FMSTR_AddressFromBuffer(&pcm_pRecVarAddr[i], pMessageIO); /* valid numeric variable sizes only */ if(sz == 0U || sz > 8U) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_INVSIZE; goto FMSTR_SetUpRec_exit; #endif } #if FMSTR_CFG_BUS_WIDTH > 1U /* even sizes only */ if(sz & 0x1) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_INVSIZE; goto FMSTR_SetUpRec_exit; #endif } #endif /* FMSTR_CFG_BUS_WIDTH > 1U */ #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(pcm_pRecVarAddr[i], (FMSTR_SIZE8)sz, 0U)) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_EACCESS; goto FMSTR_SetUpRec_exit; #endif } #endif /* FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY */ } /* fast recorder handles trigger by itself */ #if (FMSTR_USE_FASTREC) == 0 /* any trigger? */ pcm_pCompareFunc = NULL; if(pcm_nRecTriggerMode) { /* access to trigger variable? */ #if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY if(!FMSTR_CheckTsaSpace(pcm_nTrgVarAddr, (FMSTR_SIZE8)pcm_nTrgVarSize, 0U)) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_EACCESS; goto FMSTR_SetUpRec_exit; #endif } #endif /* FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY */ /* get compare function */ #if FMSTR_REC_FLOAT_TRIG if(pcm_bTrgVarSigned&FMSTR_REC_FLOAT_TRIG_MASK) { pcm_pCompareFunc = FMSTR_Comparefloat; } else #else if(pcm_bTrgVarSigned&FMSTR_REC_FLOAT_TRIG_MASK) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_FLOATDISABLED; goto FMSTR_SetUpRec_exit; #endif } #endif { switch(pcm_nTrgVarSize) { #if FMSTR_CFG_BUS_WIDTH == 1U case 1: pcm_pCompareFunc = pcm_bTrgVarSigned ? FMSTR_Compare8S : FMSTR_Compare8U; break; #endif case 2: pcm_pCompareFunc = pcm_bTrgVarSigned ? FMSTR_Compare16S : FMSTR_Compare16U; break; case 4: pcm_pCompareFunc = pcm_bTrgVarSigned ? FMSTR_Compare32S : FMSTR_Compare32U; break; /* invalid trigger variable size */ default: #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_INVSIZE; goto FMSTR_SetUpRec_exit; #endif } } } #endif /* (FMSTR_USE_FASTREC) == 0 */ /* total recorder buffer length in native sizeof units (=bytes on most platforms) */ blen = (FMSTR_SIZE) (pcm_wRecTotalSmps * nRecVarsetSize / FMSTR_CFG_BUS_WIDTH); /* recorder memory available? */ if(blen > FMSTR_GetRecBuffSize()) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else nResponseCode = FMSTR_STC_INVSIZE; goto FMSTR_SetUpRec_exit; #endif } #if (FMSTR_USE_FASTREC) == 0 /* remember the effective end of circular buffer */ pcm_dwRecEndBuffPtr = pcm_nRecBuffAddr + blen; #endif /* (FMSTR_USE_FASTREC) == 0 */ #if FMSTR_USE_FASTREC if(!FMSTR_SetUpFastRec()) { #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit_error; #else /* FMSTR_REC_COMMON_ERR_CODES */ nResponseCode = FMSTR_STC_FASTRECERR; goto FMSTR_SetUpRec_exit; #endif /* FMSTR_REC_COMMON_ERR_CODES */ } #endif /* FMSTR_USE_FASTREC */ /* everything is okay */ pcm_wRecFlags.flg.bIsConfigured = 1U; nResponseCode = FMSTR_STS_OK; #if FMSTR_REC_COMMON_ERR_CODES goto FMSTR_SetUpRec_exit; FMSTR_SetUpRec_exit_error: nResponseCode = FMSTR_STC_INVSIZE; #endif FMSTR_SetUpRec_exit: return FMSTR_ConstToBuffer8(pResponse, nResponseCode); }