void FMSTR_AppCmdSetResponseData(FMSTR_ADDR nResultDataAddr, FMSTR_SIZE nResultDataLen) { /* any data supplied by user? */ if(nResultDataAddr) { /* response data length is trimmed if response data would not fit into buffer */ pcm_nAppCmdResultDataLen = (FMSTR_SIZE8) nResultDataLen; if(pcm_nAppCmdResultDataLen > (FMSTR_SIZE8) FMSTR_APPCMD_BUFF_SIZE) { pcm_nAppCmdResultDataLen = (FMSTR_SIZE8) FMSTR_APPCMD_BUFF_SIZE; } if(pcm_nAppCmdResultDataLen > 0U) { FMSTR_ADDR appCmdBuffAddr; FMSTR_ARR2ADDR(appCmdBuffAddr, pcm_pAppCmdBuff); FMSTR_CopyMemory(appCmdBuffAddr, nResultDataAddr, pcm_nAppCmdResultDataLen); } } else { /* no data being returned at all (same effect as pure FMSTR_AppCmdAck) */ pcm_nAppCmdResultDataLen = 0U; } }
static void FMSTR_Recorder2(void) { FMSTR_SIZE8 sz; FMSTR_BOOL cmp; FMSTR_U8 i; #if (FMSTR_REC_STATIC_DIVISOR) != 1 /* skip this call ? */ if(pcm_wRecTimeDivCtr) { /* maybe next time... */ pcm_wRecTimeDivCtr--; return; } /* re-initialize divider */ #if (FMSTR_REC_STATIC_DIVISOR) == 0 pcm_wRecTimeDivCtr = pcm_wRecTimeDiv; #else pcm_wRecTimeDivCtr = FMSTR_REC_STATIC_DIVISOR; #endif /* (FMSTR_REC_STATIC_DIVISOR) == 0 */ #endif /* (FMSTR_REC_STATIC_DIVISOR) != 1 */ /* take snapshot of variable values */ for (i=0U; i<pcm_nRecVarCount; i++) { sz = pcm_pRecVarSize[i]; FMSTR_CopyMemory(pcm_dwRecWritePtr, pcm_pRecVarAddr[i], sz); sz /= FMSTR_CFG_BUS_WIDTH; pcm_dwRecWritePtr += sz; } /* another sample taken (startIx "points" after sample just taken) */ /* i.e. it points to the oldest sample */ pcm_wRecBuffStartIx++; /* wrap around (circular buffer) ? */ if(pcm_dwRecWritePtr >= pcm_dwRecEndBuffPtr) { pcm_dwRecWritePtr = pcm_nRecBuffAddr; pcm_wRecFlags.flg.bInvirginCycle = 0U; pcm_wRecBuffStartIx = 0U; } /* no trigger testing in virgin cycle */ if(pcm_wRecFlags.flg.bInvirginCycle) { return; } /* test trigger condition if still running */ if(!pcm_wRecFlags.flg.bIsStopping && pcm_pCompareFunc != NULL) { /* compare trigger threshold */ cmp = pcm_pCompareFunc(); /* negated logic (falling-edge) ? */ if(pcm_nRecTriggerMode == 2U) { cmp = (FMSTR_BOOL) !cmp; } /* above threshold ? */ if(cmp) { /* were we at least once below threshold ? */ if(pcm_wRecFlags.flg.bTrgCrossActive) { /* EDGE TRIGGER ! */ FMSTR_TriggerRec(); } } else { /* we got bellow threshold, now wait for being above threshold */ pcm_wRecFlags.flg.bTrgCrossActive = 1U; } } /* in stopping mode ? (note that this bit might have been set just above!) */ if(pcm_wRecFlags.flg.bIsStopping) { /* count down post-trigger samples expired ? */ if(!pcm_wStoprecCountDown) { /* STOP RECORDER */ pcm_wRecFlags.flg.bIsRunning = 0U; return; } /* perhaps next time */ pcm_wStoprecCountDown--; } }