100 lines
3.1 KiB
C++
100 lines
3.1 KiB
C++
/*
|
|
* rt_zcfcn.cpp
|
|
*
|
|
* Academic License - for use in teaching, academic research, and meeting
|
|
* course requirements at degree granting institutions only. Not for
|
|
* government, commercial, or other organizational use.
|
|
*
|
|
* Code generation for model "Alinear_encoder".
|
|
*
|
|
* Model version : 1.3
|
|
* Simulink Coder version : 24.2 (R2024b) 21-Jun-2024
|
|
* C++ source code generated on : Fri Aug 22 11:49:38 2025
|
|
*
|
|
* Target selection: speedgoat.tlc
|
|
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
|
* Embedded hardware selection: Intel->x86-64 (Linux 64)
|
|
* Code generation objectives: Unspecified
|
|
* Validation result: Not run
|
|
*/
|
|
|
|
#include "zero_crossing_types.h"
|
|
#include "rtwtypes.h"
|
|
#include "rt_zcfcn.h"
|
|
#include "solver_zc.h"
|
|
|
|
extern "C"
|
|
{
|
|
/* Detect zero crossings events. */
|
|
ZCEventType rt_ZCFcn(ZCDirection zcDir, ZCSigState *prevZc, real_T currValue)
|
|
{
|
|
slZcEventType zcsDir;
|
|
slZcEventType tempEv;
|
|
ZCEventType zcEvent = NO_ZCEVENT; /* assume */
|
|
|
|
/* zcEvent matrix */
|
|
static const slZcEventType eventMatrix[4][4] = {
|
|
/* ZER POS NEG UNK */
|
|
{ SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_Z2P, SL_ZCS_EVENT_Z2N, SL_ZCS_EVENT_NUL },/* ZER */
|
|
|
|
{ SL_ZCS_EVENT_P2Z, SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_P2N, SL_ZCS_EVENT_NUL },/* POS */
|
|
|
|
{ SL_ZCS_EVENT_N2Z, SL_ZCS_EVENT_N2P, SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL },/* NEG */
|
|
|
|
{ SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL, SL_ZCS_EVENT_NUL }/* UNK */
|
|
};
|
|
|
|
/* get prevZcEvent and prevZcSign from prevZc */
|
|
const slZcEventType prevEv = (slZcEventType)(((uint8_T)(*prevZc)) >> 2);
|
|
const slZcSignalSignType prevSign = (slZcSignalSignType)(((uint8_T)(*prevZc))
|
|
& (uint8_T)0x03);
|
|
|
|
/* get current zcSignal sign from current zcSignal value */
|
|
const slZcSignalSignType currSign = (slZcSignalSignType)((currValue) > 0.0 ?
|
|
SL_ZCS_SIGN_POS :
|
|
((currValue) < 0.0 ? SL_ZCS_SIGN_NEG : SL_ZCS_SIGN_ZERO));
|
|
|
|
/* get current zcEvent based on prev and current zcSignal value */
|
|
slZcEventType currEv = eventMatrix[prevSign][currSign];
|
|
|
|
/* get slZcEventType from ZCDirection */
|
|
switch (zcDir) {
|
|
case ANY_ZERO_CROSSING:
|
|
zcsDir = SL_ZCS_EVENT_ALL;
|
|
break;
|
|
|
|
case FALLING_ZERO_CROSSING:
|
|
zcsDir = SL_ZCS_EVENT_ALL_DN;
|
|
break;
|
|
|
|
case RISING_ZERO_CROSSING:
|
|
zcsDir = SL_ZCS_EVENT_ALL_UP;
|
|
break;
|
|
|
|
default:
|
|
zcsDir = SL_ZCS_EVENT_NUL;
|
|
break;
|
|
}
|
|
|
|
/* had event, check if zc happened */
|
|
if (slZcHadEvent(currEv, zcsDir)) {
|
|
currEv = (slZcEventType)(slZcUnAliasEvents(prevEv, currEv));
|
|
} else {
|
|
currEv = SL_ZCS_EVENT_NUL;
|
|
}
|
|
|
|
/* Update prevZc */
|
|
tempEv = (slZcEventType)(currEv << 2);/* shift left by 2 bits */
|
|
*prevZc = (ZCSigState)((currSign) | (tempEv));
|
|
if ((currEv & SL_ZCS_EVENT_ALL_DN) != 0) {
|
|
zcEvent = FALLING_ZCEVENT;
|
|
} else if ((currEv & SL_ZCS_EVENT_ALL_UP) != 0) {
|
|
zcEvent = RISING_ZCEVENT;
|
|
} else {
|
|
zcEvent = NO_ZCEVENT;
|
|
}
|
|
|
|
return zcEvent;
|
|
} /* rt_ZCFcn */
|
|
}
|