control/Control Vectorial/real/Alinear_encoder_sg_rtw/rt_zcfcn.cpp
2025-09-03 11:21:53 +02:00

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 */
}