From 0de3be94ebc47aa6b098340cd765f6d808ec0b7e Mon Sep 17 00:00:00 2001 From: Thefeli73 Date: Thu, 15 Apr 2021 16:54:53 +0200 Subject: [PATCH] simulink model export --- simulink_export/Arduino_skal.cpp | 605 ++ simulink_export/Arduino_skal.h | 480 + simulink_export/Arduino_skal_data.cpp | 120 + simulink_export/Arduino_skal_private.h | 55 + simulink_export/Arduino_skal_types.h | 35 + simulink_export/buildInfo.mat | Bin 0 -> 17303 bytes simulink_export/build_exception.mat | Bin 0 -> 2490 bytes simulink_export/builtin_typeid_types.h | 46 + simulink_export/codeInfo.mat | Bin 0 -> 13088 bytes simulink_export/codedescriptor.dmr | Bin 0 -> 619520 bytes simulink_export/compileInfo.mat | Bin 0 -> 3119 bytes simulink_export/defines.txt | 15 + .../html/Arduino_skal_codegen_rpt.html | 33 + .../html/Arduino_skal_contents.html | 382 + simulink_export/html/Arduino_skal_cpp.html | 1228 +++ .../html/Arduino_skal_data_cpp.html | 258 + simulink_export/html/Arduino_skal_h.html | 978 ++ .../html/Arduino_skal_interface.html | 633 ++ .../html/Arduino_skal_private_h.html | 128 + .../html/Arduino_skal_reducedblocks.html | 372 + .../html/Arduino_skal_subsystems.html | 144 + simulink_export/html/Arduino_skal_survey.html | 186 + .../html/Arduino_skal_types_h.html | 88 + .../html/builtin_typeid_types_h.html | 110 + simulink_export/html/css/coder_app.css | 184 + simulink_export/html/define.js | 389 + simulink_export/html/hilite_warning.png | Bin 0 -> 3014 bytes simulink_export/html/inspect.html | 33 + simulink_export/html/js/coder_app.js | 525 + simulink_export/html/multiword_types_h.html | 2364 +++++ simulink_export/html/nav.html | 14 + simulink_export/html/navToolbar.html | 69 + simulink_export/html/rtGetInf_cpp.html | 310 + simulink_export/html/rtGetInf_h.html | 100 + simulink_export/html/rtGetNaN_cpp.html | 230 + simulink_export/html/rtGetNaN_h.html | 96 + simulink_export/html/rt_logging_c.html | 8610 +++++++++++++++++ simulink_export/html/rt_nonfinite_cpp.html | 216 + simulink_export/html/rt_nonfinite_h.html | 152 + simulink_export/html/rtmodel_h.html | 94 + simulink_export/html/rtwhilite.js | 2091 ++++ simulink_export/html/rtwmsg.html | 31 + simulink_export/html/rtwreport.css | 257 + simulink_export/html/rtwreport_utils.js | 92 + simulink_export/html/rtwshrink.js | 210 + simulink_export/html/rtwtypes_h.html | 100 + simulink_export/html/search.js | 559 ++ simulink_export/html/spinner.gif | Bin 0 -> 4178 bytes simulink_export/make_exception.mat | Bin 0 -> 902 bytes simulink_export/modelsources.txt | 2 + simulink_export/multiword_types.h | 1173 +++ simulink_export/rtGetInf.cpp | 146 + simulink_export/rtGetInf.h | 41 + simulink_export/rtGetNaN.cpp | 106 + simulink_export/rtGetNaN.h | 39 + simulink_export/rt_nonfinite.cpp | 99 + simulink_export/rt_nonfinite.h | 67 + simulink_export/rtmodel.h | 38 + simulink_export/rtw_proj.tmw | 4 + simulink_export/rtwtypes.h | 41 + simulink_export/rtwtypeschksum.mat | Bin 0 -> 1511 bytes .../tmwinternal/simulink_cache.xml | 6 + 62 files changed, 24384 insertions(+) create mode 100644 simulink_export/Arduino_skal.cpp create mode 100644 simulink_export/Arduino_skal.h create mode 100644 simulink_export/Arduino_skal_data.cpp create mode 100644 simulink_export/Arduino_skal_private.h create mode 100644 simulink_export/Arduino_skal_types.h create mode 100644 simulink_export/buildInfo.mat create mode 100644 simulink_export/build_exception.mat create mode 100644 simulink_export/builtin_typeid_types.h create mode 100644 simulink_export/codeInfo.mat create mode 100644 simulink_export/codedescriptor.dmr create mode 100644 simulink_export/compileInfo.mat create mode 100644 simulink_export/defines.txt create mode 100644 simulink_export/html/Arduino_skal_codegen_rpt.html create mode 100644 simulink_export/html/Arduino_skal_contents.html create mode 100644 simulink_export/html/Arduino_skal_cpp.html create mode 100644 simulink_export/html/Arduino_skal_data_cpp.html create mode 100644 simulink_export/html/Arduino_skal_h.html create mode 100644 simulink_export/html/Arduino_skal_interface.html create mode 100644 simulink_export/html/Arduino_skal_private_h.html create mode 100644 simulink_export/html/Arduino_skal_reducedblocks.html create mode 100644 simulink_export/html/Arduino_skal_subsystems.html create mode 100644 simulink_export/html/Arduino_skal_survey.html create mode 100644 simulink_export/html/Arduino_skal_types_h.html create mode 100644 simulink_export/html/builtin_typeid_types_h.html create mode 100644 simulink_export/html/css/coder_app.css create mode 100644 simulink_export/html/define.js create mode 100644 simulink_export/html/hilite_warning.png create mode 100644 simulink_export/html/inspect.html create mode 100644 simulink_export/html/js/coder_app.js create mode 100644 simulink_export/html/multiword_types_h.html create mode 100644 simulink_export/html/nav.html create mode 100644 simulink_export/html/navToolbar.html create mode 100644 simulink_export/html/rtGetInf_cpp.html create mode 100644 simulink_export/html/rtGetInf_h.html create mode 100644 simulink_export/html/rtGetNaN_cpp.html create mode 100644 simulink_export/html/rtGetNaN_h.html create mode 100644 simulink_export/html/rt_logging_c.html create mode 100644 simulink_export/html/rt_nonfinite_cpp.html create mode 100644 simulink_export/html/rt_nonfinite_h.html create mode 100644 simulink_export/html/rtmodel_h.html create mode 100644 simulink_export/html/rtwhilite.js create mode 100644 simulink_export/html/rtwmsg.html create mode 100644 simulink_export/html/rtwreport.css create mode 100644 simulink_export/html/rtwreport_utils.js create mode 100644 simulink_export/html/rtwshrink.js create mode 100644 simulink_export/html/rtwtypes_h.html create mode 100644 simulink_export/html/search.js create mode 100644 simulink_export/html/spinner.gif create mode 100644 simulink_export/make_exception.mat create mode 100644 simulink_export/modelsources.txt create mode 100644 simulink_export/multiword_types.h create mode 100644 simulink_export/rtGetInf.cpp create mode 100644 simulink_export/rtGetInf.h create mode 100644 simulink_export/rtGetNaN.cpp create mode 100644 simulink_export/rtGetNaN.h create mode 100644 simulink_export/rt_nonfinite.cpp create mode 100644 simulink_export/rt_nonfinite.h create mode 100644 simulink_export/rtmodel.h create mode 100644 simulink_export/rtw_proj.tmw create mode 100644 simulink_export/rtwtypes.h create mode 100644 simulink_export/rtwtypeschksum.mat create mode 100644 simulink_export/tmwinternal/simulink_cache.xml diff --git a/simulink_export/Arduino_skal.cpp b/simulink_export/Arduino_skal.cpp new file mode 100644 index 0000000..4c35e1d --- /dev/null +++ b/simulink_export/Arduino_skal.cpp @@ -0,0 +1,605 @@ +/* + * Arduino_skal.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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#include "Arduino_skal.h" +#include "Arduino_skal_private.h" + +/* + * This function updates continuous states using the ODE3 fixed-step + * solver algorithm + */ +void Arduino_skalModelClass::rt_ertODEUpdateContinuousStates(RTWSolverInfo *si ) +{ + /* Solver Matrices */ + static const real_T rt_ODE3_A[3] = { + 1.0/2.0, 3.0/4.0, 1.0 + }; + + static const real_T rt_ODE3_B[3][3] = { + { 1.0/2.0, 0.0, 0.0 }, + + { 0.0, 3.0/4.0, 0.0 }, + + { 2.0/9.0, 1.0/3.0, 4.0/9.0 } + }; + + time_T t = rtsiGetT(si); + time_T tnew = rtsiGetSolverStopTime(si); + time_T h = rtsiGetStepSize(si); + real_T *x = rtsiGetContStates(si); + ODE3_IntgData *id = static_cast(rtsiGetSolverData(si)); + real_T *y = id->y; + real_T *f0 = id->f[0]; + real_T *f1 = id->f[1]; + real_T *f2 = id->f[2]; + real_T hB[3]; + int_T i; + int_T nXc = 4; + rtsiSetSimTimeStep(si,MINOR_TIME_STEP); + + /* Save the state values at time t in y, we'll use x as ynew. */ + (void) std::memcpy(y, x, + static_cast(nXc)*sizeof(real_T)); + + /* Assumes that rtsiSetT and ModelOutputs are up-to-date */ + /* f0 = f(t,y) */ + rtsiSetdX(si, f0); + Arduino_skal_derivatives(); + + /* f(:,2) = feval(odefile, t + hA(1), y + f*hB(:,1), args(:)(*)); */ + hB[0] = h * rt_ODE3_B[0][0]; + for (i = 0; i < nXc; i++) { + x[i] = y[i] + (f0[i]*hB[0]); + } + + rtsiSetT(si, t + h*rt_ODE3_A[0]); + rtsiSetdX(si, f1); + this->step(); + Arduino_skal_derivatives(); + + /* f(:,3) = feval(odefile, t + hA(2), y + f*hB(:,2), args(:)(*)); */ + for (i = 0; i <= 1; i++) { + hB[i] = h * rt_ODE3_B[1][i]; + } + + for (i = 0; i < nXc; i++) { + x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1]); + } + + rtsiSetT(si, t + h*rt_ODE3_A[1]); + rtsiSetdX(si, f2); + this->step(); + Arduino_skal_derivatives(); + + /* tnew = t + hA(3); + ynew = y + f*hB(:,3); */ + for (i = 0; i <= 2; i++) { + hB[i] = h * rt_ODE3_B[2][i]; + } + + for (i = 0; i < nXc; i++) { + x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1] + f2[i]*hB[2]); + } + + rtsiSetT(si, tnew); + rtsiSetSimTimeStep(si,MAJOR_TIME_STEP); +} + +/* Model step function */ +void Arduino_skalModelClass::step() +{ + const real_T *tmp_3; + real_T currentTime; + real_T tmp; + real_T tmp_0; + real_T tmp_1; + real_T tmp_2; + real_T u0; + int32_T i; + int32_T i_0; + if (rtmIsMajorTimeStep((&Arduino_skal_M))) { + /* set solver stop time */ + if (!((&Arduino_skal_M)->Timing.clockTick0+1)) { + rtsiSetSolverStopTime(&(&Arduino_skal_M)->solverInfo, (((&Arduino_skal_M + )->Timing.clockTickH0 + 1) * (&Arduino_skal_M)->Timing.stepSize0 * + 4294967296.0)); + } else { + rtsiSetSolverStopTime(&(&Arduino_skal_M)->solverInfo, (((&Arduino_skal_M + )->Timing.clockTick0 + 1) * (&Arduino_skal_M)->Timing.stepSize0 + + (&Arduino_skal_M)->Timing.clockTickH0 * (&Arduino_skal_M) + ->Timing.stepSize0 * 4294967296.0)); + } + } /* end MajorTimeStep */ + + /* Update absolute time of base rate at minor time step */ + if (rtmIsMinorTimeStep((&Arduino_skal_M))) { + (&Arduino_skal_M)->Timing.t[0] = rtsiGetT(&(&Arduino_skal_M)->solverInfo); + } + + if (rtmIsMajorTimeStep((&Arduino_skal_M))) { + /* Constant: '/X0' */ + Arduino_skal_B.X0[0] = Arduino_skal_P.X0_Value[0]; + Arduino_skal_B.X0[1] = Arduino_skal_P.X0_Value[1]; + Arduino_skal_B.X0[2] = Arduino_skal_P.X0_Value[2]; + Arduino_skal_B.X0[3] = Arduino_skal_P.X0_Value[3]; + } + + /* Integrator: '/MemoryX' */ + if (Arduino_skal_DW.MemoryX_IWORK != 0) { + Arduino_skal_X.MemoryX_CSTATE[0] = Arduino_skal_B.X0[0]; + Arduino_skal_X.MemoryX_CSTATE[1] = Arduino_skal_B.X0[1]; + Arduino_skal_X.MemoryX_CSTATE[2] = Arduino_skal_B.X0[2]; + Arduino_skal_X.MemoryX_CSTATE[3] = Arduino_skal_B.X0[3]; + } + + /* Integrator: '/MemoryX' */ + Arduino_skal_B.MemoryX[0] = Arduino_skal_X.MemoryX_CSTATE[0]; + + /* Gain: '/Gain' */ + u0 = Arduino_skal_P.K[0] * Arduino_skal_B.MemoryX[0]; + + /* Integrator: '/MemoryX' */ + Arduino_skal_B.MemoryX[1] = Arduino_skal_X.MemoryX_CSTATE[1]; + + /* Gain: '/Gain' */ + u0 += Arduino_skal_P.K[1] * Arduino_skal_B.MemoryX[1]; + + /* Integrator: '/MemoryX' */ + Arduino_skal_B.MemoryX[2] = Arduino_skal_X.MemoryX_CSTATE[2]; + + /* Gain: '/Gain' */ + u0 += Arduino_skal_P.K[2] * Arduino_skal_B.MemoryX[2]; + + /* Integrator: '/MemoryX' */ + Arduino_skal_B.MemoryX[3] = Arduino_skal_X.MemoryX_CSTATE[3]; + + /* Gain: '/Gain' */ + u0 += Arduino_skal_P.K[3] * Arduino_skal_B.MemoryX[3]; + + /* Gain: '/Gain' */ + Arduino_skal_B.Gain = u0; + if (rtmIsMajorTimeStep((&Arduino_skal_M))) { + /* MATLAB Function: '/SqrtUsedFcn' incorporates: + * Constant: '/CovarianceZ' + * Constant: '/isSqrtUsed' + */ + /* : if isSqrtUsed */ + if (Arduino_skal_P.isSqrtUsed_Value) { + /* : P = u*u.'; */ + for (i = 0; i < 4; i++) { + for (i_0 = 0; i_0 < 4; i_0++) { + Arduino_skal_B.P[i_0 + (i << 2)] = 0.0; + Arduino_skal_B.P[i_0 + (i << 2)] += + Arduino_skal_P.CovarianceZ_Value[i_0] * + Arduino_skal_P.CovarianceZ_Value[i]; + Arduino_skal_B.P[i_0 + (i << 2)] += + Arduino_skal_P.CovarianceZ_Value[i_0 + 4] * + Arduino_skal_P.CovarianceZ_Value[i + 4]; + Arduino_skal_B.P[i_0 + (i << 2)] += + Arduino_skal_P.CovarianceZ_Value[i_0 + 8] * + Arduino_skal_P.CovarianceZ_Value[i + 8]; + Arduino_skal_B.P[i_0 + (i << 2)] += + Arduino_skal_P.CovarianceZ_Value[i_0 + 12] * + Arduino_skal_P.CovarianceZ_Value[i + 12]; + } + } + } else { + /* : else */ + /* : P = u; */ + std::memcpy(&Arduino_skal_B.P[0], &Arduino_skal_P.CovarianceZ_Value[0], + sizeof(real_T) << 4U); + } + + /* End of MATLAB Function: '/SqrtUsedFcn' */ + } + + /* Product: '/A[k]*xhat[k|k-1]' incorporates: + * Constant: '/A' + */ + tmp_3 = &Arduino_skal_P.A_Value[0]; + tmp = Arduino_skal_B.MemoryX[0]; + tmp_0 = Arduino_skal_B.MemoryX[1]; + tmp_1 = Arduino_skal_B.MemoryX[2]; + tmp_2 = Arduino_skal_B.MemoryX[3]; + for (i = 0; i < 4; i++) { + u0 = tmp_3[i] * tmp; + u0 += tmp_3[i + 4] * tmp_0; + u0 += tmp_3[i + 8] * tmp_1; + u0 += tmp_3[i + 12] * tmp_2; + + /* Product: '/A[k]*xhat[k|k-1]' */ + Arduino_skal_B.Akxhatkk1[i] = u0; + } + + /* End of Product: '/A[k]*xhat[k|k-1]' */ + + /* Step: '/Step' */ + currentTime = (&Arduino_skal_M)->Timing.t[0]; + if (currentTime < Arduino_skal_P.Step_Time) { + /* Step: '/Step' */ + Arduino_skal_B.Step = Arduino_skal_P.Step_Y0; + } else { + /* Step: '/Step' */ + Arduino_skal_B.Step = Arduino_skal_P.Step_YFinal; + } + + /* End of Step: '/Step' */ + + /* Gain: '/Kr' */ + Arduino_skal_B.Kr = Arduino_skal_P.Kr * Arduino_skal_B.Step; + + /* Sum: '/Sum5' */ + Arduino_skal_B.Sum5 = Arduino_skal_B.Kr - Arduino_skal_B.Gain; + + /* Saturate: '/Saturation' */ + u0 = Arduino_skal_B.Sum5; + tmp = Arduino_skal_P.Saturation_LowerSat; + tmp_0 = Arduino_skal_P.Saturation_UpperSat; + if (u0 > tmp_0) { + /* Saturate: '/Saturation' */ + Arduino_skal_B.Saturation = tmp_0; + } else if (u0 < tmp) { + /* Saturate: '/Saturation' */ + Arduino_skal_B.Saturation = tmp; + } else { + /* Saturate: '/Saturation' */ + Arduino_skal_B.Saturation = u0; + } + + /* End of Saturate: '/Saturation' */ + + /* Product: '/B[k]*u[k]' incorporates: + * Constant: '/B' + */ + currentTime = Arduino_skal_B.Saturation; + u0 = Arduino_skal_P.B_Value[0]; + + /* Product: '/B[k]*u[k]' */ + Arduino_skal_B.Bkuk[0] = u0 * currentTime; + + /* Product: '/B[k]*u[k]' incorporates: + * Constant: '/B' + */ + u0 = Arduino_skal_P.B_Value[1]; + + /* Product: '/B[k]*u[k]' */ + Arduino_skal_B.Bkuk[1] = u0 * currentTime; + + /* Product: '/B[k]*u[k]' incorporates: + * Constant: '/B' + */ + u0 = Arduino_skal_P.B_Value[2]; + + /* Product: '/B[k]*u[k]' */ + Arduino_skal_B.Bkuk[2] = u0 * currentTime; + + /* Product: '/B[k]*u[k]' incorporates: + * Constant: '/B' + */ + u0 = Arduino_skal_P.B_Value[3]; + + /* Product: '/B[k]*u[k]' */ + Arduino_skal_B.Bkuk[3] = u0 * currentTime; + + /* Outputs for Enabled SubSystem: '/MeasurementUpdate' incorporates: + * EnablePort: '/Enable' + */ + if (rtmIsMajorTimeStep((&Arduino_skal_M)) && rtmIsMajorTimeStep + ((&Arduino_skal_M))) { + /* Constant: '/Enable' */ + if (Arduino_skal_P.Enable_Value) { + Arduino_skal_DW.MeasurementUpdate_MODE = true; + } else if (Arduino_skal_DW.MeasurementUpdate_MODE) { + /* Disable for Product: '/Product3' incorporates: + * Outport: '/L*(y[k]-yhat[k|k-1])' + */ + Arduino_skal_B.Product3[0] = Arduino_skal_P.Lykyhatkk1_Y0; + Arduino_skal_B.Product3[1] = Arduino_skal_P.Lykyhatkk1_Y0; + Arduino_skal_B.Product3[2] = Arduino_skal_P.Lykyhatkk1_Y0; + Arduino_skal_B.Product3[3] = Arduino_skal_P.Lykyhatkk1_Y0; + Arduino_skal_DW.MeasurementUpdate_MODE = false; + } + + /* End of Constant: '/Enable' */ + } + + if (Arduino_skal_DW.MeasurementUpdate_MODE) { + /* Product: '/C[k]*xhat[k|k-1]' incorporates: + * Constant: '/C' + * Product: '/Product3' + */ + tmp_3 = &Arduino_skal_P.C_Value[0]; + tmp = Arduino_skal_B.MemoryX[0]; + tmp_0 = Arduino_skal_B.MemoryX[1]; + tmp_1 = Arduino_skal_B.MemoryX[2]; + tmp_2 = Arduino_skal_B.MemoryX[3]; + + /* Product: '/D[k]*u[k]' */ + currentTime = Arduino_skal_B.Saturation; + for (i = 0; i < 2; i++) { + /* Product: '/C[k]*xhat[k|k-1]' */ + u0 = tmp_3[i] * tmp; + u0 += tmp_3[i + 2] * tmp_0; + u0 += tmp_3[i + 4] * tmp_1; + u0 += tmp_3[i + 6] * tmp_2; + + /* Product: '/C[k]*xhat[k|k-1]' */ + Arduino_skal_B.Ckxhatkk1[i] = u0; + + /* Product: '/D[k]*u[k]' incorporates: + * Constant: '/D' + */ + u0 = Arduino_skal_P.D_Value[i]; + + /* Product: '/D[k]*u[k]' */ + Arduino_skal_B.Dkuk[i] = u0 * currentTime; + + /* Sum: '/Add1' incorporates: + * Product: '/D[k]*u[k]' + */ + Arduino_skal_B.yhatkk1[i] = Arduino_skal_B.Ckxhatkk1[i] + + Arduino_skal_B.Dkuk[i]; + + /* Sum: '/Sum' incorporates: + * Constant: '/Constant' + * Sum: '/Add1' + */ + Arduino_skal_B.Sum[i] = Arduino_skal_P.Constant_Value[i] - + Arduino_skal_B.yhatkk1[i]; + } + + /* Product: '/Product3' incorporates: + * Constant: '/KalmanGainL' + * Product: '/C[k]*xhat[k|k-1]' + * Sum: '/Sum' + */ + tmp_3 = &Arduino_skal_P.KalmanGainL_Value[0]; + tmp = Arduino_skal_B.Sum[0]; + tmp_0 = Arduino_skal_B.Sum[1]; + for (i = 0; i < 4; i++) { + /* Product: '/Product3' */ + Arduino_skal_B.Product3[i] = 0.0; + Arduino_skal_B.Product3[i] += tmp_3[i] * tmp; + Arduino_skal_B.Product3[i] += tmp_3[i + 4] * tmp_0; + } + } + + /* End of Outputs for SubSystem: '/MeasurementUpdate' */ + + /* Sum: '/Add' incorporates: + * Product: '/B[k]*u[k]' + * Product: '/Product3' + */ + Arduino_skal_B.Add[0] = (Arduino_skal_B.Bkuk[0] + Arduino_skal_B.Akxhatkk1[0]) + + Arduino_skal_B.Product3[0]; + Arduino_skal_B.Add[1] = (Arduino_skal_B.Bkuk[1] + Arduino_skal_B.Akxhatkk1[1]) + + Arduino_skal_B.Product3[1]; + Arduino_skal_B.Add[2] = (Arduino_skal_B.Bkuk[2] + Arduino_skal_B.Akxhatkk1[2]) + + Arduino_skal_B.Product3[2]; + Arduino_skal_B.Add[3] = (Arduino_skal_B.Bkuk[3] + Arduino_skal_B.Akxhatkk1[3]) + + Arduino_skal_B.Product3[3]; + if (rtmIsMajorTimeStep((&Arduino_skal_M))) { + /* Matfile logging */ + rt_UpdateTXYLogVars((&Arduino_skal_M)->rtwLogInfo, ((&Arduino_skal_M) + ->Timing.t)); + } /* end MajorTimeStep */ + + if (rtmIsMajorTimeStep((&Arduino_skal_M))) { + /* Update for Integrator: '/MemoryX' */ + Arduino_skal_DW.MemoryX_IWORK = 0; + } /* end MajorTimeStep */ + + if (rtmIsMajorTimeStep((&Arduino_skal_M))) { + /* signal main to stop simulation */ + { /* Sample time: [0.0s, 0.0s] */ + if ((rtmGetTFinal((&Arduino_skal_M))!=-1) && + !((rtmGetTFinal((&Arduino_skal_M))-((((&Arduino_skal_M) + ->Timing.clockTick1+(&Arduino_skal_M)->Timing.clockTickH1* + 4294967296.0)) * 0.2)) > ((((&Arduino_skal_M)->Timing.clockTick1+ + (&Arduino_skal_M)->Timing.clockTickH1* 4294967296.0)) * 0.2) * + (DBL_EPSILON))) { + rtmSetErrorStatus((&Arduino_skal_M), "Simulation finished"); + } + } + + rt_ertODEUpdateContinuousStates(&(&Arduino_skal_M)->solverInfo); + + /* Update absolute time for base rate */ + /* The "clockTick0" counts the number of times the code of this task has + * been executed. The absolute time is the multiplication of "clockTick0" + * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not + * overflow during the application lifespan selected. + * Timer of this task consists of two 32 bit unsigned integers. + * The two integers represent the low bits Timing.clockTick0 and the high bits + * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment. + */ + if (!(++(&Arduino_skal_M)->Timing.clockTick0)) { + ++(&Arduino_skal_M)->Timing.clockTickH0; + } + + (&Arduino_skal_M)->Timing.t[0] = rtsiGetSolverStopTime(&(&Arduino_skal_M) + ->solverInfo); + + { + /* Update absolute timer for sample time: [0.2s, 0.0s] */ + /* The "clockTick1" counts the number of times the code of this task has + * been executed. The resolution of this integer timer is 0.2, which is the step size + * of the task. Size of "clockTick1" ensures timer will not overflow during the + * application lifespan selected. + * Timer of this task consists of two 32 bit unsigned integers. + * The two integers represent the low bits Timing.clockTick1 and the high bits + * Timing.clockTickH1. When the low bit overflows to 0, the high bits increment. + */ + (&Arduino_skal_M)->Timing.clockTick1++; + if (!(&Arduino_skal_M)->Timing.clockTick1) { + (&Arduino_skal_M)->Timing.clockTickH1++; + } + } + } /* end MajorTimeStep */ +} + +/* Derivatives for root system: '' */ +void Arduino_skalModelClass::Arduino_skal_derivatives() +{ + XDot_Arduino_skal_T *_rtXdot; + _rtXdot = ((XDot_Arduino_skal_T *) (&Arduino_skal_M)->derivs); + + /* Derivatives for Integrator: '/MemoryX' */ + _rtXdot->MemoryX_CSTATE[0] = Arduino_skal_B.Add[0]; + _rtXdot->MemoryX_CSTATE[1] = Arduino_skal_B.Add[1]; + _rtXdot->MemoryX_CSTATE[2] = Arduino_skal_B.Add[2]; + _rtXdot->MemoryX_CSTATE[3] = Arduino_skal_B.Add[3]; +} + +/* Model initialize function */ +void Arduino_skalModelClass::initialize() +{ + /* Registration code */ + + /* initialize non-finites */ + rt_InitInfAndNaN(sizeof(real_T)); + + { + /* Setup solver object */ + rtsiSetSimTimeStepPtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M) + ->Timing.simTimeStep); + rtsiSetTPtr(&(&Arduino_skal_M)->solverInfo, &rtmGetTPtr((&Arduino_skal_M))); + rtsiSetStepSizePtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M) + ->Timing.stepSize0); + rtsiSetdXPtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M)->derivs); + rtsiSetContStatesPtr(&(&Arduino_skal_M)->solverInfo, (real_T **) + &(&Arduino_skal_M)->contStates); + rtsiSetNumContStatesPtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M) + ->Sizes.numContStates); + rtsiSetNumPeriodicContStatesPtr(&(&Arduino_skal_M)->solverInfo, + &(&Arduino_skal_M)->Sizes.numPeriodicContStates); + rtsiSetPeriodicContStateIndicesPtr(&(&Arduino_skal_M)->solverInfo, + &(&Arduino_skal_M)->periodicContStateIndices); + rtsiSetPeriodicContStateRangesPtr(&(&Arduino_skal_M)->solverInfo, + &(&Arduino_skal_M)->periodicContStateRanges); + rtsiSetErrorStatusPtr(&(&Arduino_skal_M)->solverInfo, (&rtmGetErrorStatus + ((&Arduino_skal_M)))); + rtsiSetRTModelPtr(&(&Arduino_skal_M)->solverInfo, (&Arduino_skal_M)); + } + + rtsiSetSimTimeStep(&(&Arduino_skal_M)->solverInfo, MAJOR_TIME_STEP); + (&Arduino_skal_M)->intgData.y = (&Arduino_skal_M)->odeY; + (&Arduino_skal_M)->intgData.f[0] = (&Arduino_skal_M)->odeF[0]; + (&Arduino_skal_M)->intgData.f[1] = (&Arduino_skal_M)->odeF[1]; + (&Arduino_skal_M)->intgData.f[2] = (&Arduino_skal_M)->odeF[2]; + (&Arduino_skal_M)->contStates = ((X_Arduino_skal_T *) &Arduino_skal_X); + rtsiSetSolverData(&(&Arduino_skal_M)->solverInfo, static_cast + (&(&Arduino_skal_M)->intgData)); + rtsiSetSolverName(&(&Arduino_skal_M)->solverInfo,"ode3"); + rtmSetTPtr((&Arduino_skal_M), &(&Arduino_skal_M)->Timing.tArray[0]); + rtmSetTFinal((&Arduino_skal_M), 10.0); + (&Arduino_skal_M)->Timing.stepSize0 = 0.2; + rtmSetFirstInitCond((&Arduino_skal_M), 1); + + /* Setup for data logging */ + { + static RTWLogInfo rt_DataLoggingInfo; + rt_DataLoggingInfo.loggingInterval = (NULL); + (&Arduino_skal_M)->rtwLogInfo = &rt_DataLoggingInfo; + } + + /* Setup for data logging */ + { + rtliSetLogXSignalInfo((&Arduino_skal_M)->rtwLogInfo, (NULL)); + rtliSetLogXSignalPtrs((&Arduino_skal_M)->rtwLogInfo, (NULL)); + rtliSetLogT((&Arduino_skal_M)->rtwLogInfo, "tout"); + rtliSetLogX((&Arduino_skal_M)->rtwLogInfo, ""); + rtliSetLogXFinal((&Arduino_skal_M)->rtwLogInfo, ""); + rtliSetLogVarNameModifier((&Arduino_skal_M)->rtwLogInfo, "rt_"); + rtliSetLogFormat((&Arduino_skal_M)->rtwLogInfo, 4); + rtliSetLogMaxRows((&Arduino_skal_M)->rtwLogInfo, 0); + rtliSetLogDecimation((&Arduino_skal_M)->rtwLogInfo, 1); + rtliSetLogY((&Arduino_skal_M)->rtwLogInfo, ""); + rtliSetLogYSignalInfo((&Arduino_skal_M)->rtwLogInfo, (NULL)); + rtliSetLogYSignalPtrs((&Arduino_skal_M)->rtwLogInfo, (NULL)); + } + + /* Matfile logging */ + rt_StartDataLoggingWithStartTime((&Arduino_skal_M)->rtwLogInfo, 0.0, + rtmGetTFinal((&Arduino_skal_M)), (&Arduino_skal_M)->Timing.stepSize0, + (&rtmGetErrorStatus((&Arduino_skal_M)))); + + /* Start for Constant: '/X0' */ + Arduino_skal_B.X0[0] = Arduino_skal_P.X0_Value[0]; + Arduino_skal_B.X0[1] = Arduino_skal_P.X0_Value[1]; + Arduino_skal_B.X0[2] = Arduino_skal_P.X0_Value[2]; + Arduino_skal_B.X0[3] = Arduino_skal_P.X0_Value[3]; + + /* InitializeConditions for Integrator: '/MemoryX' */ + if (rtmIsFirstInitCond((&Arduino_skal_M))) { + Arduino_skal_X.MemoryX_CSTATE[0] = 0.0; + Arduino_skal_X.MemoryX_CSTATE[1] = 0.0; + Arduino_skal_X.MemoryX_CSTATE[2] = 0.0; + Arduino_skal_X.MemoryX_CSTATE[3] = 0.0; + } + + Arduino_skal_DW.MemoryX_IWORK = 1; + + /* End of InitializeConditions for Integrator: '/MemoryX' */ + + /* SystemInitialize for Enabled SubSystem: '/MeasurementUpdate' */ + /* SystemInitialize for Product: '/Product3' incorporates: + * Outport: '/L*(y[k]-yhat[k|k-1])' + */ + Arduino_skal_B.Product3[0] = Arduino_skal_P.Lykyhatkk1_Y0; + Arduino_skal_B.Product3[1] = Arduino_skal_P.Lykyhatkk1_Y0; + Arduino_skal_B.Product3[2] = Arduino_skal_P.Lykyhatkk1_Y0; + Arduino_skal_B.Product3[3] = Arduino_skal_P.Lykyhatkk1_Y0; + + /* End of SystemInitialize for SubSystem: '/MeasurementUpdate' */ + + /* set "at time zero" to false */ + if (rtmIsFirstInitCond((&Arduino_skal_M))) { + rtmSetFirstInitCond((&Arduino_skal_M), 0); + } +} + +/* Model terminate function */ +void Arduino_skalModelClass::terminate() +{ + /* (no terminate code required) */ +} + +/* Constructor */ +Arduino_skalModelClass::Arduino_skalModelClass() : + Arduino_skal_B(), + Arduino_skal_DW(), + Arduino_skal_X(), + Arduino_skal_M() +{ + /* Currently there is no constructor body generated.*/ +} + +/* Destructor */ +Arduino_skalModelClass::~Arduino_skalModelClass() +{ + /* Currently there is no destructor body generated.*/ +} + +/* Real-Time Model get method */ +RT_MODEL_Arduino_skal_T * Arduino_skalModelClass::getRTM() +{ + return (&Arduino_skal_M); +} diff --git a/simulink_export/Arduino_skal.h b/simulink_export/Arduino_skal.h new file mode 100644 index 0000000..eb07e78 --- /dev/null +++ b/simulink_export/Arduino_skal.h @@ -0,0 +1,480 @@ +/* + * Arduino_skal.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTW_HEADER_Arduino_skal_h_ +#define RTW_HEADER_Arduino_skal_h_ +#include +#include +#include +#include "rtwtypes.h" +#include "rtw_continuous.h" +#include "rtw_solver.h" +#include "rt_logging.h" +#include "Arduino_skal_types.h" + +/* Shared type includes */ +#include "multiword_types.h" +#include "rt_nonfinite.h" + +/* Macros for accessing real-time model data structure */ +#ifndef rtmGetContStateDisabled +#define rtmGetContStateDisabled(rtm) ((rtm)->contStateDisabled) +#endif + +#ifndef rtmSetContStateDisabled +#define rtmSetContStateDisabled(rtm, val) ((rtm)->contStateDisabled = (val)) +#endif + +#ifndef rtmGetContStates +#define rtmGetContStates(rtm) ((rtm)->contStates) +#endif + +#ifndef rtmSetContStates +#define rtmSetContStates(rtm, val) ((rtm)->contStates = (val)) +#endif + +#ifndef rtmGetContTimeOutputInconsistentWithStateAtMajorStepFlag +#define rtmGetContTimeOutputInconsistentWithStateAtMajorStepFlag(rtm) ((rtm)->CTOutputIncnstWithState) +#endif + +#ifndef rtmSetContTimeOutputInconsistentWithStateAtMajorStepFlag +#define rtmSetContTimeOutputInconsistentWithStateAtMajorStepFlag(rtm, val) ((rtm)->CTOutputIncnstWithState = (val)) +#endif + +#ifndef rtmGetDerivCacheNeedsReset +#define rtmGetDerivCacheNeedsReset(rtm) ((rtm)->derivCacheNeedsReset) +#endif + +#ifndef rtmSetDerivCacheNeedsReset +#define rtmSetDerivCacheNeedsReset(rtm, val) ((rtm)->derivCacheNeedsReset = (val)) +#endif + +#ifndef rtmGetFinalTime +#define rtmGetFinalTime(rtm) ((rtm)->Timing.tFinal) +#endif + +#ifndef rtmGetIntgData +#define rtmGetIntgData(rtm) ((rtm)->intgData) +#endif + +#ifndef rtmSetIntgData +#define rtmSetIntgData(rtm, val) ((rtm)->intgData = (val)) +#endif + +#ifndef rtmGetOdeF +#define rtmGetOdeF(rtm) ((rtm)->odeF) +#endif + +#ifndef rtmSetOdeF +#define rtmSetOdeF(rtm, val) ((rtm)->odeF = (val)) +#endif + +#ifndef rtmGetOdeY +#define rtmGetOdeY(rtm) ((rtm)->odeY) +#endif + +#ifndef rtmSetOdeY +#define rtmSetOdeY(rtm, val) ((rtm)->odeY = (val)) +#endif + +#ifndef rtmGetPeriodicContStateIndices +#define rtmGetPeriodicContStateIndices(rtm) ((rtm)->periodicContStateIndices) +#endif + +#ifndef rtmSetPeriodicContStateIndices +#define rtmSetPeriodicContStateIndices(rtm, val) ((rtm)->periodicContStateIndices = (val)) +#endif + +#ifndef rtmGetPeriodicContStateRanges +#define rtmGetPeriodicContStateRanges(rtm) ((rtm)->periodicContStateRanges) +#endif + +#ifndef rtmSetPeriodicContStateRanges +#define rtmSetPeriodicContStateRanges(rtm, val) ((rtm)->periodicContStateRanges = (val)) +#endif + +#ifndef rtmGetRTWLogInfo +#define rtmGetRTWLogInfo(rtm) ((rtm)->rtwLogInfo) +#endif + +#ifndef rtmGetZCCacheNeedsReset +#define rtmGetZCCacheNeedsReset(rtm) ((rtm)->zCCacheNeedsReset) +#endif + +#ifndef rtmSetZCCacheNeedsReset +#define rtmSetZCCacheNeedsReset(rtm, val) ((rtm)->zCCacheNeedsReset = (val)) +#endif + +#ifndef rtmGetdX +#define rtmGetdX(rtm) ((rtm)->derivs) +#endif + +#ifndef rtmSetdX +#define rtmSetdX(rtm, val) ((rtm)->derivs = (val)) +#endif + +#ifndef rtmGetErrorStatus +#define rtmGetErrorStatus(rtm) ((rtm)->errorStatus) +#endif + +#ifndef rtmSetErrorStatus +#define rtmSetErrorStatus(rtm, val) ((rtm)->errorStatus = (val)) +#endif + +#ifndef rtmGetStopRequested +#define rtmGetStopRequested(rtm) ((rtm)->Timing.stopRequestedFlag) +#endif + +#ifndef rtmSetStopRequested +#define rtmSetStopRequested(rtm, val) ((rtm)->Timing.stopRequestedFlag = (val)) +#endif + +#ifndef rtmGetStopRequestedPtr +#define rtmGetStopRequestedPtr(rtm) (&((rtm)->Timing.stopRequestedFlag)) +#endif + +#ifndef rtmGetT +#define rtmGetT(rtm) (rtmGetTPtr((rtm))[0]) +#endif + +#ifndef rtmGetTFinal +#define rtmGetTFinal(rtm) ((rtm)->Timing.tFinal) +#endif + +#ifndef rtmGetTPtr +#define rtmGetTPtr(rtm) ((rtm)->Timing.t) +#endif + +/* Block signals (default storage) */ +struct B_Arduino_skal_T { + real_T X0[4]; /* '/X0' */ + real_T MemoryX[4]; /* '/MemoryX' */ + real_T Gain; /* '/Gain' */ + real_T Akxhatkk1[4]; /* '/A[k]*xhat[k|k-1]' */ + real_T Step; /* '/Step' */ + real_T Kr; /* '/Kr' */ + real_T Sum5; /* '/Sum5' */ + real_T Saturation; /* '/Saturation' */ + real_T Bkuk[4]; /* '/B[k]*u[k]' */ + real_T Add[4]; /* '/Add' */ + real_T Ckxhatkk1[2]; /* '/C[k]*xhat[k|k-1]' */ + real_T Dkuk[2]; /* '/D[k]*u[k]' */ + real_T yhatkk1[2]; /* '/Add1' */ + real_T Sum[2]; /* '/Sum' */ + real_T Product3[4]; /* '/Product3' */ + real_T P[16]; /* '/SqrtUsedFcn' */ +}; + +/* Block states (default storage) for system '' */ +struct DW_Arduino_skal_T { + int_T MemoryX_IWORK; /* '/MemoryX' */ + boolean_T MeasurementUpdate_MODE; /* '/MeasurementUpdate' */ +}; + +/* Continuous states (default storage) */ +struct X_Arduino_skal_T { + real_T MemoryX_CSTATE[4]; /* '/MemoryX' */ +}; + +/* State derivatives (default storage) */ +struct XDot_Arduino_skal_T { + real_T MemoryX_CSTATE[4]; /* '/MemoryX' */ +}; + +/* State disabled */ +struct XDis_Arduino_skal_T { + boolean_T MemoryX_CSTATE[4]; /* '/MemoryX' */ +}; + +#ifndef ODE3_INTG +#define ODE3_INTG + +/* ODE3 Integration Data */ +struct ODE3_IntgData { + real_T *y; /* output */ + real_T *f[3]; /* derivatives */ +}; + +#endif + +/* Parameters (default storage) */ +struct P_Arduino_skal_T_ { + real_T K[4]; /* Variable: K + * Referenced by: '/Gain' + */ + real_T Kr; /* Variable: Kr + * Referenced by: '/Kr' + */ + real_T Lykyhatkk1_Y0; /* Expression: 0 + * Referenced by: '/L*(y[k]-yhat[k|k-1])' + */ + real_T Constant_Value[2]; /* Expression: [1,1] + * Referenced by: '/Constant' + */ + real_T X0_Value[4]; /* Expression: pInitialization.X0 + * Referenced by: '/X0' + */ + real_T A_Value[16]; /* Expression: pInitialization.A + * Referenced by: '/A' + */ + real_T B_Value[4]; /* Expression: pInitialization.B + * Referenced by: '/B' + */ + real_T C_Value[8]; /* Expression: pInitialization.C + * Referenced by: '/C' + */ + real_T CovarianceZ_Value[16]; /* Expression: pInitialization.Z + * Referenced by: '/CovarianceZ' + */ + real_T KalmanGainL_Value[8]; /* Expression: pInitialization.L + * Referenced by: '/KalmanGainL' + */ + real_T D_Value[2]; /* Expression: pInitialization.D + * Referenced by: '/D' + */ + real_T Step_Time; /* Expression: 0 + * Referenced by: '/Step' + */ + real_T Step_Y0; /* Expression: 0 + * Referenced by: '/Step' + */ + real_T Step_YFinal; /* Expression: 0 + * Referenced by: '/Step' + */ + real_T Saturation_UpperSat; /* Expression: 11.5 + * Referenced by: '/Saturation' + */ + real_T Saturation_LowerSat; /* Expression: -11.5 + * Referenced by: '/Saturation' + */ + boolean_T isSqrtUsed_Value; /* Expression: pInitialization.isSqrtUsed + * Referenced by: '/isSqrtUsed' + */ + boolean_T Enable_Value; /* Expression: true() + * Referenced by: '/Enable' + */ +}; + +/* Real-time Model Data Structure */ +struct tag_RTM_Arduino_skal_T { + const char_T *errorStatus; + RTWLogInfo *rtwLogInfo; + RTWSolverInfo solverInfo; + X_Arduino_skal_T *contStates; + int_T *periodicContStateIndices; + real_T *periodicContStateRanges; + real_T *derivs; + boolean_T *contStateDisabled; + boolean_T zCCacheNeedsReset; + boolean_T derivCacheNeedsReset; + boolean_T CTOutputIncnstWithState; + real_T odeY[4]; + real_T odeF[3][4]; + ODE3_IntgData intgData; + + /* + * Sizes: + * The following substructure contains sizes information + * for many of the model attributes such as inputs, outputs, + * dwork, sample times, etc. + */ + struct { + int_T numContStates; + int_T numPeriodicContStates; + int_T numSampTimes; + } Sizes; + + /* + * Timing: + * The following substructure contains information regarding + * the timing information for the model. + */ + struct { + uint32_T clockTick0; + uint32_T clockTickH0; + time_T stepSize0; + uint32_T clockTick1; + uint32_T clockTickH1; + boolean_T firstInitCondFlag; + time_T tFinal; + SimTimeStep simTimeStep; + boolean_T stopRequestedFlag; + time_T *t; + time_T tArray[2]; + } Timing; +}; + +/* Class declaration for model Arduino_skal */ +class Arduino_skalModelClass { + /* public data and function members */ + public: + /* model initialize function */ + void initialize(); + + /* model step function */ + void step(); + + /* model terminate function */ + void terminate(); + + /* Constructor */ + Arduino_skalModelClass(); + + /* Destructor */ + ~Arduino_skalModelClass(); + + /* Real-Time Model get method */ + RT_MODEL_Arduino_skal_T * getRTM(); + + /* private data and function members */ + private: + /* Tunable parameters */ + static P_Arduino_skal_T Arduino_skal_P; + + /* Block signals */ + B_Arduino_skal_T Arduino_skal_B; + + /* Block states */ + DW_Arduino_skal_T Arduino_skal_DW; + X_Arduino_skal_T Arduino_skal_X; /* Block continuous states */ + + /* Real-Time Model */ + RT_MODEL_Arduino_skal_T Arduino_skal_M; + + /* Continuous states update member function*/ + void rt_ertODEUpdateContinuousStates(RTWSolverInfo *si ); + + /* Derivatives member function */ + void Arduino_skal_derivatives(); +}; + +/*- + * These blocks were eliminated from the model due to optimizations: + * + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Conversion' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Conversion' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/KalmanGainM' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Conversion' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/Data Type Duplicate' : Unused code path elimination + * Block '/G' : Unused code path elimination + * Block '/H' : Unused code path elimination + * Block '/N' : Unused code path elimination + * Block '/P0' : Unused code path elimination + * Block '/Q' : Unused code path elimination + * Block '/R' : Unused code path elimination + * Block '/CheckSignalProperties' : Unused code path elimination + * Block '/CheckSignalProperties' : Unused code path elimination + * Block '/Conversion' : Eliminate redundant data type conversion + * Block '/Conversion' : Eliminate redundant data type conversion + * Block '/Conversion' : Eliminate redundant data type conversion + * Block '/Reshape' : Reshape block reduction + * Block '/ReshapeX0' : Reshape block reduction + * Block '/Reshapeu' : Reshape block reduction + * Block '/Reshapexhat' : Reshape block reduction + * Block '/Reshapey' : Reshape block reduction + */ + +/*- + * The generated code includes comments that allow you to trace directly + * back to the appropriate location in the model. The basic format + * is /block_name, where system is the system number (uniquely + * assigned by Simulink) and block_name is the name of the block. + * + * Use the MATLAB hilite_system command to trace the generated code back + * to the model. For example, + * + * hilite_system('') - opens system 3 + * hilite_system('/Kp') - opens and selects block Kp which resides in S3 + * + * Here is the system hierarchy for this model + * + * '' : 'Arduino_skal' + * '' : 'Arduino_skal/Kalman Filter' + * '' : 'Arduino_skal/Kalman Filter/CalculatePL' + * '' : 'Arduino_skal/Kalman Filter/CalculateYhat' + * '' : 'Arduino_skal/Kalman Filter/CovarianceOutputConfigurator' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionA' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionB' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionC' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionD' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionEnable' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionG' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionH' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionN' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionP' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionP0' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionQ' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionR' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionReset' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionX' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionX0' + * '' : 'Arduino_skal/Kalman Filter/DataTypeConversionu' + * '' : 'Arduino_skal/Kalman Filter/MemoryP' + * '' : 'Arduino_skal/Kalman Filter/Observer' + * '' : 'Arduino_skal/Kalman Filter/ReducedQRN' + * '' : 'Arduino_skal/Kalman Filter/Reset' + * '' : 'Arduino_skal/Kalman Filter/Reshapeyhat' + * '' : 'Arduino_skal/Kalman Filter/ScalarExpansionP0' + * '' : 'Arduino_skal/Kalman Filter/ScalarExpansionQ' + * '' : 'Arduino_skal/Kalman Filter/ScalarExpansionR' + * '' : 'Arduino_skal/Kalman Filter/UseCurrentEstimator' + * '' : 'Arduino_skal/Kalman Filter/checkA' + * '' : 'Arduino_skal/Kalman Filter/checkB' + * '' : 'Arduino_skal/Kalman Filter/checkC' + * '' : 'Arduino_skal/Kalman Filter/checkD' + * '' : 'Arduino_skal/Kalman Filter/checkEnable' + * '' : 'Arduino_skal/Kalman Filter/checkG' + * '' : 'Arduino_skal/Kalman Filter/checkH' + * '' : 'Arduino_skal/Kalman Filter/checkN' + * '' : 'Arduino_skal/Kalman Filter/checkP0' + * '' : 'Arduino_skal/Kalman Filter/checkQ' + * '' : 'Arduino_skal/Kalman Filter/checkR' + * '' : 'Arduino_skal/Kalman Filter/checkReset' + * '' : 'Arduino_skal/Kalman Filter/checkX0' + * '' : 'Arduino_skal/Kalman Filter/checku' + * '' : 'Arduino_skal/Kalman Filter/checky' + * '' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionL' + * '' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionM' + * '' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionP' + * '' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionZ' + * '' : 'Arduino_skal/Kalman Filter/CalculatePL/Ground' + * '' : 'Arduino_skal/Kalman Filter/CalculateYhat/Ground' + * '' : 'Arduino_skal/Kalman Filter/CovarianceOutputConfigurator/decideOutput' + * '' : 'Arduino_skal/Kalman Filter/CovarianceOutputConfigurator/decideOutput/SqrtUsedFcn' + * '' : 'Arduino_skal/Kalman Filter/Observer/MeasurementUpdate' + * '' : 'Arduino_skal/Kalman Filter/ReducedQRN/Ground' + */ +#endif /* RTW_HEADER_Arduino_skal_h_ */ diff --git a/simulink_export/Arduino_skal_data.cpp b/simulink_export/Arduino_skal_data.cpp new file mode 100644 index 0000000..9b0164a --- /dev/null +++ b/simulink_export/Arduino_skal_data.cpp @@ -0,0 +1,120 @@ +/* + * Arduino_skal_data.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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#include "Arduino_skal.h" +#include "Arduino_skal_private.h" + +/* Block parameters (default storage) */ +P_Arduino_skal_T Arduino_skalModelClass::Arduino_skal_P = { + /* Variable: K + * Referenced by: '/Gain' + */ + { -31.622776601683942, -21.286439360075747, 80.789376267003959, + 13.42463576551093 }, + + /* Variable: Kr + * Referenced by: '/Kr' + */ + 1.0, + + /* Expression: 0 + * Referenced by: '/L*(y[k]-yhat[k|k-1])' + */ + 0.0, + + /* Expression: [1,1] + * Referenced by: '/Constant' + */ + { 1.0, 1.0 }, + + /* Expression: pInitialization.X0 + * Referenced by: '/X0' + */ + { 0.0, 0.0, 0.0, 0.0 }, + + /* Expression: pInitialization.A + * Referenced by: '/A' + */ + { 0.0, 0.0, 0.0, 0.0, 1.0, -0.20780947085442231, 0.0, -0.52810302415000854, + 0.0, 13.239785742831822, 0.0, 58.601480177829842, 0.0, 0.0, 1.0, 0.0 }, + + /* Expression: pInitialization.B + * Referenced by: '/B' + */ + { 0.0, 2.078094708544223, 0.0, 5.2810302415000852 }, + + /* Expression: pInitialization.C + * Referenced by: '/C' + */ + { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, + + /* Expression: pInitialization.Z + * Referenced by: '/CovarianceZ' + */ + { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0 }, + + /* Expression: pInitialization.L + * Referenced by: '/KalmanGainL' + */ + { 2.829363352293504, 6.8371369304528766, 2.3809613355962305, + 17.882971156218495, 2.3809613355962278, 24.153756408336502, + 14.825995823889082, 112.73956452579047 }, + + /* Expression: pInitialization.D + * Referenced by: '/D' + */ + { 0.0, 0.0 }, + + /* Expression: 0 + * Referenced by: '/Step' + */ + 0.0, + + /* Expression: 0 + * Referenced by: '/Step' + */ + 0.0, + + /* Expression: 0 + * Referenced by: '/Step' + */ + 0.0, + + /* Expression: 11.5 + * Referenced by: '/Saturation' + */ + 11.5, + + /* Expression: -11.5 + * Referenced by: '/Saturation' + */ + -11.5, + + /* Expression: pInitialization.isSqrtUsed + * Referenced by: '/isSqrtUsed' + */ + 0, + + /* Expression: true() + * Referenced by: '/Enable' + */ + 1 +}; diff --git a/simulink_export/Arduino_skal_private.h b/simulink_export/Arduino_skal_private.h new file mode 100644 index 0000000..0bb63e4 --- /dev/null +++ b/simulink_export/Arduino_skal_private.h @@ -0,0 +1,55 @@ +/* + * Arduino_skal_private.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTW_HEADER_Arduino_skal_private_h_ +#define RTW_HEADER_Arduino_skal_private_h_ +#include "rtwtypes.h" +#include "builtin_typeid_types.h" +#include "multiword_types.h" + +/* Private macros used by the generated code to access rtModel */ +#ifndef rtmSetFirstInitCond +#define rtmSetFirstInitCond(rtm, val) ((rtm)->Timing.firstInitCondFlag = (val)) +#endif + +#ifndef rtmIsFirstInitCond +#define rtmIsFirstInitCond(rtm) ((rtm)->Timing.firstInitCondFlag) +#endif + +#ifndef rtmIsMajorTimeStep +#define rtmIsMajorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MAJOR_TIME_STEP) +#endif + +#ifndef rtmIsMinorTimeStep +#define rtmIsMinorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MINOR_TIME_STEP) +#endif + +#ifndef rtmSetTFinal +#define rtmSetTFinal(rtm, val) ((rtm)->Timing.tFinal = (val)) +#endif + +#ifndef rtmSetTPtr +#define rtmSetTPtr(rtm, val) ((rtm)->Timing.t = (val)) +#endif + +/* private model entry point functions */ +extern void Arduino_skal_derivatives(); + +#endif /* RTW_HEADER_Arduino_skal_private_h_ */ diff --git a/simulink_export/Arduino_skal_types.h b/simulink_export/Arduino_skal_types.h new file mode 100644 index 0000000..ce1411c --- /dev/null +++ b/simulink_export/Arduino_skal_types.h @@ -0,0 +1,35 @@ +/* + * Arduino_skal_types.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTW_HEADER_Arduino_skal_types_h_ +#define RTW_HEADER_Arduino_skal_types_h_ +#include "rtwtypes.h" +#include "builtin_typeid_types.h" +#include "multiword_types.h" + +/* Model Code Variants */ + +/* Parameters (default storage) */ +typedef struct P_Arduino_skal_T_ P_Arduino_skal_T; + +/* Forward declaration for rtModel */ +typedef struct tag_RTM_Arduino_skal_T RT_MODEL_Arduino_skal_T; + +#endif /* RTW_HEADER_Arduino_skal_types_h_ */ diff --git a/simulink_export/buildInfo.mat b/simulink_export/buildInfo.mat new file mode 100644 index 0000000000000000000000000000000000000000..1f88dc85d8570bc32832fc06b496aab83aaaa4c2 GIT binary patch literal 17303 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 W%X45iJL_l9>f19pdi@0e*`UEM)n7#b literal 0 HcmV?d00001 diff --git a/simulink_export/build_exception.mat b/simulink_export/build_exception.mat new file mode 100644 index 0000000000000000000000000000000000000000..a74e6bbcc5dea1c4face7aed1311787d9fa6975c GIT binary patch literal 2490 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 EzGQy73;+NC literal 0 HcmV?d00001 diff --git a/simulink_export/builtin_typeid_types.h b/simulink_export/builtin_typeid_types.h new file mode 100644 index 0000000..98eb060 --- /dev/null +++ b/simulink_export/builtin_typeid_types.h @@ -0,0 +1,46 @@ +/* + * builtin_typeid_types.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef BUILTIN_TYPEID_TYPES_H +#define BUILTIN_TYPEID_TYPES_H +#include "rtwtypes.h" +#ifndef BUILTIN_TYPEID_TYPES +#define BUILTIN_TYPEID_TYPES + +/* Enumeration of built-in data types */ +typedef enum { + SS_DOUBLE = 0, /* real_T */ + SS_SINGLE = 1, /* real32_T */ + SS_INT8 = 2, /* int8_T */ + SS_UINT8 = 3, /* uint8_T */ + SS_INT16 = 4, /* int16_T */ + SS_UINT16 = 5, /* uint16_T */ + SS_INT32 = 6, /* int32_T */ + SS_UINT32 = 7, /* uint32_T */ + SS_BOOLEAN = 8 /* boolean_T */ +} BuiltInDTypeId; + +#define SS_NUM_BUILT_IN_DTYPE ((int_T)SS_BOOLEAN+1) + +/* Enumeration for MAT-file logging code */ +typedef int_T DTypeId; + +#endif /* BUILTIN_TYPEID_TYPES */ +#endif /* BUILTIN_TYPEID_TYPES_H */ diff --git a/simulink_export/codeInfo.mat b/simulink_export/codeInfo.mat new file mode 100644 index 0000000000000000000000000000000000000000..a972ec6204a37ab2a7e8be2a618285300f546c24 GIT binary patch literal 13088 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%0DD_pO93Hu7?Zi-C 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�p;FCUcn&fPk;reD?6 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

)7g- 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 + + +Arduino_skal Code Generation Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/simulink_export/html/Arduino_skal_contents.html b/simulink_export/html/Arduino_skal_contents.html new file mode 100644 index 0000000..15b97f5 --- /dev/null +++ b/simulink_export/html/Arduino_skal_contents.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Contents + + +
+ +Summary + + +
+ +Subsystem Report + + +
+ +Code Interface Report + + +
+ +Eliminated Blocks + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Generated Code + + +
+ + + + + + + + + + + + +
+[-] + +Model files +
+ + + + + + + + + + + + + + + + + + + + +
+ +Arduino_skal.cpp + + +
+ +Arduino_skal.h + + +
+ +Arduino_skal_private.h + + +
+ +Arduino_skal_types.h + + +
+ +
+ +
+ + + + + + + + + + + + +
+[-] + +Data files +
+ + + + + + + + +
+ +Arduino_skal_data.cpp + + +
+ +
+ +
+ + + + + + + + + + + + +
+[+] + +Utility files (9) +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+[+] + +Interface files (1) +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+[+] + +Other files (1) +
+ + + + + + + + + + +
+ +
+
+ + + diff --git a/simulink_export/html/Arduino_skal_cpp.html b/simulink_export/html/Arduino_skal_cpp.html new file mode 100644 index 0000000..64d535b --- /dev/null +++ b/simulink_export/html/Arduino_skal_cpp.html @@ -0,0 +1,1228 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * Arduino_skal.cpp
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#include "Arduino_skal.h"
22#include "Arduino_skal_private.h"
23
24/*
25 * This function updates continuous states using the ODE3 fixed-step
26 * solver algorithm
27 */
28void Arduino_skalModelClass::rt_ertODEUpdateContinuousStates(RTWSolverInfo *si )
29{
30 /* Solver Matrices */
31 static const real_T rt_ODE3_A[3] = {
32 1.0/2.0, 3.0/4.0, 1.0
33 };
34
35 static const real_T rt_ODE3_B[3][3] = {
36 { 1.0/2.0, 0.0, 0.0 },
37
38 { 0.0, 3.0/4.0, 0.0 },
39
40 { 2.0/9.0, 1.0/3.0, 4.0/9.0 }
41 };
42
43 time_T t = rtsiGetT(si);
44 time_T tnew = rtsiGetSolverStopTime(si);
45 time_T h = rtsiGetStepSize(si);
46 real_T *x = rtsiGetContStates(si);
47 ODE3_IntgData *id = static_cast<ODE3_IntgData *>(rtsiGetSolverData(si));
48 real_T *y = id->y;
49 real_T *f0 = id->f[0];
50 real_T *f1 = id->f[1];
51 real_T *f2 = id->f[2];
52 real_T hB[3];
53 int_T i;
54 int_T nXc = 4;
55 rtsiSetSimTimeStep(si,MINOR_TIME_STEP);
56
57 /* Save the state values at time t in y, we'll use x as ynew. */
58 (void) std::memcpy(y, x,
59 static_cast<uint_T>(nXc)*sizeof(real_T));
60
61 /* Assumes that rtsiSetT and ModelOutputs are up-to-date */
62 /* f0 = f(t,y) */
63 rtsiSetdX(si, f0);
64 Arduino_skal_derivatives();
65
66 /* f(:,2) = feval(odefile, t + hA(1), y + f*hB(:,1), args(:)(*)); */
67 hB[0] = h * rt_ODE3_B[0][0];
68 for (i = 0; i < nXc; i++) {
69 x[i] = y[i] + (f0[i]*hB[0]);
70 }
71
72 rtsiSetT(si, t + h*rt_ODE3_A[0]);
73 rtsiSetdX(si, f1);
74 this->step();
75 Arduino_skal_derivatives();
76
77 /* f(:,3) = feval(odefile, t + hA(2), y + f*hB(:,2), args(:)(*)); */
78 for (i = 0; i <= 1; i++) {
79 hB[i] = h * rt_ODE3_B[1][i];
80 }
81
82 for (i = 0; i < nXc; i++) {
83 x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1]);
84 }
85
86 rtsiSetT(si, t + h*rt_ODE3_A[1]);
87 rtsiSetdX(si, f2);
88 this->step();
89 Arduino_skal_derivatives();
90
91 /* tnew = t + hA(3);
92 ynew = y + f*hB(:,3); */
93 for (i = 0; i <= 2; i++) {
94 hB[i] = h * rt_ODE3_B[2][i];
95 }
96
97 for (i = 0; i < nXc; i++) {
98 x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1] + f2[i]*hB[2]);
99 }
100
101 rtsiSetT(si, tnew);
102 rtsiSetSimTimeStep(si,MAJOR_TIME_STEP);
103}
104
105/* Model step function */
106void Arduino_skalModelClass::step()
107{
108 const real_T *tmp_3;
109 real_T currentTime;
110 real_T tmp;
111 real_T tmp_0;
112 real_T tmp_1;
113 real_T tmp_2;
114 real_T u0;
115 int32_T i;
116 int32_T i_0;
117 if (rtmIsMajorTimeStep((&Arduino_skal_M))) {
118 /* set solver stop time */
119 if (!((&Arduino_skal_M)->Timing.clockTick0+1)) {
120 rtsiSetSolverStopTime(&(&Arduino_skal_M)->solverInfo, (((&Arduino_skal_M
121 )->Timing.clockTickH0 + 1) * (&Arduino_skal_M)->Timing.stepSize0 *
122 4294967296.0));
123 } else {
124 rtsiSetSolverStopTime(&(&Arduino_skal_M)->solverInfo, (((&Arduino_skal_M
125 )->Timing.clockTick0 + 1) * (&Arduino_skal_M)->Timing.stepSize0 +
126 (&Arduino_skal_M)->Timing.clockTickH0 * (&Arduino_skal_M)
127 ->Timing.stepSize0 * 4294967296.0));
128 }
129 } /* end MajorTimeStep */
130
131 /* Update absolute time of base rate at minor time step */
132 if (rtmIsMinorTimeStep((&Arduino_skal_M))) {
133 (&Arduino_skal_M)->Timing.t[0] = rtsiGetT(&(&Arduino_skal_M)->solverInfo);
134 }
135
136 if (rtmIsMajorTimeStep((&Arduino_skal_M))) {
137 /* Constant: '<S1>/X0' */
138 Arduino_skal_B.X0[0] = Arduino_skal_P.X0_Value[0];
139 Arduino_skal_B.X0[1] = Arduino_skal_P.X0_Value[1];
140 Arduino_skal_B.X0[2] = Arduino_skal_P.X0_Value[2];
141 Arduino_skal_B.X0[3] = Arduino_skal_P.X0_Value[3];
142 }
143
144 /* Integrator: '<S1>/MemoryX' */
145 if (Arduino_skal_DW.MemoryX_IWORK != 0) {
146 Arduino_skal_X.MemoryX_CSTATE[0] = Arduino_skal_B.X0[0];
147 Arduino_skal_X.MemoryX_CSTATE[1] = Arduino_skal_B.X0[1];
148 Arduino_skal_X.MemoryX_CSTATE[2] = Arduino_skal_B.X0[2];
149 Arduino_skal_X.MemoryX_CSTATE[3] = Arduino_skal_B.X0[3];
150 }
151
152 /* Integrator: '<S1>/MemoryX' */
153 Arduino_skal_B.MemoryX[0] = Arduino_skal_X.MemoryX_CSTATE[0];
154
155 /* Gain: '<Root>/Gain' */
156 u0 = Arduino_skal_P.K[0] * Arduino_skal_B.MemoryX[0];
157
158 /* Integrator: '<S1>/MemoryX' */
159 Arduino_skal_B.MemoryX[1] = Arduino_skal_X.MemoryX_CSTATE[1];
160
161 /* Gain: '<Root>/Gain' */
162 u0 += Arduino_skal_P.K[1] * Arduino_skal_B.MemoryX[1];
163
164 /* Integrator: '<S1>/MemoryX' */
165 Arduino_skal_B.MemoryX[2] = Arduino_skal_X.MemoryX_CSTATE[2];
166
167 /* Gain: '<Root>/Gain' */
168 u0 += Arduino_skal_P.K[2] * Arduino_skal_B.MemoryX[2];
169
170 /* Integrator: '<S1>/MemoryX' */
171 Arduino_skal_B.MemoryX[3] = Arduino_skal_X.MemoryX_CSTATE[3];
172
173 /* Gain: '<Root>/Gain' */
174 u0 += Arduino_skal_P.K[3] * Arduino_skal_B.MemoryX[3];
175
176 /* Gain: '<Root>/Gain' */
177 Arduino_skal_B.Gain = u0;
178 if (rtmIsMajorTimeStep((&Arduino_skal_M))) {
179 /* MATLAB Function: '<S51>/SqrtUsedFcn' incorporates:
180 * Constant: '<S2>/CovarianceZ'
181 * Constant: '<S51>/isSqrtUsed'
182 */
183 /* : if isSqrtUsed */
184 if (Arduino_skal_P.isSqrtUsed_Value) {
185 /* : P = u*u.'; */
186 for (i = 0; i < 4; i++) {
187 for (i_0 = 0; i_0 < 4; i_0++) {
188 Arduino_skal_B.P[i_0 + (i << 2)] = 0.0;
189 Arduino_skal_B.P[i_0 + (i << 2)] +=
190 Arduino_skal_P.CovarianceZ_Value[i_0] *
191 Arduino_skal_P.CovarianceZ_Value[i];
192 Arduino_skal_B.P[i_0 + (i << 2)] +=
193 Arduino_skal_P.CovarianceZ_Value[i_0 + 4] *
194 Arduino_skal_P.CovarianceZ_Value[i + 4];
195 Arduino_skal_B.P[i_0 + (i << 2)] +=
196 Arduino_skal_P.CovarianceZ_Value[i_0 + 8] *
197 Arduino_skal_P.CovarianceZ_Value[i + 8];
198 Arduino_skal_B.P[i_0 + (i << 2)] +=
199 Arduino_skal_P.CovarianceZ_Value[i_0 + 12] *
200 Arduino_skal_P.CovarianceZ_Value[i + 12];
201 }
202 }
203 } else {
204 /* : else */
205 /* : P = u; */
206 std::memcpy(&Arduino_skal_B.P[0], &Arduino_skal_P.CovarianceZ_Value[0],
207 sizeof(real_T) << 4U);
208 }
209
210 /* End of MATLAB Function: '<S51>/SqrtUsedFcn' */
211 }
212
213 /* Product: '<S22>/A[k]*xhat[k|k-1]' incorporates:
214 * Constant: '<S1>/A'
215 */
216 tmp_3 = &Arduino_skal_P.A_Value[0];
217 tmp = Arduino_skal_B.MemoryX[0];
218 tmp_0 = Arduino_skal_B.MemoryX[1];
219 tmp_1 = Arduino_skal_B.MemoryX[2];
220 tmp_2 = Arduino_skal_B.MemoryX[3];
221 for (i = 0; i < 4; i++) {
222 u0 = tmp_3[i] * tmp;
223 u0 += tmp_3[i + 4] * tmp_0;
224 u0 += tmp_3[i + 8] * tmp_1;
225 u0 += tmp_3[i + 12] * tmp_2;
226
227 /* Product: '<S22>/A[k]*xhat[k|k-1]' */
228 Arduino_skal_B.Akxhatkk1[i] = u0;
229 }
230
231 /* End of Product: '<S22>/A[k]*xhat[k|k-1]' */
232
233 /* Step: '<Root>/Step' */
234 currentTime = (&Arduino_skal_M)->Timing.t[0];
235 if (currentTime < Arduino_skal_P.Step_Time) {
236 /* Step: '<Root>/Step' */
237 Arduino_skal_B.Step = Arduino_skal_P.Step_Y0;
238 } else {
239 /* Step: '<Root>/Step' */
240 Arduino_skal_B.Step = Arduino_skal_P.Step_YFinal;
241 }
242
243 /* End of Step: '<Root>/Step' */
244
245 /* Gain: '<Root>/Kr' */
246 Arduino_skal_B.Kr = Arduino_skal_P.Kr * Arduino_skal_B.Step;
247
248 /* Sum: '<Root>/Sum5' */
249 Arduino_skal_B.Sum5 = Arduino_skal_B.Kr - Arduino_skal_B.Gain;
250
251 /* Saturate: '<Root>/Saturation' */
252 u0 = Arduino_skal_B.Sum5;
253 tmp = Arduino_skal_P.Saturation_LowerSat;
254 tmp_0 = Arduino_skal_P.Saturation_UpperSat;
255 if (u0 > tmp_0) {
256 /* Saturate: '<Root>/Saturation' */
257 Arduino_skal_B.Saturation = tmp_0;
258 } else if (u0 < tmp) {
259 /* Saturate: '<Root>/Saturation' */
260 Arduino_skal_B.Saturation = tmp;
261 } else {
262 /* Saturate: '<Root>/Saturation' */
263 Arduino_skal_B.Saturation = u0;
264 }
265
266 /* End of Saturate: '<Root>/Saturation' */
267
268 /* Product: '<S22>/B[k]*u[k]' incorporates:
269 * Constant: '<S1>/B'
270 */
271 currentTime = Arduino_skal_B.Saturation;
272 u0 = Arduino_skal_P.B_Value[0];
273
274 /* Product: '<S22>/B[k]*u[k]' */
275 Arduino_skal_B.Bkuk[0] = u0 * currentTime;
276
277 /* Product: '<S22>/B[k]*u[k]' incorporates:
278 * Constant: '<S1>/B'
279 */
280 u0 = Arduino_skal_P.B_Value[1];
281
282 /* Product: '<S22>/B[k]*u[k]' */
283 Arduino_skal_B.Bkuk[1] = u0 * currentTime;
284
285 /* Product: '<S22>/B[k]*u[k]' incorporates:
286 * Constant: '<S1>/B'
287 */
288 u0 = Arduino_skal_P.B_Value[2];
289
290 /* Product: '<S22>/B[k]*u[k]' */
291 Arduino_skal_B.Bkuk[2] = u0 * currentTime;
292
293 /* Product: '<S22>/B[k]*u[k]' incorporates:
294 * Constant: '<S1>/B'
295 */
296 u0 = Arduino_skal_P.B_Value[3];
297
298 /* Product: '<S22>/B[k]*u[k]' */
299 Arduino_skal_B.Bkuk[3] = u0 * currentTime;
300
301 /* Outputs for Enabled SubSystem: '<S22>/MeasurementUpdate' incorporates:
302 * EnablePort: '<S53>/Enable'
303 */
304 if (rtmIsMajorTimeStep((&Arduino_skal_M)) && rtmIsMajorTimeStep
305 ((&Arduino_skal_M))) {
306 /* Constant: '<S1>/Enable' */
307 if (Arduino_skal_P.Enable_Value) {
308 Arduino_skal_DW.MeasurementUpdate_MODE = true;
309 } else if (Arduino_skal_DW.MeasurementUpdate_MODE) {
310 /* Disable for Product: '<S53>/Product3' incorporates:
311 * Outport: '<S53>/L*(y[k]-yhat[k|k-1])'
312 */
313 Arduino_skal_B.Product3[0] = Arduino_skal_P.Lykyhatkk1_Y0;
314 Arduino_skal_B.Product3[1] = Arduino_skal_P.Lykyhatkk1_Y0;
315 Arduino_skal_B.Product3[2] = Arduino_skal_P.Lykyhatkk1_Y0;
316 Arduino_skal_B.Product3[3] = Arduino_skal_P.Lykyhatkk1_Y0;
317 Arduino_skal_DW.MeasurementUpdate_MODE = false;
318 }
319
320 /* End of Constant: '<S1>/Enable' */
321 }
322
323 if (Arduino_skal_DW.MeasurementUpdate_MODE) {
324 /* Product: '<S53>/C[k]*xhat[k|k-1]' incorporates:
325 * Constant: '<S1>/C'
326 * Product: '<S53>/Product3'
327 */
328 tmp_3 = &Arduino_skal_P.C_Value[0];
329 tmp = Arduino_skal_B.MemoryX[0];
330 tmp_0 = Arduino_skal_B.MemoryX[1];
331 tmp_1 = Arduino_skal_B.MemoryX[2];
332 tmp_2 = Arduino_skal_B.MemoryX[3];
333
334 /* Product: '<S53>/D[k]*u[k]' */
335 currentTime = Arduino_skal_B.Saturation;
336 for (i = 0; i < 2; i++) {
337 /* Product: '<S53>/C[k]*xhat[k|k-1]' */
338 u0 = tmp_3[i] * tmp;
339 u0 += tmp_3[i + 2] * tmp_0;
340 u0 += tmp_3[i + 4] * tmp_1;
341 u0 += tmp_3[i + 6] * tmp_2;
342
343 /* Product: '<S53>/C[k]*xhat[k|k-1]' */
344 Arduino_skal_B.Ckxhatkk1[i] = u0;
345
346 /* Product: '<S53>/D[k]*u[k]' incorporates:
347 * Constant: '<S1>/D'
348 */
349 u0 = Arduino_skal_P.D_Value[i];
350
351 /* Product: '<S53>/D[k]*u[k]' */
352 Arduino_skal_B.Dkuk[i] = u0 * currentTime;
353
354 /* Sum: '<S53>/Add1' incorporates:
355 * Product: '<S53>/D[k]*u[k]'
356 */
357 Arduino_skal_B.yhatkk1[i] = Arduino_skal_B.Ckxhatkk1[i] +
358 Arduino_skal_B.Dkuk[i];
359
360 /* Sum: '<S53>/Sum' incorporates:
361 * Constant: '<Root>/Constant'
362 * Sum: '<S53>/Add1'
363 */
364 Arduino_skal_B.Sum[i] = Arduino_skal_P.Constant_Value[i] -
365 Arduino_skal_B.yhatkk1[i];
366 }
367
368 /* Product: '<S53>/Product3' incorporates:
369 * Constant: '<S2>/KalmanGainL'
370 * Product: '<S53>/C[k]*xhat[k|k-1]'
371 * Sum: '<S53>/Sum'
372 */
373 tmp_3 = &Arduino_skal_P.KalmanGainL_Value[0];
374 tmp = Arduino_skal_B.Sum[0];
375 tmp_0 = Arduino_skal_B.Sum[1];
376 for (i = 0; i < 4; i++) {
377 /* Product: '<S53>/Product3' */
378 Arduino_skal_B.Product3[i] = 0.0;
379 Arduino_skal_B.Product3[i] += tmp_3[i] * tmp;
380 Arduino_skal_B.Product3[i] += tmp_3[i + 4] * tmp_0;
381 }
382 }
383
384 /* End of Outputs for SubSystem: '<S22>/MeasurementUpdate' */
385
386 /* Sum: '<S22>/Add' incorporates:
387 * Product: '<S22>/B[k]*u[k]'
388 * Product: '<S53>/Product3'
389 */
390 Arduino_skal_B.Add[0] = (Arduino_skal_B.Bkuk[0] + Arduino_skal_B.Akxhatkk1[0])
391 + Arduino_skal_B.Product3[0];
392 Arduino_skal_B.Add[1] = (Arduino_skal_B.Bkuk[1] + Arduino_skal_B.Akxhatkk1[1])
393 + Arduino_skal_B.Product3[1];
394 Arduino_skal_B.Add[2] = (Arduino_skal_B.Bkuk[2] + Arduino_skal_B.Akxhatkk1[2])
395 + Arduino_skal_B.Product3[2];
396 Arduino_skal_B.Add[3] = (Arduino_skal_B.Bkuk[3] + Arduino_skal_B.Akxhatkk1[3])
397 + Arduino_skal_B.Product3[3];
398 if (rtmIsMajorTimeStep((&Arduino_skal_M))) {
399 /* Matfile logging */
400 rt_UpdateTXYLogVars((&Arduino_skal_M)->rtwLogInfo, ((&Arduino_skal_M)
401 ->Timing.t));
402 } /* end MajorTimeStep */
403
404 if (rtmIsMajorTimeStep((&Arduino_skal_M))) {
405 /* Update for Integrator: '<S1>/MemoryX' */
406 Arduino_skal_DW.MemoryX_IWORK = 0;
407 } /* end MajorTimeStep */
408
409 if (rtmIsMajorTimeStep((&Arduino_skal_M))) {
410 /* signal main to stop simulation */
411 { /* Sample time: [0.0s, 0.0s] */
412 if ((rtmGetTFinal((&Arduino_skal_M))!=-1) &&
413 !((rtmGetTFinal((&Arduino_skal_M))-((((&Arduino_skal_M)
414 ->Timing.clockTick1+(&Arduino_skal_M)->Timing.clockTickH1*
415 4294967296.0)) * 0.2)) > ((((&Arduino_skal_M)->Timing.clockTick1+
416 (&Arduino_skal_M)->Timing.clockTickH1* 4294967296.0)) * 0.2) *
417 (DBL_EPSILON))) {
418 rtmSetErrorStatus((&Arduino_skal_M), "Simulation finished");
419 }
420 }
421
422 rt_ertODEUpdateContinuousStates(&(&Arduino_skal_M)->solverInfo);
423
424 /* Update absolute time for base rate */
425 /* The "clockTick0" counts the number of times the code of this task has
426 * been executed. The absolute time is the multiplication of "clockTick0"
427 * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
428 * overflow during the application lifespan selected.
429 * Timer of this task consists of two 32 bit unsigned integers.
430 * The two integers represent the low bits Timing.clockTick0 and the high bits
431 * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
432 */
433 if (!(++(&Arduino_skal_M)->Timing.clockTick0)) {
434 ++(&Arduino_skal_M)->Timing.clockTickH0;
435 }
436
437 (&Arduino_skal_M)->Timing.t[0] = rtsiGetSolverStopTime(&(&Arduino_skal_M)
438 ->solverInfo);
439
440 {
441 /* Update absolute timer for sample time: [0.2s, 0.0s] */
442 /* The "clockTick1" counts the number of times the code of this task has
443 * been executed. The resolution of this integer timer is 0.2, which is the step size
444 * of the task. Size of "clockTick1" ensures timer will not overflow during the
445 * application lifespan selected.
446 * Timer of this task consists of two 32 bit unsigned integers.
447 * The two integers represent the low bits Timing.clockTick1 and the high bits
448 * Timing.clockTickH1. When the low bit overflows to 0, the high bits increment.
449 */
450 (&Arduino_skal_M)->Timing.clockTick1++;
451 if (!(&Arduino_skal_M)->Timing.clockTick1) {
452 (&Arduino_skal_M)->Timing.clockTickH1++;
453 }
454 }
455 } /* end MajorTimeStep */
456}
457
458/* Derivatives for root system: '<Root>' */
459void Arduino_skalModelClass::Arduino_skal_derivatives()
460{
461 XDot_Arduino_skal_T *_rtXdot;
462 _rtXdot = ((XDot_Arduino_skal_T *) (&Arduino_skal_M)->derivs);
463
464 /* Derivatives for Integrator: '<S1>/MemoryX' */
465 _rtXdot->MemoryX_CSTATE[0] = Arduino_skal_B.Add[0];
466 _rtXdot->MemoryX_CSTATE[1] = Arduino_skal_B.Add[1];
467 _rtXdot->MemoryX_CSTATE[2] = Arduino_skal_B.Add[2];
468 _rtXdot->MemoryX_CSTATE[3] = Arduino_skal_B.Add[3];
469}
470
471/* Model initialize function */
472void Arduino_skalModelClass::initialize()
473{
474 /* Registration code */
475
476 /* initialize non-finites */
477 rt_InitInfAndNaN(sizeof(real_T));
478
479 {
480 /* Setup solver object */
481 rtsiSetSimTimeStepPtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M)
482 ->Timing.simTimeStep);
483 rtsiSetTPtr(&(&Arduino_skal_M)->solverInfo, &rtmGetTPtr((&Arduino_skal_M)));
484 rtsiSetStepSizePtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M)
485 ->Timing.stepSize0);
486 rtsiSetdXPtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M)->derivs);
487 rtsiSetContStatesPtr(&(&Arduino_skal_M)->solverInfo, (real_T **)
488 &(&Arduino_skal_M)->contStates);
489 rtsiSetNumContStatesPtr(&(&Arduino_skal_M)->solverInfo, &(&Arduino_skal_M)
490 ->Sizes.numContStates);
491 rtsiSetNumPeriodicContStatesPtr(&(&Arduino_skal_M)->solverInfo,
492 &(&Arduino_skal_M)->Sizes.numPeriodicContStates);
493 rtsiSetPeriodicContStateIndicesPtr(&(&Arduino_skal_M)->solverInfo,
494 &(&Arduino_skal_M)->periodicContStateIndices);
495 rtsiSetPeriodicContStateRangesPtr(&(&Arduino_skal_M)->solverInfo,
496 &(&Arduino_skal_M)->periodicContStateRanges);
497 rtsiSetErrorStatusPtr(&(&Arduino_skal_M)->solverInfo, (&rtmGetErrorStatus
498 ((&Arduino_skal_M))));
499 rtsiSetRTModelPtr(&(&Arduino_skal_M)->solverInfo, (&Arduino_skal_M));
500 }
501
502 rtsiSetSimTimeStep(&(&Arduino_skal_M)->solverInfo, MAJOR_TIME_STEP);
503 (&Arduino_skal_M)->intgData.y = (&Arduino_skal_M)->odeY;
504 (&Arduino_skal_M)->intgData.f[0] = (&Arduino_skal_M)->odeF[0];
505 (&Arduino_skal_M)->intgData.f[1] = (&Arduino_skal_M)->odeF[1];
506 (&Arduino_skal_M)->intgData.f[2] = (&Arduino_skal_M)->odeF[2];
507 (&Arduino_skal_M)->contStates = ((X_Arduino_skal_T *) &Arduino_skal_X);
508 rtsiSetSolverData(&(&Arduino_skal_M)->solverInfo, static_cast<void *>
509 (&(&Arduino_skal_M)->intgData));
510 rtsiSetSolverName(&(&Arduino_skal_M)->solverInfo,"ode3");
511 rtmSetTPtr((&Arduino_skal_M), &(&Arduino_skal_M)->Timing.tArray[0]);
512 rtmSetTFinal((&Arduino_skal_M), 10.0);
513 (&Arduino_skal_M)->Timing.stepSize0 = 0.2;
514 rtmSetFirstInitCond((&Arduino_skal_M), 1);
515
516 /* Setup for data logging */
517 {
518 static RTWLogInfo rt_DataLoggingInfo;
519 rt_DataLoggingInfo.loggingInterval = (NULL);
520 (&Arduino_skal_M)->rtwLogInfo = &rt_DataLoggingInfo;
521 }
522
523 /* Setup for data logging */
524 {
525 rtliSetLogXSignalInfo((&Arduino_skal_M)->rtwLogInfo, (NULL));
526 rtliSetLogXSignalPtrs((&Arduino_skal_M)->rtwLogInfo, (NULL));
527 rtliSetLogT((&Arduino_skal_M)->rtwLogInfo, "tout");
528 rtliSetLogX((&Arduino_skal_M)->rtwLogInfo, "");
529 rtliSetLogXFinal((&Arduino_skal_M)->rtwLogInfo, "");
530 rtliSetLogVarNameModifier((&Arduino_skal_M)->rtwLogInfo, "rt_");
531 rtliSetLogFormat((&Arduino_skal_M)->rtwLogInfo, 4);
532 rtliSetLogMaxRows((&Arduino_skal_M)->rtwLogInfo, 0);
533 rtliSetLogDecimation((&Arduino_skal_M)->rtwLogInfo, 1);
534 rtliSetLogY((&Arduino_skal_M)->rtwLogInfo, "");
535 rtliSetLogYSignalInfo((&Arduino_skal_M)->rtwLogInfo, (NULL));
536 rtliSetLogYSignalPtrs((&Arduino_skal_M)->rtwLogInfo, (NULL));
537 }
538
539 /* Matfile logging */
540 rt_StartDataLoggingWithStartTime((&Arduino_skal_M)->rtwLogInfo, 0.0,
541 rtmGetTFinal((&Arduino_skal_M)), (&Arduino_skal_M)->Timing.stepSize0,
542 (&rtmGetErrorStatus((&Arduino_skal_M))));
543
544 /* Start for Constant: '<S1>/X0' */
545 Arduino_skal_B.X0[0] = Arduino_skal_P.X0_Value[0];
546 Arduino_skal_B.X0[1] = Arduino_skal_P.X0_Value[1];
547 Arduino_skal_B.X0[2] = Arduino_skal_P.X0_Value[2];
548 Arduino_skal_B.X0[3] = Arduino_skal_P.X0_Value[3];
549
550 /* InitializeConditions for Integrator: '<S1>/MemoryX' */
551 if (rtmIsFirstInitCond((&Arduino_skal_M))) {
552 Arduino_skal_X.MemoryX_CSTATE[0] = 0.0;
553 Arduino_skal_X.MemoryX_CSTATE[1] = 0.0;
554 Arduino_skal_X.MemoryX_CSTATE[2] = 0.0;
555 Arduino_skal_X.MemoryX_CSTATE[3] = 0.0;
556 }
557
558 Arduino_skal_DW.MemoryX_IWORK = 1;
559
560 /* End of InitializeConditions for Integrator: '<S1>/MemoryX' */
561
562 /* SystemInitialize for Enabled SubSystem: '<S22>/MeasurementUpdate' */
563 /* SystemInitialize for Product: '<S53>/Product3' incorporates:
564 * Outport: '<S53>/L*(y[k]-yhat[k|k-1])'
565 */
566 Arduino_skal_B.Product3[0] = Arduino_skal_P.Lykyhatkk1_Y0;
567 Arduino_skal_B.Product3[1] = Arduino_skal_P.Lykyhatkk1_Y0;
568 Arduino_skal_B.Product3[2] = Arduino_skal_P.Lykyhatkk1_Y0;
569 Arduino_skal_B.Product3[3] = Arduino_skal_P.Lykyhatkk1_Y0;
570
571 /* End of SystemInitialize for SubSystem: '<S22>/MeasurementUpdate' */
572
573 /* set "at time zero" to false */
574 if (rtmIsFirstInitCond((&Arduino_skal_M))) {
575 rtmSetFirstInitCond((&Arduino_skal_M), 0);
576 }
577}
578
579/* Model terminate function */
580void Arduino_skalModelClass::terminate()
581{
582 /* (no terminate code required) */
583}
584
585/* Constructor */
586Arduino_skalModelClass::Arduino_skalModelClass() :
587 Arduino_skal_B(),
588 Arduino_skal_DW(),
589 Arduino_skal_X(),
590 Arduino_skal_M()
591{
592 /* Currently there is no constructor body generated.*/
593}
594
595/* Destructor */
596Arduino_skalModelClass::~Arduino_skalModelClass()
597{
598 /* Currently there is no destructor body generated.*/
599}
600
601/* Real-Time Model get method */
602RT_MODEL_Arduino_skal_T * Arduino_skalModelClass::getRTM()
603{
604 return (&Arduino_skal_M);
605}
606
+
+ + diff --git a/simulink_export/html/Arduino_skal_data_cpp.html b/simulink_export/html/Arduino_skal_data_cpp.html new file mode 100644 index 0000000..ea0ae5c --- /dev/null +++ b/simulink_export/html/Arduino_skal_data_cpp.html @@ -0,0 +1,258 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * Arduino_skal_data.cpp
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#include "Arduino_skal.h"
22#include "Arduino_skal_private.h"
23
24/* Block parameters (default storage) */
25P_Arduino_skal_T Arduino_skalModelClass::Arduino_skal_P = {
26 /* Variable: K
27 * Referenced by: '<Root>/Gain'
28 */
29 { -31.622776601683942, -21.286439360075747, 80.789376267003959,
30 13.42463576551093 },
31
32 /* Variable: Kr
33 * Referenced by: '<Root>/Kr'
34 */
35 1.0,
36
37 /* Expression: 0
38 * Referenced by: '<S53>/L*(y[k]-yhat[k|k-1])'
39 */
40 0.0,
41
42 /* Expression: [1,1]
43 * Referenced by: '<Root>/Constant'
44 */
45 { 1.0, 1.0 },
46
47 /* Expression: pInitialization.X0
48 * Referenced by: '<S1>/X0'
49 */
50 { 0.0, 0.0, 0.0, 0.0 },
51
52 /* Expression: pInitialization.A
53 * Referenced by: '<S1>/A'
54 */
55 { 0.0, 0.0, 0.0, 0.0, 1.0, -0.20780947085442231, 0.0, -0.52810302415000854,
56 0.0, 13.239785742831822, 0.0, 58.601480177829842, 0.0, 0.0, 1.0, 0.0 },
57
58 /* Expression: pInitialization.B
59 * Referenced by: '<S1>/B'
60 */
61 { 0.0, 2.078094708544223, 0.0, 5.2810302415000852 },
62
63 /* Expression: pInitialization.C
64 * Referenced by: '<S1>/C'
65 */
66 { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 },
67
68 /* Expression: pInitialization.Z
69 * Referenced by: '<S2>/CovarianceZ'
70 */
71 { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
72 0.0 },
73
74 /* Expression: pInitialization.L
75 * Referenced by: '<S2>/KalmanGainL'
76 */
77 { 2.829363352293504, 6.8371369304528766, 2.3809613355962305,
78 17.882971156218495, 2.3809613355962278, 24.153756408336502,
79 14.825995823889082, 112.73956452579047 },
80
81 /* Expression: pInitialization.D
82 * Referenced by: '<S1>/D'
83 */
84 { 0.0, 0.0 },
85
86 /* Expression: 0
87 * Referenced by: '<Root>/Step'
88 */
89 0.0,
90
91 /* Expression: 0
92 * Referenced by: '<Root>/Step'
93 */
94 0.0,
95
96 /* Expression: 0
97 * Referenced by: '<Root>/Step'
98 */
99 0.0,
100
101 /* Expression: 11.5
102 * Referenced by: '<Root>/Saturation'
103 */
104 11.5,
105
106 /* Expression: -11.5
107 * Referenced by: '<Root>/Saturation'
108 */
109 -11.5,
110
111 /* Expression: pInitialization.isSqrtUsed
112 * Referenced by: '<S51>/isSqrtUsed'
113 */
114 0,
115
116 /* Expression: true()
117 * Referenced by: '<S1>/Enable'
118 */
119 1
120};
121
+
+ + diff --git a/simulink_export/html/Arduino_skal_h.html b/simulink_export/html/Arduino_skal_h.html new file mode 100644 index 0000000..1f6eb91 --- /dev/null +++ b/simulink_export/html/Arduino_skal_h.html @@ -0,0 +1,978 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * Arduino_skal.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef RTW_HEADER_Arduino_skal_h_
22#define RTW_HEADER_Arduino_skal_h_
23#include <cstring>
24#include <cfloat>
25#include <stddef.h>
26#include "rtwtypes.h"
27#include "rtw_continuous.h"
28#include "rtw_solver.h"
29#include "rt_logging.h"
30#include "Arduino_skal_types.h"
31
32/* Shared type includes */
33#include "multiword_types.h"
34#include "rt_nonfinite.h"
35
36/* Macros for accessing real-time model data structure */
37#ifndef rtmGetContStateDisabled
38#define rtmGetContStateDisabled(rtm) ((rtm)->contStateDisabled)
39#endif
40
41#ifndef rtmSetContStateDisabled
42#define rtmSetContStateDisabled(rtm, val) ((rtm)->contStateDisabled = (val))
43#endif
44
45#ifndef rtmGetContStates
46#define rtmGetContStates(rtm) ((rtm)->contStates)
47#endif
48
49#ifndef rtmSetContStates
50#define rtmSetContStates(rtm, val) ((rtm)->contStates = (val))
51#endif
52
53#ifndef rtmGetContTimeOutputInconsistentWithStateAtMajorStepFlag
54#define rtmGetContTimeOutputInconsistentWithStateAtMajorStepFlag(rtm) ((rtm)->CTOutputIncnstWithState)
55#endif
56
57#ifndef rtmSetContTimeOutputInconsistentWithStateAtMajorStepFlag
58#define rtmSetContTimeOutputInconsistentWithStateAtMajorStepFlag(rtm, val) ((rtm)->CTOutputIncnstWithState = (val))
59#endif
60
61#ifndef rtmGetDerivCacheNeedsReset
62#define rtmGetDerivCacheNeedsReset(rtm) ((rtm)->derivCacheNeedsReset)
63#endif
64
65#ifndef rtmSetDerivCacheNeedsReset
66#define rtmSetDerivCacheNeedsReset(rtm, val) ((rtm)->derivCacheNeedsReset = (val))
67#endif
68
69#ifndef rtmGetFinalTime
70#define rtmGetFinalTime(rtm) ((rtm)->Timing.tFinal)
71#endif
72
73#ifndef rtmGetIntgData
74#define rtmGetIntgData(rtm) ((rtm)->intgData)
75#endif
76
77#ifndef rtmSetIntgData
78#define rtmSetIntgData(rtm, val) ((rtm)->intgData = (val))
79#endif
80
81#ifndef rtmGetOdeF
82#define rtmGetOdeF(rtm) ((rtm)->odeF)
83#endif
84
85#ifndef rtmSetOdeF
86#define rtmSetOdeF(rtm, val) ((rtm)->odeF = (val))
87#endif
88
89#ifndef rtmGetOdeY
90#define rtmGetOdeY(rtm) ((rtm)->odeY)
91#endif
92
93#ifndef rtmSetOdeY
94#define rtmSetOdeY(rtm, val) ((rtm)->odeY = (val))
95#endif
96
97#ifndef rtmGetPeriodicContStateIndices
98#define rtmGetPeriodicContStateIndices(rtm) ((rtm)->periodicContStateIndices)
99#endif
100
101#ifndef rtmSetPeriodicContStateIndices
102#define rtmSetPeriodicContStateIndices(rtm, val) ((rtm)->periodicContStateIndices = (val))
103#endif
104
105#ifndef rtmGetPeriodicContStateRanges
106#define rtmGetPeriodicContStateRanges(rtm) ((rtm)->periodicContStateRanges)
107#endif
108
109#ifndef rtmSetPeriodicContStateRanges
110#define rtmSetPeriodicContStateRanges(rtm, val) ((rtm)->periodicContStateRanges = (val))
111#endif
112
113#ifndef rtmGetRTWLogInfo
114#define rtmGetRTWLogInfo(rtm) ((rtm)->rtwLogInfo)
115#endif
116
117#ifndef rtmGetZCCacheNeedsReset
118#define rtmGetZCCacheNeedsReset(rtm) ((rtm)->zCCacheNeedsReset)
119#endif
120
121#ifndef rtmSetZCCacheNeedsReset
122#define rtmSetZCCacheNeedsReset(rtm, val) ((rtm)->zCCacheNeedsReset = (val))
123#endif
124
125#ifndef rtmGetdX
126#define rtmGetdX(rtm) ((rtm)->derivs)
127#endif
128
129#ifndef rtmSetdX
130#define rtmSetdX(rtm, val) ((rtm)->derivs = (val))
131#endif
132
133#ifndef rtmGetErrorStatus
134#define rtmGetErrorStatus(rtm) ((rtm)->errorStatus)
135#endif
136
137#ifndef rtmSetErrorStatus
138#define rtmSetErrorStatus(rtm, val) ((rtm)->errorStatus = (val))
139#endif
140
141#ifndef rtmGetStopRequested
142#define rtmGetStopRequested(rtm) ((rtm)->Timing.stopRequestedFlag)
143#endif
144
145#ifndef rtmSetStopRequested
146#define rtmSetStopRequested(rtm, val) ((rtm)->Timing.stopRequestedFlag = (val))
147#endif
148
149#ifndef rtmGetStopRequestedPtr
150#define rtmGetStopRequestedPtr(rtm) (&((rtm)->Timing.stopRequestedFlag))
151#endif
152
153#ifndef rtmGetT
154#define rtmGetT(rtm) (rtmGetTPtr((rtm))[0])
155#endif
156
157#ifndef rtmGetTFinal
158#define rtmGetTFinal(rtm) ((rtm)->Timing.tFinal)
159#endif
160
161#ifndef rtmGetTPtr
162#define rtmGetTPtr(rtm) ((rtm)->Timing.t)
163#endif
164
165/* Block signals (default storage) */
166struct B_Arduino_skal_T {
167 real_T X0[4]; /* '<S1>/X0' */
168 real_T MemoryX[4]; /* '<S1>/MemoryX' */
169 real_T Gain; /* '<Root>/Gain' */
170 real_T Akxhatkk1[4]; /* '<S22>/A[k]*xhat[k|k-1]' */
171 real_T Step; /* '<Root>/Step' */
172 real_T Kr; /* '<Root>/Kr' */
173 real_T Sum5; /* '<Root>/Sum5' */
174 real_T Saturation; /* '<Root>/Saturation' */
175 real_T Bkuk[4]; /* '<S22>/B[k]*u[k]' */
176 real_T Add[4]; /* '<S22>/Add' */
177 real_T Ckxhatkk1[2]; /* '<S53>/C[k]*xhat[k|k-1]' */
178 real_T Dkuk[2]; /* '<S53>/D[k]*u[k]' */
179 real_T yhatkk1[2]; /* '<S53>/Add1' */
180 real_T Sum[2]; /* '<S53>/Sum' */
181 real_T Product3[4]; /* '<S53>/Product3' */
182 real_T P[16]; /* '<S51>/SqrtUsedFcn' */
183};
184
185/* Block states (default storage) for system '<Root>' */
186struct DW_Arduino_skal_T {
187 int_T MemoryX_IWORK; /* '<S1>/MemoryX' */
188 boolean_T MeasurementUpdate_MODE; /* '<S22>/MeasurementUpdate' */
189};
190
191/* Continuous states (default storage) */
192struct X_Arduino_skal_T {
193 real_T MemoryX_CSTATE[4]; /* '<S1>/MemoryX' */
194};
195
196/* State derivatives (default storage) */
197struct XDot_Arduino_skal_T {
198 real_T MemoryX_CSTATE[4]; /* '<S1>/MemoryX' */
199};
200
201/* State disabled */
202struct XDis_Arduino_skal_T {
203 boolean_T MemoryX_CSTATE[4]; /* '<S1>/MemoryX' */
204};
205
206#ifndef ODE3_INTG
207#define ODE3_INTG
208
209/* ODE3 Integration Data */
210struct ODE3_IntgData {
211 real_T *y; /* output */
212 real_T *f[3]; /* derivatives */
213};
214
215#endif
216
217/* Parameters (default storage) */
218struct P_Arduino_skal_T_ {
219 real_T K[4]; /* Variable: K
220 * Referenced by: '<Root>/Gain'
221 */
222 real_T Kr; /* Variable: Kr
223 * Referenced by: '<Root>/Kr'
224 */
225 real_T Lykyhatkk1_Y0; /* Expression: 0
226 * Referenced by: '<S53>/L*(y[k]-yhat[k|k-1])'
227 */
228 real_T Constant_Value[2]; /* Expression: [1,1]
229 * Referenced by: '<Root>/Constant'
230 */
231 real_T X0_Value[4]; /* Expression: pInitialization.X0
232 * Referenced by: '<S1>/X0'
233 */
234 real_T A_Value[16]; /* Expression: pInitialization.A
235 * Referenced by: '<S1>/A'
236 */
237 real_T B_Value[4]; /* Expression: pInitialization.B
238 * Referenced by: '<S1>/B'
239 */
240 real_T C_Value[8]; /* Expression: pInitialization.C
241 * Referenced by: '<S1>/C'
242 */
243 real_T CovarianceZ_Value[16]; /* Expression: pInitialization.Z
244 * Referenced by: '<S2>/CovarianceZ'
245 */
246 real_T KalmanGainL_Value[8]; /* Expression: pInitialization.L
247 * Referenced by: '<S2>/KalmanGainL'
248 */
249 real_T D_Value[2]; /* Expression: pInitialization.D
250 * Referenced by: '<S1>/D'
251 */
252 real_T Step_Time; /* Expression: 0
253 * Referenced by: '<Root>/Step'
254 */
255 real_T Step_Y0; /* Expression: 0
256 * Referenced by: '<Root>/Step'
257 */
258 real_T Step_YFinal; /* Expression: 0
259 * Referenced by: '<Root>/Step'
260 */
261 real_T Saturation_UpperSat; /* Expression: 11.5
262 * Referenced by: '<Root>/Saturation'
263 */
264 real_T Saturation_LowerSat; /* Expression: -11.5
265 * Referenced by: '<Root>/Saturation'
266 */
267 boolean_T isSqrtUsed_Value; /* Expression: pInitialization.isSqrtUsed
268 * Referenced by: '<S51>/isSqrtUsed'
269 */
270 boolean_T Enable_Value; /* Expression: true()
271 * Referenced by: '<S1>/Enable'
272 */
273};
274
275/* Real-time Model Data Structure */
276struct tag_RTM_Arduino_skal_T {
277 const char_T *errorStatus;
278 RTWLogInfo *rtwLogInfo;
279 RTWSolverInfo solverInfo;
280 X_Arduino_skal_T *contStates;
281 int_T *periodicContStateIndices;
282 real_T *periodicContStateRanges;
283 real_T *derivs;
284 boolean_T *contStateDisabled;
285 boolean_T zCCacheNeedsReset;
286 boolean_T derivCacheNeedsReset;
287 boolean_T CTOutputIncnstWithState;
288 real_T odeY[4];
289 real_T odeF[3][4];
290 ODE3_IntgData intgData;
291
292 /*
293 * Sizes:
294 * The following substructure contains sizes information
295 * for many of the model attributes such as inputs, outputs,
296 * dwork, sample times, etc.
297 */
298 struct {
299 int_T numContStates;
300 int_T numPeriodicContStates;
301 int_T numSampTimes;
302 } Sizes;
303
304 /*
305 * Timing:
306 * The following substructure contains information regarding
307 * the timing information for the model.
308 */
309 struct {
310 uint32_T clockTick0;
311 uint32_T clockTickH0;
312 time_T stepSize0;
313 uint32_T clockTick1;
314 uint32_T clockTickH1;
315 boolean_T firstInitCondFlag;
316 time_T tFinal;
317 SimTimeStep simTimeStep;
318 boolean_T stopRequestedFlag;
319 time_T *t;
320 time_T tArray[2];
321 } Timing;
322};
323
324/* Class declaration for model Arduino_skal */
325class Arduino_skalModelClass {
326 /* public data and function members */
327 public:
328 /* model initialize function */
329 void initialize();
330
331 /* model step function */
332 void step();
333
334 /* model terminate function */
335 void terminate();
336
337 /* Constructor */
338 Arduino_skalModelClass();
339
340 /* Destructor */
341 ~Arduino_skalModelClass();
342
343 /* Real-Time Model get method */
344 RT_MODEL_Arduino_skal_T * getRTM();
345
346 /* private data and function members */
347 private:
348 /* Tunable parameters */
349 static P_Arduino_skal_T Arduino_skal_P;
350
351 /* Block signals */
352 B_Arduino_skal_T Arduino_skal_B;
353
354 /* Block states */
355 DW_Arduino_skal_T Arduino_skal_DW;
356 X_Arduino_skal_T Arduino_skal_X; /* Block continuous states */
357
358 /* Real-Time Model */
359 RT_MODEL_Arduino_skal_T Arduino_skal_M;
360
361 /* Continuous states update member function*/
362 void rt_ertODEUpdateContinuousStates(RTWSolverInfo *si );
363
364 /* Derivatives member function */
365 void Arduino_skal_derivatives();
366};
367
368/*-
369 * These blocks were eliminated from the model due to optimizations:
370 *
371 * Block '<S45>/Data Type Duplicate' : Unused code path elimination
372 * Block '<S46>/Conversion' : Unused code path elimination
373 * Block '<S46>/Data Type Duplicate' : Unused code path elimination
374 * Block '<S47>/Conversion' : Unused code path elimination
375 * Block '<S47>/Data Type Duplicate' : Unused code path elimination
376 * Block '<S48>/Data Type Duplicate' : Unused code path elimination
377 * Block '<S2>/KalmanGainM' : Unused code path elimination
378 * Block '<S5>/Data Type Duplicate' : Unused code path elimination
379 * Block '<S6>/Data Type Duplicate' : Unused code path elimination
380 * Block '<S7>/Data Type Duplicate' : Unused code path elimination
381 * Block '<S8>/Data Type Duplicate' : Unused code path elimination
382 * Block '<S10>/Data Type Duplicate' : Unused code path elimination
383 * Block '<S11>/Data Type Duplicate' : Unused code path elimination
384 * Block '<S12>/Data Type Duplicate' : Unused code path elimination
385 * Block '<S13>/Conversion' : Unused code path elimination
386 * Block '<S13>/Data Type Duplicate' : Unused code path elimination
387 * Block '<S14>/Data Type Duplicate' : Unused code path elimination
388 * Block '<S15>/Data Type Duplicate' : Unused code path elimination
389 * Block '<S16>/Data Type Duplicate' : Unused code path elimination
390 * Block '<S18>/Data Type Duplicate' : Unused code path elimination
391 * Block '<S19>/Data Type Duplicate' : Unused code path elimination
392 * Block '<S1>/G' : Unused code path elimination
393 * Block '<S1>/H' : Unused code path elimination
394 * Block '<S1>/N' : Unused code path elimination
395 * Block '<S1>/P0' : Unused code path elimination
396 * Block '<S1>/Q' : Unused code path elimination
397 * Block '<S1>/R' : Unused code path elimination
398 * Block '<S43>/CheckSignalProperties' : Unused code path elimination
399 * Block '<S44>/CheckSignalProperties' : Unused code path elimination
400 * Block '<S45>/Conversion' : Eliminate redundant data type conversion
401 * Block '<S48>/Conversion' : Eliminate redundant data type conversion
402 * Block '<S18>/Conversion' : Eliminate redundant data type conversion
403 * Block '<S22>/Reshape' : Reshape block reduction
404 * Block '<S1>/ReshapeX0' : Reshape block reduction
405 * Block '<S1>/Reshapeu' : Reshape block reduction
406 * Block '<S1>/Reshapexhat' : Reshape block reduction
407 * Block '<S1>/Reshapey' : Reshape block reduction
408 */
409
410/*-
411 * The generated code includes comments that allow you to trace directly
412 * back to the appropriate location in the model. The basic format
413 * is <system>/block_name, where system is the system number (uniquely
414 * assigned by Simulink) and block_name is the name of the block.
415 *
416 * Use the MATLAB hilite_system command to trace the generated code back
417 * to the model. For example,
418 *
419 * hilite_system('<S3>') - opens system 3
420 * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
421 *
422 * Here is the system hierarchy for this model
423 *
424 * '<Root>' : 'Arduino_skal'
425 * '<S1>' : 'Arduino_skal/Kalman Filter'
426 * '<S2>' : 'Arduino_skal/Kalman Filter/CalculatePL'
427 * '<S3>' : 'Arduino_skal/Kalman Filter/CalculateYhat'
428 * '<S4>' : 'Arduino_skal/Kalman Filter/CovarianceOutputConfigurator'
429 * '<S5>' : 'Arduino_skal/Kalman Filter/DataTypeConversionA'
430 * '<S6>' : 'Arduino_skal/Kalman Filter/DataTypeConversionB'
431 * '<S7>' : 'Arduino_skal/Kalman Filter/DataTypeConversionC'
432 * '<S8>' : 'Arduino_skal/Kalman Filter/DataTypeConversionD'
433 * '<S9>' : 'Arduino_skal/Kalman Filter/DataTypeConversionEnable'
434 * '<S10>' : 'Arduino_skal/Kalman Filter/DataTypeConversionG'
435 * '<S11>' : 'Arduino_skal/Kalman Filter/DataTypeConversionH'
436 * '<S12>' : 'Arduino_skal/Kalman Filter/DataTypeConversionN'
437 * '<S13>' : 'Arduino_skal/Kalman Filter/DataTypeConversionP'
438 * '<S14>' : 'Arduino_skal/Kalman Filter/DataTypeConversionP0'
439 * '<S15>' : 'Arduino_skal/Kalman Filter/DataTypeConversionQ'
440 * '<S16>' : 'Arduino_skal/Kalman Filter/DataTypeConversionR'
441 * '<S17>' : 'Arduino_skal/Kalman Filter/DataTypeConversionReset'
442 * '<S18>' : 'Arduino_skal/Kalman Filter/DataTypeConversionX'
443 * '<S19>' : 'Arduino_skal/Kalman Filter/DataTypeConversionX0'
444 * '<S20>' : 'Arduino_skal/Kalman Filter/DataTypeConversionu'
445 * '<S21>' : 'Arduino_skal/Kalman Filter/MemoryP'
446 * '<S22>' : 'Arduino_skal/Kalman Filter/Observer'
447 * '<S23>' : 'Arduino_skal/Kalman Filter/ReducedQRN'
448 * '<S24>' : 'Arduino_skal/Kalman Filter/Reset'
449 * '<S25>' : 'Arduino_skal/Kalman Filter/Reshapeyhat'
450 * '<S26>' : 'Arduino_skal/Kalman Filter/ScalarExpansionP0'
451 * '<S27>' : 'Arduino_skal/Kalman Filter/ScalarExpansionQ'
452 * '<S28>' : 'Arduino_skal/Kalman Filter/ScalarExpansionR'
453 * '<S29>' : 'Arduino_skal/Kalman Filter/UseCurrentEstimator'
454 * '<S30>' : 'Arduino_skal/Kalman Filter/checkA'
455 * '<S31>' : 'Arduino_skal/Kalman Filter/checkB'
456 * '<S32>' : 'Arduino_skal/Kalman Filter/checkC'
457 * '<S33>' : 'Arduino_skal/Kalman Filter/checkD'
458 * '<S34>' : 'Arduino_skal/Kalman Filter/checkEnable'
459 * '<S35>' : 'Arduino_skal/Kalman Filter/checkG'
460 * '<S36>' : 'Arduino_skal/Kalman Filter/checkH'
461 * '<S37>' : 'Arduino_skal/Kalman Filter/checkN'
462 * '<S38>' : 'Arduino_skal/Kalman Filter/checkP0'
463 * '<S39>' : 'Arduino_skal/Kalman Filter/checkQ'
464 * '<S40>' : 'Arduino_skal/Kalman Filter/checkR'
465 * '<S41>' : 'Arduino_skal/Kalman Filter/checkReset'
466 * '<S42>' : 'Arduino_skal/Kalman Filter/checkX0'
467 * '<S43>' : 'Arduino_skal/Kalman Filter/checku'
468 * '<S44>' : 'Arduino_skal/Kalman Filter/checky'
469 * '<S45>' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionL'
470 * '<S46>' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionM'
471 * '<S47>' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionP'
472 * '<S48>' : 'Arduino_skal/Kalman Filter/CalculatePL/DataTypeConversionZ'
473 * '<S49>' : 'Arduino_skal/Kalman Filter/CalculatePL/Ground'
474 * '<S50>' : 'Arduino_skal/Kalman Filter/CalculateYhat/Ground'
475 * '<S51>' : 'Arduino_skal/Kalman Filter/CovarianceOutputConfigurator/decideOutput'
476 * '<S52>' : 'Arduino_skal/Kalman Filter/CovarianceOutputConfigurator/decideOutput/SqrtUsedFcn'
477 * '<S53>' : 'Arduino_skal/Kalman Filter/Observer/MeasurementUpdate'
478 * '<S54>' : 'Arduino_skal/Kalman Filter/ReducedQRN/Ground'
479 */
480#endif /* RTW_HEADER_Arduino_skal_h_ */
481
+
+ + diff --git a/simulink_export/html/Arduino_skal_interface.html b/simulink_export/html/Arduino_skal_interface.html new file mode 100644 index 0000000..c31ffad --- /dev/null +++ b/simulink_export/html/Arduino_skal_interface.html @@ -0,0 +1,633 @@ + + + +Code Interface Report for Arduino_skal + + + + +

+Code Interface Report for Arduino_skal +

+

+Table of Contents +

+ +

+ +Entry-Point Functions + + +

+

+Function: initialize +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Prototype + + +void initialize(void) + + +
+Description + +Initialization entry point of generated code +
+Timing + +Must be called exactly once +
+Arguments + +None +
+Return value + +None +
+Header file + +Arduino_skal.h +
+

+Function: step +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Prototype + + +void step(void) + + +
+Description + +Output entry point of generated code +
+Timing + +Must be called periodically, every 0.2 seconds +
+Arguments + +None +
+Return value + +None +
+Header file + +Arduino_skal.h +
+

+Function: terminate +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Prototype + + +void terminate(void) + + +
+Description + +Termination entry point of generated code +
+Timing + +Must be called exactly once +
+Arguments + +None +
+Return value + +None +
+Header file + +Arduino_skal.h +
+

+ +Inports + + +

+

+No Inports in model. +

+

+ +Outports + + +

+

+No Outports in model. +

+

+ +Interface Parameters + + +

+[-] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Parameter Source + + + + +Code Identifier + + + + +Data Type + + + + +Dimension + + +
+K + + +Defined externally + + + +real_T + +[1 4] +
+Kr + + +Defined externally + + + +real_T + +1 +
+<S53>/L*(y[k]-yhat[k|k-1]) + + +Defined externally + + + +real_T + +1 +
+<Root>/Constant + + +Defined externally + + + +real_T + +[1 2] +
+<S1>/X0 + + +Defined externally + + + +real_T + +[4 1] +
+<S1>/A + + +Defined externally + + + +real_T + +[4 4] +
+<S1>/B + + +Defined externally + + + +real_T + +[4 1] +
+<S1>/C + + +Defined externally + + + +real_T + +[2 4] +
+<S2>/CovarianceZ + + +Defined externally + + + +real_T + +[4 4] +
+<S2>/KalmanGainL + + +Defined externally + + + +real_T + +[4 2] +
+<S1>/D + + +Defined externally + + + +real_T + +[2 1] +
+<Root>/Step + + +Defined externally + + + +real_T + +1 +
+<Root>/Step + + +Defined externally + + + +real_T + +1 +
+<Root>/Step + + +Defined externally + + + +real_T + +1 +
+<Root>/Saturation + + +Defined externally + + + +real_T + +1 +
+<Root>/Saturation + + +Defined externally + + + +real_T + +1 +
+<S51>/isSqrtUsed + + +Defined externally + + + +boolean_T + +1 +
+<S1>/Enable + + +Defined externally + + + +boolean_T + +1 +
+

+ +Data Stores + + +

+

+No data stores in the model; note that this report lists only data stores with non-auto storage class and global data stores +

+ + + + diff --git a/simulink_export/html/Arduino_skal_private_h.html b/simulink_export/html/Arduino_skal_private_h.html new file mode 100644 index 0000000..a5a1fe3 --- /dev/null +++ b/simulink_export/html/Arduino_skal_private_h.html @@ -0,0 +1,128 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * Arduino_skal_private.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef RTW_HEADER_Arduino_skal_private_h_
22#define RTW_HEADER_Arduino_skal_private_h_
23#include "rtwtypes.h"
24#include "builtin_typeid_types.h"
25#include "multiword_types.h"
26
27/* Private macros used by the generated code to access rtModel */
28#ifndef rtmSetFirstInitCond
29#define rtmSetFirstInitCond(rtm, val) ((rtm)->Timing.firstInitCondFlag = (val))
30#endif
31
32#ifndef rtmIsFirstInitCond
33#define rtmIsFirstInitCond(rtm) ((rtm)->Timing.firstInitCondFlag)
34#endif
35
36#ifndef rtmIsMajorTimeStep
37#define rtmIsMajorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MAJOR_TIME_STEP)
38#endif
39
40#ifndef rtmIsMinorTimeStep
41#define rtmIsMinorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MINOR_TIME_STEP)
42#endif
43
44#ifndef rtmSetTFinal
45#define rtmSetTFinal(rtm, val) ((rtm)->Timing.tFinal = (val))
46#endif
47
48#ifndef rtmSetTPtr
49#define rtmSetTPtr(rtm, val) ((rtm)->Timing.t = (val))
50#endif
51
52/* private model entry point functions */
53extern void Arduino_skal_derivatives();
54
55#endif /* RTW_HEADER_Arduino_skal_private_h_ */
56
+
+ + diff --git a/simulink_export/html/Arduino_skal_reducedblocks.html b/simulink_export/html/Arduino_skal_reducedblocks.html new file mode 100644 index 0000000..cc65050 --- /dev/null +++ b/simulink_export/html/Arduino_skal_reducedblocks.html @@ -0,0 +1,372 @@ + + + +Eliminated blocks in Arduino_skal + + + + +

+Eliminated blocks in Arduino_skal +

+
+ +
+
+ +
+List of blocks eliminated as a result of block reduction optimization. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Block + + + + +Description + + +
+<S45>/Data Type Duplicate + +Unused code path elimination +
+<S46>/Conversion + +Unused code path elimination +
+<S46>/Data Type Duplicate + +Unused code path elimination +
+<S47>/Conversion + +Unused code path elimination +
+<S47>/Data Type Duplicate + +Unused code path elimination +
+<S48>/Data Type Duplicate + +Unused code path elimination +
+<S2>/KalmanGainM + +Unused code path elimination +
+<S5>/Data Type Duplicate + +Unused code path elimination +
+<S6>/Data Type Duplicate + +Unused code path elimination +
+<S7>/Data Type Duplicate + +Unused code path elimination +
+<S8>/Data Type Duplicate + +Unused code path elimination +
+<S10>/Data Type Duplicate + +Unused code path elimination +
+<S11>/Data Type Duplicate + +Unused code path elimination +
+<S12>/Data Type Duplicate + +Unused code path elimination +
+<S13>/Conversion + +Unused code path elimination +
+<S13>/Data Type Duplicate + +Unused code path elimination +
+<S14>/Data Type Duplicate + +Unused code path elimination +
+<S15>/Data Type Duplicate + +Unused code path elimination +
+<S16>/Data Type Duplicate + +Unused code path elimination +
+<S18>/Data Type Duplicate + +Unused code path elimination +
+<S19>/Data Type Duplicate + +Unused code path elimination +
+<S1>/G + +Unused code path elimination +
+<S1>/H + +Unused code path elimination +
+<S1>/N + +Unused code path elimination +
+<S1>/P0 + +Unused code path elimination +
+<S1>/Q + +Unused code path elimination +
+<S1>/R + +Unused code path elimination +
+<S43>/CheckSignalProperties + +Unused code path elimination +
+<S44>/CheckSignalProperties + +Unused code path elimination +
+<S45>/Conversion + +Eliminate redundant data type conversion +
+<S48>/Conversion + +Eliminate redundant data type conversion +
+<S18>/Conversion + +Eliminate redundant data type conversion +
+<S22>/Reshape + +Reshape block reduction +
+<S1>/ReshapeX0 + +Reshape block reduction +
+<S1>/Reshapeu + +Reshape block reduction +
+<S1>/Reshapexhat + +Reshape block reduction +
+<S1>/Reshapey + +Reshape block reduction +
+ + + + diff --git a/simulink_export/html/Arduino_skal_subsystems.html b/simulink_export/html/Arduino_skal_subsystems.html new file mode 100644 index 0000000..3a7f815 --- /dev/null +++ b/simulink_export/html/Arduino_skal_subsystems.html @@ -0,0 +1,144 @@ + + + +Non-virtual subsystems in Arduino_skal + + + + +

+Non-virtual subsystems in Arduino_skal +

+
+ +
+
+ +
+

+1. Code Mapping [hide] +

+ + + + + + + + + + +
+

+The following table:

    +
  • +provides a mapping from the non-virtual subsystems in the model to functions or reusable functions in the generated code and +
  • +
  • +notes exceptions that caused some non-virtual subsystems to not reuse code even though they were assigned a function packaging setting ('Function packaging' entry on the Subsystem Block Dialog) of 'Auto' or 'Reusable function'. +
  • + +
+ +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +Subsystem + + + + +Reuse Setting + + + + +Reuse Outcome + + + + +Outcome Diagnostic + + +
+<S52> + +Auto + +Inline + +normal +
+<S53> + +Auto + +Inline + +normal +
+ +
+

+2. Code Reuse Exceptions [hide] +

+ + + + + + + + + + +
+

+The following section provides details on each exception that caused a non-virtual subsystem with a function packaging setting of

    +
  • +'Auto' to become an inlined code segment, +
  • +
  • +'Auto' to become a non-reusable function without arguments, or +
  • +
  • +'Reusable function' to become a non-reusable function without arguments. +
  • + +
+Note:This section does not report graphically identical non-virtual subsystems marked as 'Auto' that were not reused due to differences in their functional properties (such as dimensions, datatypes, work vectors, parameters, etc.). You may identify reasons for non-reuse in such cases by inspecting the differences in the functional attributes of the subsystems in the model or in the inlined generated code. +

+ +
+
No reuse exception in model +
+ + + + diff --git a/simulink_export/html/Arduino_skal_survey.html b/simulink_export/html/Arduino_skal_survey.html new file mode 100644 index 0000000..aedd75e --- /dev/null +++ b/simulink_export/html/Arduino_skal_survey.html @@ -0,0 +1,186 @@ + + + +Code Generation Report for 'Arduino_skal' + + + + +

+Code Generation Report for 'Arduino_skal' +

+
+ +
+
+ +
+

+Model Information +

+ + + + + + +
+

+ + + + + + + + + + + + + + + + + + + + + + +
+Author + +Daniel +
+Last Modified By + +Daniel +
+Model Version + +1.1 +
+Tasking Mode + +SingleTasking +
+
+ +Configuration settings at time of code generation + + +

+ +
+

+Code Information +

+ + + + + + +
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+System Target File + +grt.tlc +
+Hardware Device Type + +Intel->x86-64 (Windows64) +
+Simulink Coder Version + +9.5 (R2021a) 14-Nov-2020 +
+Timestamp of Generated Source Code + +Thu Apr 15 15:56:50 2021 +
+Location of Generated Source Code + + +
+Type of Build + +Model +
+Objectives Specified + +Debugging +
+ +

+ +
+

+Additional Information +

+ + + + + + +
+ + + + + + + +
+Code Generation Advisor + +Not run +
+ +
+ + + + diff --git a/simulink_export/html/Arduino_skal_types_h.html b/simulink_export/html/Arduino_skal_types_h.html new file mode 100644 index 0000000..cb96a6c --- /dev/null +++ b/simulink_export/html/Arduino_skal_types_h.html @@ -0,0 +1,88 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * Arduino_skal_types.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef RTW_HEADER_Arduino_skal_types_h_
22#define RTW_HEADER_Arduino_skal_types_h_
23#include "rtwtypes.h"
24#include "builtin_typeid_types.h"
25#include "multiword_types.h"
26
27/* Model Code Variants */
28
29/* Parameters (default storage) */
30typedef struct P_Arduino_skal_T_ P_Arduino_skal_T;
31
32/* Forward declaration for rtModel */
33typedef struct tag_RTM_Arduino_skal_T RT_MODEL_Arduino_skal_T;
34
35#endif /* RTW_HEADER_Arduino_skal_types_h_ */
36
+
+ + diff --git a/simulink_export/html/builtin_typeid_types_h.html b/simulink_export/html/builtin_typeid_types_h.html new file mode 100644 index 0000000..eebc300 --- /dev/null +++ b/simulink_export/html/builtin_typeid_types_h.html @@ -0,0 +1,110 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * builtin_typeid_types.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef BUILTIN_TYPEID_TYPES_H
22#define BUILTIN_TYPEID_TYPES_H
23#include "rtwtypes.h"
24#ifndef BUILTIN_TYPEID_TYPES
25#define BUILTIN_TYPEID_TYPES
26
27/* Enumeration of built-in data types */
28typedef enum {
29 SS_DOUBLE = 0, /* real_T */
30 SS_SINGLE = 1, /* real32_T */
31 SS_INT8 = 2, /* int8_T */
32 SS_UINT8 = 3, /* uint8_T */
33 SS_INT16 = 4, /* int16_T */
34 SS_UINT16 = 5, /* uint16_T */
35 SS_INT32 = 6, /* int32_T */
36 SS_UINT32 = 7, /* uint32_T */
37 SS_BOOLEAN = 8 /* boolean_T */
38} BuiltInDTypeId;
39
40#define SS_NUM_BUILT_IN_DTYPE ((int_T)SS_BOOLEAN+1)
41
42/* Enumeration for MAT-file logging code */
43typedef int_T DTypeId;
44
45#endif /* BUILTIN_TYPEID_TYPES */
46#endif /* BUILTIN_TYPEID_TYPES_H */
47
+
+ + diff --git a/simulink_export/html/css/coder_app.css b/simulink_export/html/css/coder_app.css new file mode 100644 index 0000000..d47cf0e --- /dev/null +++ b/simulink_export/html/css/coder_app.css @@ -0,0 +1,184 @@ +/* Copyright 2013-2018 The MathWorks, Inc. */ +pre#code { + font-family: Consolas, Courier; + font-size: small; +} + +.ct { + font-style: italic; + color: #117755 +} /* comment */ +.pp { + font-weight:bold; + color: #992211 +} /* preprocessor */ +.kw, .br { + font-weight:bold; + color: #112266 +} /* keyword or brace */ +.dt { + font-weight:bold; + color: #112266 +} /* data type */ +.tk { + font-style: normal; + color: #112266 +} /* regular token */ +pre#code a.req { + text-decoration: none; + color: #112266 +} +pre#code a.req_active { + cursor: pointer; + text-decoration: underline; +} +pre#code a.req_active:hover { + cursor: pointer; + color: blue; + text-decoration: underline +} +pre#code a.blk { + text-decoration: none; +} +pre#code a.blk_active { + cursor: pointer; + text-decoration: underline; +} +pre#code a.blk_active:hover { + cursor: pointer; + color: blue; + text-decoration: underline +} +a.hilite { + font-style: normal; + color: black; + background-color: rgba(150, 12, 116, 0.1); +} /* highlight token */ +tr.hilite { + font-style: normal; + color: black; + background-color: rgba(150, 12, 116, 0.1); +} /* highlight row */ +a.hiliteToken, tr.hiliteToken, td.hiliteToken { + background-color: #ffff99; +} +.hiliteCurrentLine, tr.hiliteCurrentLine > td { + font-style: normal; + color: black; + background-color: rgba(150, 12, 116, 0.1); + box-shadow: inset 0 1px 0 0 rgba(150, 12, 116, 0.25), inset 0 -1px 0 0 rgba(150, 12, 116, 0.25); +} +span.hiliteTotalLine { + font-style: normal; + color: #aff; +} +a.tk { + text-decoration: none; +} +a.tk:hover { + text-decoration: none; +} +a.active { + text-decoration: underline; +} +a.active:hover { + cursor: pointer; + color: blue; + text-decoration: underline +} /* hyperlink */ +table.code { + border: 0px +} +table.code td { + vertical-align: top; +} +table.code td.highlightedCurrent { + background-color: rgba(150, 12, 116, 0.1); +} +table.code > tr:first { + text-align: right; +} /* hyperlink */ + +ul.popup_attrib_list { + list-style-type:none; + display: block; + margin: 0; + padding: 0; +} +ul.popup_attrib_list li { + list-style-type:none; + display: inline; + margin: 0 18px 0 0; + padding: 0; +} +.highlighted { + background-color:yellow; +} +a:class1 { + color: -webkit-link; + text-decoration: underline; + cursor: hand; +} +.scroll +{ + height:80px; + overflow:scroll; + overflow-x:hidden; +} +div#popup_window { + position: absolute; + background-color: rgb(203,203,255); + border: solid 3px #ECECEC; + border-radius: 5px; + /* shadow box around the window*/ + -moz-box-shadow: 0 3px 3px rgba(0,0,0,0.4), inset 0 1px #FFF; + -webkit-box-shadow: 0 3px 3px rgba(0,0,0,0.4), inset 0 1px #FFF; + box-shadow: 0 3px 3px rgba(0,0,0,0.4), inset 0 1px #FFF; + padding: 2px; +} +div#popup_window a { + text-decoration: none; + color: green; +} +div#popup_window a:hover { + cursor: pointer; + text-decoration: underline; + color: blue; +} +div#popup_window tr.selected { + background-color: #ffff99; +} +div#token_usage_nav { + border-bottom: 1px solid gray; +} +table#token_usage_details { + cellpadding: 100px; + table-layout:fixed; + border: 0px; +} +.token_usage_details_tabrow { + width: 40px; +} +table#token_usage_details td { + padding-right: 5em; + padding-left: 1em; +} +.token_usage_details_tabrow:hover { + background-color: gray; +} +.nav_table td.hidden { + display: none; +} +table#codeTbl tr td { + color: #112266 +} +table#codeTbl tr td { + padding-left: 10px; +} +table#codeTbl tr td:first-child { + font-style: italic; + color: #888888; + text-align: right; + padding-left:0px; +} + diff --git a/simulink_export/html/define.js b/simulink_export/html/define.js new file mode 100644 index 0000000..1225622 --- /dev/null +++ b/simulink_export/html/define.js @@ -0,0 +1,389 @@ +function CodeDefine() { +this.def = new Array(); +this.def["rt_ertODEUpdateContinuousStates"] = {file: "Arduino_skal_cpp.html",line:28,type:"fcn"}; +this.def["step"] = {file: "Arduino_skal_cpp.html",line:106,type:"fcn"}; +this.def["Arduino_skal_derivatives"] = {file: "Arduino_skal_cpp.html",line:459,type:"fcn"}; +this.def["initialize"] = {file: "Arduino_skal_cpp.html",line:472,type:"fcn"}; +this.def["terminate"] = {file: "Arduino_skal_cpp.html",line:580,type:"fcn"}; +this.def["getRTM"] = {file: "Arduino_skal_cpp.html",line:602,type:"fcn"}; +this.def["initialize"] = {file: "Arduino_skal_h.html",line:329,type:"fcn"}; +this.def["P_Arduino_skal_T"] = {file: "Arduino_skal_types_h.html",line:30,type:"type"}; +this.def["RT_MODEL_Arduino_skal_T"] = {file: "Arduino_skal_types_h.html",line:33,type:"type"}; +this.def["Arduino_skal_P"] = {file: "Arduino_skal_data_cpp.html",line:25,type:"var"}; +this.def["BuiltInDTypeId"] = {file: "builtin_typeid_types_h.html",line:38,type:"type"}; +this.def["DTypeId"] = {file: "builtin_typeid_types_h.html",line:43,type:"type"}; +this.def["chunk_T"] = {file: "multiword_types_h.html",line:28,type:"type"}; +this.def["uchunk_T"] = {file: "multiword_types_h.html",line:29,type:"type"}; +this.def["long_T"] = {file: "multiword_types_h.html",line:34,type:"type"}; +this.def["int64m_T"] = {file: "multiword_types_h.html",line:41,type:"type"}; +this.def["cint64m_T"] = {file: "multiword_types_h.html",line:46,type:"type"}; +this.def["uint64m_T"] = {file: "multiword_types_h.html",line:50,type:"type"}; +this.def["cuint64m_T"] = {file: "multiword_types_h.html",line:55,type:"type"}; +this.def["int96m_T"] = {file: "multiword_types_h.html",line:59,type:"type"}; +this.def["cint96m_T"] = {file: "multiword_types_h.html",line:64,type:"type"}; +this.def["uint96m_T"] = {file: "multiword_types_h.html",line:68,type:"type"}; +this.def["cuint96m_T"] = {file: "multiword_types_h.html",line:73,type:"type"}; +this.def["int128m_T"] = {file: "multiword_types_h.html",line:77,type:"type"}; +this.def["cint128m_T"] = {file: "multiword_types_h.html",line:82,type:"type"}; +this.def["uint128m_T"] = {file: "multiword_types_h.html",line:86,type:"type"}; +this.def["cuint128m_T"] = {file: "multiword_types_h.html",line:91,type:"type"}; +this.def["int160m_T"] = {file: "multiword_types_h.html",line:95,type:"type"}; +this.def["cint160m_T"] = {file: "multiword_types_h.html",line:100,type:"type"}; +this.def["uint160m_T"] = {file: "multiword_types_h.html",line:104,type:"type"}; +this.def["cuint160m_T"] = {file: "multiword_types_h.html",line:109,type:"type"}; +this.def["int192m_T"] = {file: "multiword_types_h.html",line:113,type:"type"}; +this.def["cint192m_T"] = {file: "multiword_types_h.html",line:118,type:"type"}; +this.def["uint192m_T"] = {file: "multiword_types_h.html",line:122,type:"type"}; +this.def["cuint192m_T"] = {file: "multiword_types_h.html",line:127,type:"type"}; +this.def["int224m_T"] = {file: "multiword_types_h.html",line:131,type:"type"}; +this.def["cint224m_T"] = {file: "multiword_types_h.html",line:136,type:"type"}; +this.def["uint224m_T"] = {file: "multiword_types_h.html",line:140,type:"type"}; +this.def["cuint224m_T"] = {file: "multiword_types_h.html",line:145,type:"type"}; +this.def["int256m_T"] = {file: "multiword_types_h.html",line:149,type:"type"}; +this.def["cint256m_T"] = {file: "multiword_types_h.html",line:154,type:"type"}; +this.def["uint256m_T"] = {file: "multiword_types_h.html",line:158,type:"type"}; +this.def["cuint256m_T"] = {file: "multiword_types_h.html",line:163,type:"type"}; +this.def["int288m_T"] = {file: "multiword_types_h.html",line:167,type:"type"}; +this.def["cint288m_T"] = {file: "multiword_types_h.html",line:172,type:"type"}; +this.def["uint288m_T"] = {file: "multiword_types_h.html",line:176,type:"type"}; +this.def["cuint288m_T"] = {file: "multiword_types_h.html",line:181,type:"type"}; +this.def["int320m_T"] = {file: "multiword_types_h.html",line:185,type:"type"}; +this.def["cint320m_T"] = {file: "multiword_types_h.html",line:190,type:"type"}; +this.def["uint320m_T"] = {file: "multiword_types_h.html",line:194,type:"type"}; +this.def["cuint320m_T"] = {file: "multiword_types_h.html",line:199,type:"type"}; +this.def["int352m_T"] = {file: "multiword_types_h.html",line:203,type:"type"}; +this.def["cint352m_T"] = {file: "multiword_types_h.html",line:208,type:"type"}; +this.def["uint352m_T"] = {file: "multiword_types_h.html",line:212,type:"type"}; +this.def["cuint352m_T"] = {file: "multiword_types_h.html",line:217,type:"type"}; +this.def["int384m_T"] = {file: "multiword_types_h.html",line:221,type:"type"}; +this.def["cint384m_T"] = {file: "multiword_types_h.html",line:226,type:"type"}; +this.def["uint384m_T"] = {file: "multiword_types_h.html",line:230,type:"type"}; +this.def["cuint384m_T"] = {file: "multiword_types_h.html",line:235,type:"type"}; +this.def["int416m_T"] = {file: "multiword_types_h.html",line:239,type:"type"}; +this.def["cint416m_T"] = {file: "multiword_types_h.html",line:244,type:"type"}; +this.def["uint416m_T"] = {file: "multiword_types_h.html",line:248,type:"type"}; +this.def["cuint416m_T"] = {file: "multiword_types_h.html",line:253,type:"type"}; +this.def["int448m_T"] = {file: "multiword_types_h.html",line:257,type:"type"}; +this.def["cint448m_T"] = {file: "multiword_types_h.html",line:262,type:"type"}; +this.def["uint448m_T"] = {file: "multiword_types_h.html",line:266,type:"type"}; +this.def["cuint448m_T"] = {file: "multiword_types_h.html",line:271,type:"type"}; +this.def["int480m_T"] = {file: "multiword_types_h.html",line:275,type:"type"}; +this.def["cint480m_T"] = {file: "multiword_types_h.html",line:280,type:"type"}; +this.def["uint480m_T"] = {file: "multiword_types_h.html",line:284,type:"type"}; +this.def["cuint480m_T"] = {file: "multiword_types_h.html",line:289,type:"type"}; +this.def["int512m_T"] = {file: "multiword_types_h.html",line:293,type:"type"}; +this.def["cint512m_T"] = {file: "multiword_types_h.html",line:298,type:"type"}; +this.def["uint512m_T"] = {file: "multiword_types_h.html",line:302,type:"type"}; +this.def["cuint512m_T"] = {file: "multiword_types_h.html",line:307,type:"type"}; +this.def["int544m_T"] = {file: "multiword_types_h.html",line:311,type:"type"}; +this.def["cint544m_T"] = {file: "multiword_types_h.html",line:316,type:"type"}; +this.def["uint544m_T"] = {file: "multiword_types_h.html",line:320,type:"type"}; +this.def["cuint544m_T"] = {file: "multiword_types_h.html",line:325,type:"type"}; +this.def["int576m_T"] = {file: "multiword_types_h.html",line:329,type:"type"}; +this.def["cint576m_T"] = {file: "multiword_types_h.html",line:334,type:"type"}; +this.def["uint576m_T"] = {file: "multiword_types_h.html",line:338,type:"type"}; +this.def["cuint576m_T"] = {file: "multiword_types_h.html",line:343,type:"type"}; +this.def["int608m_T"] = {file: "multiword_types_h.html",line:347,type:"type"}; +this.def["cint608m_T"] = {file: "multiword_types_h.html",line:352,type:"type"}; +this.def["uint608m_T"] = {file: "multiword_types_h.html",line:356,type:"type"}; +this.def["cuint608m_T"] = {file: "multiword_types_h.html",line:361,type:"type"}; +this.def["int640m_T"] = {file: "multiword_types_h.html",line:365,type:"type"}; +this.def["cint640m_T"] = {file: "multiword_types_h.html",line:370,type:"type"}; +this.def["uint640m_T"] = {file: "multiword_types_h.html",line:374,type:"type"}; +this.def["cuint640m_T"] = {file: "multiword_types_h.html",line:379,type:"type"}; +this.def["int672m_T"] = {file: "multiword_types_h.html",line:383,type:"type"}; +this.def["cint672m_T"] = {file: "multiword_types_h.html",line:388,type:"type"}; +this.def["uint672m_T"] = {file: "multiword_types_h.html",line:392,type:"type"}; +this.def["cuint672m_T"] = {file: "multiword_types_h.html",line:397,type:"type"}; +this.def["int704m_T"] = {file: "multiword_types_h.html",line:401,type:"type"}; +this.def["cint704m_T"] = {file: "multiword_types_h.html",line:406,type:"type"}; +this.def["uint704m_T"] = {file: "multiword_types_h.html",line:410,type:"type"}; +this.def["cuint704m_T"] = {file: "multiword_types_h.html",line:415,type:"type"}; +this.def["int736m_T"] = {file: "multiword_types_h.html",line:419,type:"type"}; +this.def["cint736m_T"] = {file: "multiword_types_h.html",line:424,type:"type"}; +this.def["uint736m_T"] = {file: "multiword_types_h.html",line:428,type:"type"}; +this.def["cuint736m_T"] = {file: "multiword_types_h.html",line:433,type:"type"}; +this.def["int768m_T"] = {file: "multiword_types_h.html",line:437,type:"type"}; +this.def["cint768m_T"] = {file: "multiword_types_h.html",line:442,type:"type"}; +this.def["uint768m_T"] = {file: "multiword_types_h.html",line:446,type:"type"}; +this.def["cuint768m_T"] = {file: "multiword_types_h.html",line:451,type:"type"}; +this.def["int800m_T"] = {file: "multiword_types_h.html",line:455,type:"type"}; +this.def["cint800m_T"] = {file: "multiword_types_h.html",line:460,type:"type"}; +this.def["uint800m_T"] = {file: "multiword_types_h.html",line:464,type:"type"}; +this.def["cuint800m_T"] = {file: "multiword_types_h.html",line:469,type:"type"}; +this.def["int832m_T"] = {file: "multiword_types_h.html",line:473,type:"type"}; +this.def["cint832m_T"] = {file: "multiword_types_h.html",line:478,type:"type"}; +this.def["uint832m_T"] = {file: "multiword_types_h.html",line:482,type:"type"}; +this.def["cuint832m_T"] = {file: "multiword_types_h.html",line:487,type:"type"}; +this.def["int864m_T"] = {file: "multiword_types_h.html",line:491,type:"type"}; +this.def["cint864m_T"] = {file: "multiword_types_h.html",line:496,type:"type"}; +this.def["uint864m_T"] = {file: "multiword_types_h.html",line:500,type:"type"}; +this.def["cuint864m_T"] = {file: "multiword_types_h.html",line:505,type:"type"}; +this.def["int896m_T"] = {file: "multiword_types_h.html",line:509,type:"type"}; +this.def["cint896m_T"] = {file: "multiword_types_h.html",line:514,type:"type"}; +this.def["uint896m_T"] = {file: "multiword_types_h.html",line:518,type:"type"}; +this.def["cuint896m_T"] = {file: "multiword_types_h.html",line:523,type:"type"}; +this.def["int928m_T"] = {file: "multiword_types_h.html",line:527,type:"type"}; +this.def["cint928m_T"] = {file: "multiword_types_h.html",line:532,type:"type"}; +this.def["uint928m_T"] = {file: "multiword_types_h.html",line:536,type:"type"}; +this.def["cuint928m_T"] = {file: "multiword_types_h.html",line:541,type:"type"}; +this.def["int960m_T"] = {file: "multiword_types_h.html",line:545,type:"type"}; +this.def["cint960m_T"] = {file: "multiword_types_h.html",line:550,type:"type"}; +this.def["uint960m_T"] = {file: "multiword_types_h.html",line:554,type:"type"}; +this.def["cuint960m_T"] = {file: "multiword_types_h.html",line:559,type:"type"}; +this.def["int992m_T"] = {file: "multiword_types_h.html",line:563,type:"type"}; +this.def["cint992m_T"] = {file: "multiword_types_h.html",line:568,type:"type"}; +this.def["uint992m_T"] = {file: "multiword_types_h.html",line:572,type:"type"}; +this.def["cuint992m_T"] = {file: "multiword_types_h.html",line:577,type:"type"}; +this.def["int1024m_T"] = {file: "multiword_types_h.html",line:581,type:"type"}; +this.def["cint1024m_T"] = {file: "multiword_types_h.html",line:586,type:"type"}; +this.def["uint1024m_T"] = {file: "multiword_types_h.html",line:590,type:"type"}; +this.def["cuint1024m_T"] = {file: "multiword_types_h.html",line:595,type:"type"}; +this.def["int1056m_T"] = {file: "multiword_types_h.html",line:599,type:"type"}; +this.def["cint1056m_T"] = {file: "multiword_types_h.html",line:604,type:"type"}; +this.def["uint1056m_T"] = {file: "multiword_types_h.html",line:608,type:"type"}; +this.def["cuint1056m_T"] = {file: "multiword_types_h.html",line:613,type:"type"}; +this.def["int1088m_T"] = {file: "multiword_types_h.html",line:617,type:"type"}; +this.def["cint1088m_T"] = {file: "multiword_types_h.html",line:622,type:"type"}; +this.def["uint1088m_T"] = {file: "multiword_types_h.html",line:626,type:"type"}; +this.def["cuint1088m_T"] = {file: "multiword_types_h.html",line:631,type:"type"}; +this.def["int1120m_T"] = {file: "multiword_types_h.html",line:635,type:"type"}; +this.def["cint1120m_T"] = {file: "multiword_types_h.html",line:640,type:"type"}; +this.def["uint1120m_T"] = {file: "multiword_types_h.html",line:644,type:"type"}; +this.def["cuint1120m_T"] = {file: "multiword_types_h.html",line:649,type:"type"}; +this.def["int1152m_T"] = {file: "multiword_types_h.html",line:653,type:"type"}; +this.def["cint1152m_T"] = {file: "multiword_types_h.html",line:658,type:"type"}; +this.def["uint1152m_T"] = {file: "multiword_types_h.html",line:662,type:"type"}; +this.def["cuint1152m_T"] = {file: "multiword_types_h.html",line:667,type:"type"}; +this.def["int1184m_T"] = {file: "multiword_types_h.html",line:671,type:"type"}; +this.def["cint1184m_T"] = {file: "multiword_types_h.html",line:676,type:"type"}; +this.def["uint1184m_T"] = {file: "multiword_types_h.html",line:680,type:"type"}; +this.def["cuint1184m_T"] = {file: "multiword_types_h.html",line:685,type:"type"}; +this.def["int1216m_T"] = {file: "multiword_types_h.html",line:689,type:"type"}; +this.def["cint1216m_T"] = {file: "multiword_types_h.html",line:694,type:"type"}; +this.def["uint1216m_T"] = {file: "multiword_types_h.html",line:698,type:"type"}; +this.def["cuint1216m_T"] = {file: "multiword_types_h.html",line:703,type:"type"}; +this.def["int1248m_T"] = {file: "multiword_types_h.html",line:707,type:"type"}; +this.def["cint1248m_T"] = {file: "multiword_types_h.html",line:712,type:"type"}; +this.def["uint1248m_T"] = {file: "multiword_types_h.html",line:716,type:"type"}; +this.def["cuint1248m_T"] = {file: "multiword_types_h.html",line:721,type:"type"}; +this.def["int1280m_T"] = {file: "multiword_types_h.html",line:725,type:"type"}; +this.def["cint1280m_T"] = {file: "multiword_types_h.html",line:730,type:"type"}; +this.def["uint1280m_T"] = {file: "multiword_types_h.html",line:734,type:"type"}; +this.def["cuint1280m_T"] = {file: "multiword_types_h.html",line:739,type:"type"}; +this.def["int1312m_T"] = {file: "multiword_types_h.html",line:743,type:"type"}; +this.def["cint1312m_T"] = {file: "multiword_types_h.html",line:748,type:"type"}; +this.def["uint1312m_T"] = {file: "multiword_types_h.html",line:752,type:"type"}; +this.def["cuint1312m_T"] = {file: "multiword_types_h.html",line:757,type:"type"}; +this.def["int1344m_T"] = {file: "multiword_types_h.html",line:761,type:"type"}; +this.def["cint1344m_T"] = {file: "multiword_types_h.html",line:766,type:"type"}; +this.def["uint1344m_T"] = {file: "multiword_types_h.html",line:770,type:"type"}; +this.def["cuint1344m_T"] = {file: "multiword_types_h.html",line:775,type:"type"}; +this.def["int1376m_T"] = {file: "multiword_types_h.html",line:779,type:"type"}; +this.def["cint1376m_T"] = {file: "multiword_types_h.html",line:784,type:"type"}; +this.def["uint1376m_T"] = {file: "multiword_types_h.html",line:788,type:"type"}; +this.def["cuint1376m_T"] = {file: "multiword_types_h.html",line:793,type:"type"}; +this.def["int1408m_T"] = {file: "multiword_types_h.html",line:797,type:"type"}; +this.def["cint1408m_T"] = {file: "multiword_types_h.html",line:802,type:"type"}; +this.def["uint1408m_T"] = {file: "multiword_types_h.html",line:806,type:"type"}; +this.def["cuint1408m_T"] = {file: "multiword_types_h.html",line:811,type:"type"}; +this.def["int1440m_T"] = {file: "multiword_types_h.html",line:815,type:"type"}; +this.def["cint1440m_T"] = {file: "multiword_types_h.html",line:820,type:"type"}; +this.def["uint1440m_T"] = {file: "multiword_types_h.html",line:824,type:"type"}; +this.def["cuint1440m_T"] = {file: "multiword_types_h.html",line:829,type:"type"}; +this.def["int1472m_T"] = {file: "multiword_types_h.html",line:833,type:"type"}; +this.def["cint1472m_T"] = {file: "multiword_types_h.html",line:838,type:"type"}; +this.def["uint1472m_T"] = {file: "multiword_types_h.html",line:842,type:"type"}; +this.def["cuint1472m_T"] = {file: "multiword_types_h.html",line:847,type:"type"}; +this.def["int1504m_T"] = {file: "multiword_types_h.html",line:851,type:"type"}; +this.def["cint1504m_T"] = {file: "multiword_types_h.html",line:856,type:"type"}; +this.def["uint1504m_T"] = {file: "multiword_types_h.html",line:860,type:"type"}; +this.def["cuint1504m_T"] = {file: "multiword_types_h.html",line:865,type:"type"}; +this.def["int1536m_T"] = {file: "multiword_types_h.html",line:869,type:"type"}; +this.def["cint1536m_T"] = {file: "multiword_types_h.html",line:874,type:"type"}; +this.def["uint1536m_T"] = {file: "multiword_types_h.html",line:878,type:"type"}; +this.def["cuint1536m_T"] = {file: "multiword_types_h.html",line:883,type:"type"}; +this.def["int1568m_T"] = {file: "multiword_types_h.html",line:887,type:"type"}; +this.def["cint1568m_T"] = {file: "multiword_types_h.html",line:892,type:"type"}; +this.def["uint1568m_T"] = {file: "multiword_types_h.html",line:896,type:"type"}; +this.def["cuint1568m_T"] = {file: "multiword_types_h.html",line:901,type:"type"}; +this.def["int1600m_T"] = {file: "multiword_types_h.html",line:905,type:"type"}; +this.def["cint1600m_T"] = {file: "multiword_types_h.html",line:910,type:"type"}; +this.def["uint1600m_T"] = {file: "multiword_types_h.html",line:914,type:"type"}; +this.def["cuint1600m_T"] = {file: "multiword_types_h.html",line:919,type:"type"}; +this.def["int1632m_T"] = {file: "multiword_types_h.html",line:923,type:"type"}; +this.def["cint1632m_T"] = {file: "multiword_types_h.html",line:928,type:"type"}; +this.def["uint1632m_T"] = {file: "multiword_types_h.html",line:932,type:"type"}; +this.def["cuint1632m_T"] = {file: "multiword_types_h.html",line:937,type:"type"}; +this.def["int1664m_T"] = {file: "multiword_types_h.html",line:941,type:"type"}; +this.def["cint1664m_T"] = {file: "multiword_types_h.html",line:946,type:"type"}; +this.def["uint1664m_T"] = {file: "multiword_types_h.html",line:950,type:"type"}; +this.def["cuint1664m_T"] = {file: "multiword_types_h.html",line:955,type:"type"}; +this.def["int1696m_T"] = {file: "multiword_types_h.html",line:959,type:"type"}; +this.def["cint1696m_T"] = {file: "multiword_types_h.html",line:964,type:"type"}; +this.def["uint1696m_T"] = {file: "multiword_types_h.html",line:968,type:"type"}; +this.def["cuint1696m_T"] = {file: "multiword_types_h.html",line:973,type:"type"}; +this.def["int1728m_T"] = {file: "multiword_types_h.html",line:977,type:"type"}; +this.def["cint1728m_T"] = {file: "multiword_types_h.html",line:982,type:"type"}; +this.def["uint1728m_T"] = {file: "multiword_types_h.html",line:986,type:"type"}; +this.def["cuint1728m_T"] = {file: "multiword_types_h.html",line:991,type:"type"}; +this.def["int1760m_T"] = {file: "multiword_types_h.html",line:995,type:"type"}; +this.def["cint1760m_T"] = {file: "multiword_types_h.html",line:1000,type:"type"}; +this.def["uint1760m_T"] = {file: "multiword_types_h.html",line:1004,type:"type"}; +this.def["cuint1760m_T"] = {file: "multiword_types_h.html",line:1009,type:"type"}; +this.def["int1792m_T"] = {file: "multiword_types_h.html",line:1013,type:"type"}; +this.def["cint1792m_T"] = {file: "multiword_types_h.html",line:1018,type:"type"}; +this.def["uint1792m_T"] = {file: "multiword_types_h.html",line:1022,type:"type"}; +this.def["cuint1792m_T"] = {file: "multiword_types_h.html",line:1027,type:"type"}; +this.def["int1824m_T"] = {file: "multiword_types_h.html",line:1031,type:"type"}; +this.def["cint1824m_T"] = {file: "multiword_types_h.html",line:1036,type:"type"}; +this.def["uint1824m_T"] = {file: "multiword_types_h.html",line:1040,type:"type"}; +this.def["cuint1824m_T"] = {file: "multiword_types_h.html",line:1045,type:"type"}; +this.def["int1856m_T"] = {file: "multiword_types_h.html",line:1049,type:"type"}; +this.def["cint1856m_T"] = {file: "multiword_types_h.html",line:1054,type:"type"}; +this.def["uint1856m_T"] = {file: "multiword_types_h.html",line:1058,type:"type"}; +this.def["cuint1856m_T"] = {file: "multiword_types_h.html",line:1063,type:"type"}; +this.def["int1888m_T"] = {file: "multiword_types_h.html",line:1067,type:"type"}; +this.def["cint1888m_T"] = {file: "multiword_types_h.html",line:1072,type:"type"}; +this.def["uint1888m_T"] = {file: "multiword_types_h.html",line:1076,type:"type"}; +this.def["cuint1888m_T"] = {file: "multiword_types_h.html",line:1081,type:"type"}; +this.def["int1920m_T"] = {file: "multiword_types_h.html",line:1085,type:"type"}; +this.def["cint1920m_T"] = {file: "multiword_types_h.html",line:1090,type:"type"}; +this.def["uint1920m_T"] = {file: "multiword_types_h.html",line:1094,type:"type"}; +this.def["cuint1920m_T"] = {file: "multiword_types_h.html",line:1099,type:"type"}; +this.def["int1952m_T"] = {file: "multiword_types_h.html",line:1103,type:"type"}; +this.def["cint1952m_T"] = {file: "multiword_types_h.html",line:1108,type:"type"}; +this.def["uint1952m_T"] = {file: "multiword_types_h.html",line:1112,type:"type"}; +this.def["cuint1952m_T"] = {file: "multiword_types_h.html",line:1117,type:"type"}; +this.def["int1984m_T"] = {file: "multiword_types_h.html",line:1121,type:"type"}; +this.def["cint1984m_T"] = {file: "multiword_types_h.html",line:1126,type:"type"}; +this.def["uint1984m_T"] = {file: "multiword_types_h.html",line:1130,type:"type"}; +this.def["cuint1984m_T"] = {file: "multiword_types_h.html",line:1135,type:"type"}; +this.def["int2016m_T"] = {file: "multiword_types_h.html",line:1139,type:"type"}; +this.def["cint2016m_T"] = {file: "multiword_types_h.html",line:1144,type:"type"}; +this.def["uint2016m_T"] = {file: "multiword_types_h.html",line:1148,type:"type"}; +this.def["cuint2016m_T"] = {file: "multiword_types_h.html",line:1153,type:"type"}; +this.def["int2048m_T"] = {file: "multiword_types_h.html",line:1157,type:"type"}; +this.def["cint2048m_T"] = {file: "multiword_types_h.html",line:1162,type:"type"}; +this.def["uint2048m_T"] = {file: "multiword_types_h.html",line:1166,type:"type"}; +this.def["cuint2048m_T"] = {file: "multiword_types_h.html",line:1171,type:"type"}; +this.def["rtGetInf"] = {file: "rtGetInf_cpp.html",line:33,type:"fcn"}; +this.def["rtGetInfF"] = {file: "rtGetInf_cpp.html",line:81,type:"fcn"}; +this.def["rtGetMinusInf"] = {file: "rtGetInf_cpp.html",line:92,type:"fcn"}; +this.def["rtGetMinusInfF"] = {file: "rtGetInf_cpp.html",line:140,type:"fcn"}; +this.def["rtGetNaN"] = {file: "rtGetNaN_cpp.html",line:33,type:"fcn"}; +this.def["rtGetNaNF"] = {file: "rtGetNaN_cpp.html",line:81,type:"fcn"}; +this.def["rtInf"] = {file: "rt_nonfinite_cpp.html",line:32,type:"var"}; +this.def["rtMinusInf"] = {file: "rt_nonfinite_cpp.html",line:33,type:"var"}; +this.def["rtNaN"] = {file: "rt_nonfinite_cpp.html",line:34,type:"var"}; +this.def["rtInfF"] = {file: "rt_nonfinite_cpp.html",line:35,type:"var"}; +this.def["rtMinusInfF"] = {file: "rt_nonfinite_cpp.html",line:36,type:"var"}; +this.def["rtNaNF"] = {file: "rt_nonfinite_cpp.html",line:37,type:"var"}; +this.def["rt_InitInfAndNaN"] = {file: "rt_nonfinite_cpp.html",line:45,type:"fcn"}; +this.def["rtIsInf"] = {file: "rt_nonfinite_cpp.html",line:57,type:"fcn"}; +this.def["rtIsInfF"] = {file: "rt_nonfinite_cpp.html",line:63,type:"fcn"}; +this.def["rtIsNaN"] = {file: "rt_nonfinite_cpp.html",line:69,type:"fcn"}; +this.def["rtIsNaNF"] = {file: "rt_nonfinite_cpp.html",line:92,type:"fcn"}; +this.def["wordH"] = {file: "rt_nonfinite_h.html",line:44,type:"var"}; +this.def["pointer_T"] = {file: "rtwtypes_h.html",line:27,type:"type"}; +this.def["LogInfo"] = {file: "rt_logging_c.html",line:95,type:"type"}; +this.def["MatItem"] = {file: "rt_logging_c.html",line:101,type:"type"}; +this.def["ItemDataKind"] = {file: "rt_logging_c.html",line:108,type:"type"}; +this.def["rt_logging.c:rtMemAllocError"] = {file: "rt_logging_c.html",line:114,type:"var"}; +this.def["rt_logging.c:rtStructLogVarFieldNames"] = {file: "rt_logging_c.html",line:136,type:"var"}; +this.def["rt_logging.c:rtLocalLoggingSignalsStructFieldNames"] = {file: "rt_logging_c.html",line:141,type:"var"}; +this.def["rt_logging.c:rtGlobalLoggingSignalsStructFieldNames"] = {file: "rt_logging_c.html",line:149,type:"var"}; +this.def["rt_logging.c:rtLocalLoggingSignalsStructFieldNames_noValDims"] = {file: "rt_logging_c.html",line:174,type:"var"}; +this.def["rt_logging.c:rtGlobalLoggingSignalsStructFieldNames_noValDims"] = {file: "rt_logging_c.html",line:180,type:"var"}; +this.def["rt_logging.c:rt_GetSizeofDataType"] = {file: "rt_logging_c.html",line:200,type:"fcn"}; +this.def["rt_logging.c:rt_GetSizeofComplexType"] = {file: "rt_logging_c.html",line:242,type:"fcn"}; +this.def["rt_logging.c:rt_GetDataTypeConvertInfo"] = {file: "rt_logging_c.html",line:302,type:"fcn"}; +this.def["rt_logging.c:rt_GetDblValueFromOverSizedData"] = {file: "rt_logging_c.html",line:331,type:"fcn"}; +this.def["rt_logging.c:rt_GetNonBoolMxIdFromDTypeId"] = {file: "rt_logging_c.html",line:393,type:"fcn"}; +this.def["rt_GetMxIdFromDTypeIdForRSim"] = {file: "rt_logging_c.html",line:477,type:"fcn"}; +this.def["rt_GetMxIdFromDTypeId"] = {file: "rt_logging_c.html",line:520,type:"fcn"}; +this.def["rt_logging.c:rt_GetMatIdFromMxId"] = {file: "rt_logging_c.html",line:556,type:"fcn"}; +this.def["rt_logging.c:rt_ProcessMatItem"] = {file: "rt_logging_c.html",line:625,type:"fcn"}; +this.def["rt_logging.c:rt_WriteItemToMatFile"] = {file: "rt_logging_c.html",line:1112,type:"fcn"}; +this.def["rt_logging.c:rt_WriteMat5FileHeader"] = {file: "rt_logging_c.html",line:1163,type:"fcn"}; +this.def["rt_logging.c:rt_FixupLogVar"] = {file: "rt_logging_c.html",line:1200,type:"fcn"}; +this.def["rt_logging.c:rt_LoadModifiedLogVarName"] = {file: "rt_logging_c.html",line:1423,type:"fcn"}; +this.def["rt_logging.c:rt_GetActualDTypeID"] = {file: "rt_logging_c.html",line:1460,type:"fcn"}; +this.def["rt_logging.c:rt_DestroyLogVar"] = {file: "rt_logging_c.html",line:1482,type:"fcn"}; +this.def["rt_logging.c:rt_DestroyStructLogVar"] = {file: "rt_logging_c.html",line:1512,type:"fcn"}; +this.def["rt_logging.c:rt_InitSignalsStruct"] = {file: "rt_logging_c.html",line:1548,type:"fcn"}; +this.def["rt_logging.c:local_CreateStructLogVar"] = {file: "rt_logging_c.html",line:2101,type:"fcn"}; +this.def["rt_logging.c:rt_StartDataLoggingForOutput"] = {file: "rt_logging_c.html",line:2246,type:"fcn"}; +this.def["rt_logging.c:rt_ReallocLogVar"] = {file: "rt_logging_c.html",line:2402,type:"fcn"}; +this.def["rt_UpdateLogVarWithDiscontiguousData"] = {file: "rt_logging_c.html",line:2544,type:"fcn"}; +this.def["rt_CreateLogVarWithConvert"] = {file: "rt_logging_c.html",line:2663,type:"fcn"}; +this.def["rt_CreateLogVar"] = {file: "rt_logging_c.html",line:3040,type:"fcn"}; +this.def["rt_CreateStructLogVar"] = {file: "rt_logging_c.html",line:3108,type:"fcn"}; +this.def["rt_StartDataLoggingWithStartTime"] = {file: "rt_logging_c.html",line:3160,type:"fcn"}; +this.def["rt_StartDataLogging"] = {file: "rt_logging_c.html",line:3311,type:"fcn"}; +this.def["rt_UpdateLogVar"] = {file: "rt_logging_c.html",line:3340,type:"fcn"}; +this.def["rt_UpdateStructLogVar"] = {file: "rt_logging_c.html",line:3827,type:"fcn"}; +this.def["rt_getTempMemory"] = {file: "rt_logging_c.html",line:3872,type:"fcn"}; +this.def["rt_preProcessAndLogDataWithIndex"] = {file: "rt_logging_c.html",line:3894,type:"fcn"}; +this.def["rt_preProcessAndLogData"] = {file: "rt_logging_c.html",line:3924,type:"fcn"}; +this.def["rt_UpdateTXYLogVars"] = {file: "rt_logging_c.html",line:3933,type:"fcn"}; +this.def["rt_UpdateTXXFYLogVars"] = {file: "rt_logging_c.html",line:3942,type:"fcn"}; +this.def["rt_StopDataLoggingImpl"] = {file: "rt_logging_c.html",line:4130,type:"fcn"}; +this.def["rt_StopDataLogging"] = {file: "rt_logging_c.html",line:4270,type:"fcn"}; +} +CodeDefine.instance = new CodeDefine(); +var testHarnessInfo = {OwnerFileName: "", HarnessOwner: "", HarnessName: "", IsTestHarness: "0"}; +var relPathToBuildDir = "../ert_main.c"; +var fileSep = "\\"; +var isPC = true; +function Html2SrcLink() { + this.html2SrcPath = new Array; + this.html2Root = new Array; + this.html2SrcPath["Arduino_skal_cpp.html"] = "../Arduino_skal.cpp"; + this.html2Root["Arduino_skal_cpp.html"] = "Arduino_skal_cpp.html"; + this.html2SrcPath["Arduino_skal_h.html"] = "../Arduino_skal.h"; + this.html2Root["Arduino_skal_h.html"] = "Arduino_skal_h.html"; + this.html2SrcPath["Arduino_skal_private_h.html"] = "../Arduino_skal_private.h"; + this.html2Root["Arduino_skal_private_h.html"] = "Arduino_skal_private_h.html"; + this.html2SrcPath["Arduino_skal_types_h.html"] = "../Arduino_skal_types.h"; + this.html2Root["Arduino_skal_types_h.html"] = "Arduino_skal_types_h.html"; + this.html2SrcPath["Arduino_skal_data_cpp.html"] = "../Arduino_skal_data.cpp"; + this.html2Root["Arduino_skal_data_cpp.html"] = "Arduino_skal_data_cpp.html"; + this.html2SrcPath["builtin_typeid_types_h.html"] = "../builtin_typeid_types.h"; + this.html2Root["builtin_typeid_types_h.html"] = "builtin_typeid_types_h.html"; + this.html2SrcPath["multiword_types_h.html"] = "../multiword_types.h"; + this.html2Root["multiword_types_h.html"] = "multiword_types_h.html"; + this.html2SrcPath["rtGetInf_cpp.html"] = "../rtGetInf.cpp"; + this.html2Root["rtGetInf_cpp.html"] = "rtGetInf_cpp.html"; + this.html2SrcPath["rtGetInf_h.html"] = "../rtGetInf.h"; + this.html2Root["rtGetInf_h.html"] = "rtGetInf_h.html"; + this.html2SrcPath["rtGetNaN_cpp.html"] = "../rtGetNaN.cpp"; + this.html2Root["rtGetNaN_cpp.html"] = "rtGetNaN_cpp.html"; + this.html2SrcPath["rtGetNaN_h.html"] = "../rtGetNaN.h"; + this.html2Root["rtGetNaN_h.html"] = "rtGetNaN_h.html"; + this.html2SrcPath["rt_nonfinite_cpp.html"] = "../rt_nonfinite.cpp"; + this.html2Root["rt_nonfinite_cpp.html"] = "rt_nonfinite_cpp.html"; + this.html2SrcPath["rt_nonfinite_h.html"] = "../rt_nonfinite.h"; + this.html2Root["rt_nonfinite_h.html"] = "rt_nonfinite_h.html"; + this.html2SrcPath["rtwtypes_h.html"] = "../rtwtypes.h"; + this.html2Root["rtwtypes_h.html"] = "rtwtypes_h.html"; + this.html2SrcPath["rtmodel_h.html"] = "../rtmodel.h"; + this.html2Root["rtmodel_h.html"] = "rtmodel_h.html"; + this.html2SrcPath["rt_logging_c.html"] = "../../../../../Program Files/MATLAB/R2021a/rtw/c/src/rt_logging.c"; + this.html2Root["rt_logging_c.html"] = "rt_logging_c.html"; + this.getLink2Src = function (htmlFileName) { + if (this.html2SrcPath[htmlFileName]) + return this.html2SrcPath[htmlFileName]; + else + return null; + } + this.getLinkFromRoot = function (htmlFileName) { + if (this.html2Root[htmlFileName]) + return this.html2Root[htmlFileName]; + else + return null; + } +} +Html2SrcLink.instance = new Html2SrcLink(); +var fileList = [ +"Arduino_skal_cpp.html","Arduino_skal_h.html","Arduino_skal_private_h.html","Arduino_skal_types_h.html","Arduino_skal_data_cpp.html","builtin_typeid_types_h.html","multiword_types_h.html","rtGetInf_cpp.html","rtGetInf_h.html","rtGetNaN_cpp.html","rtGetNaN_h.html","rt_nonfinite_cpp.html","rt_nonfinite_h.html","rtwtypes_h.html","rtmodel_h.html","rt_logging_c.html"]; diff --git a/simulink_export/html/hilite_warning.png b/simulink_export/html/hilite_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..f013f815ae58acfcb9112170c871851d666b820f GIT binary patch literal 3014 zcmV;%3pw004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 + + + + + + + + + + + + +
+ + diff --git a/simulink_export/html/js/coder_app.js b/simulink_export/html/js/coder_app.js new file mode 100644 index 0000000..7175d8a --- /dev/null +++ b/simulink_export/html/js/coder_app.js @@ -0,0 +1,525 @@ +/* Copyright 2013-2018 The MathWorks, Inc. */ +function queryByClassName(className, elem) { + if (!elem) elem = document.body; + if (typeof elem.querySelectorAll === "function") { + return elem.querySelectorAll("."+className); + } else { + return elem.getElementsByClass(className); + } +} + +function nav_token_usage_details(direction) { + var els = queryByClassName("token_usage_details_tabrow"); + var selectedIdx = 0; + var selectedClassName = "selected"; + for (selectedIdx; selectedIdx < els.length; selectedIdx++) { + if (els[selectedIdx].classList.contains(selectedClassName)) { + break; + } + } + var nextIdx = selectedIdx; + if (direction === -1 && selectedIdx > 0) { + nextIdx = selectedIdx-1; + } else if (direction === 1 && selectedIdx < els.length - 1) { + nextIdx = selectedIdx + 1; + } + if (nextIdx !== selectedIdx) { + els[selectedIdx].classList.remove(selectedClassName); + els[nextIdx].classList.add(selectedClassName); + els[nextIdx].scrollIntoView(alignWithTop=false); + } + return false; +} + +function tabrowClicked(event) { +} + +function popupOnload() { + var els = queryByClassName("token_usage_details_tabrow"); + for (var i=0; i" + + top.rtwGetFileName(link2Src) + ""; + var bodyNode = document.body; + bodyNode.insertBefore(link, bodyNode.firstElementChild); + } + top.updateHyperlinks(); + // update fileSelector frame + if (top.fileSelector) { + var o = top.fileSelector.document.getElementById('fileSelector'); + if (o) { + o.value = filename; + } + } + // add links to line numbers + var hasLineFlag = null; + if (top.TraceInfoLineFlag && top.TraceInfoLineFlag.instance) { + hasLineFlag = true; + } else { + hasLineFlag = false; + } + + if(hasLineFlag) { + var lines = queryByClassName("ln", codeElement); + var lineTraceFlag = top.TraceInfoLineFlag.instance.lineTraceFlag; + var lineNo = null; + for (var i=0; i= 0; --i) { + var childNode = trNode.childNodes[i]; + if (childNode.tagName.toUpperCase() === "TD") { + return childNode.childNodes; + } + } + return null; +} + +// see g1225075 +function fixBoxStyleFnHeaderLineWidths() { + // Match strings like "/**********/" which is the top line of + // a box-style function comment header + var reBoxHeader = /\/\*+\//; + + // Match strings like "' */" which is the contents of the text + // element originally generated in the report to pad the width of + // the line. + var rePadding = /'\s*\*\//; + + // All block identifier elements in the report page + blkLineElts = queryByClassName("blk"); + for (var i = 0; i < blkLineElts.length; ++i) { + var origPadding = blkLineElts[i].nextSibling; + if (origPadding.textContent.match(rePadding)) { + var spanElt = findParent(blkLineElts[i], { tagName: "span", className: "ct" }); + if (!spanElt) { + continue; + } + + // The numbered line in the report containing block identifier "i" + var tableRowElt = findParent(spanElt, { tagName: "tr" }); + if (!tableRowElt) { + continue; + } + + // Loop backward through table rows (i.e., report lines) looking + // for the "/***************/" start of the header. When found save + // its pixel width. Not actually the width of the itself but + // the span inside its last . This is will determine the real + // padding that is needed for proper alignment regardless of font + // or CKJ characters. + var targetWidth = 0; + var sanity = Number.MAX_VALUE; + var node = tableRowElt.previousSibling; + while (node && (sanity-- > 0)) { + var lastCellContents = getLastTableCellContents(node); + if (lastCellContents) { + if (lastCellContents.length === 0) { + break; + } + if (lastCellContents[0].textContent.match(reBoxHeader)) { + targetWidth = lastCellContents[0].offsetWidth; + break; + } + } + node = node.previousSibling; + } + + // If applying a new padding (i.e., targetWidth > 0), replace + // the original padding "' */' (a single text element) with + // two text elements and a span in between. The span will be the + // new pixel-accurate padding. + if (targetWidth > 0) { + var singleQuoteNode = document.createTextNode("'"); + var spacerNode = document.createElement('span'); + origPadding.textContent = "*/"; + origPadding.parentNode.insertBefore(spacerNode, origPadding); + origPadding.parentNode.insertBefore(singleQuoteNode, spacerNode); + + var padWidth = targetWidth - spanElt.offsetWidth; + spacerNode.style.display = 'inline-block'; + spacerNode.style.width = String(padWidth) + "px"; + spacerNode.style.height = '1em'; // cursor won't work w/o some height + spacerNode.style.cursor = 'text'; + } + } + } +} + +// the onload function for source file +function srcFileOnload() { + var codeElement = document.getElementById("codeTbl"); + var insertFunction = getInsertFunction(codeElement); + try { + var els = codeElement.getElementsByTagName("tr"); + for (var i = 0; i < els.length; i++) { + registerDelayedOnMouseOver(els[i], lineOnMouseIn, lineOnMouseOut); + } + updateToken(codeElement); + } catch (err) {}; + insertFunction(); + // add code to model hyperlinks for all tokens + var filename = location.pathname.split(/\//); + filename = filename[filename.length-1]; + // highlight the filename in the TOC frame + if (top.rtwreport_contents_frame && top.hiliteByFileName(top.rtwreport_document_frame.document.location.href)) { + // remove the highlights in the TOC frame if filename is hilite successfully + top.removeHiliteTOC(top.rtwreport_contents_frame); + } + + // annotate code with code coverage data + if (typeof rtwannotate === 'function') { + rtwannotate(filename.replace(/.html$/,"_cov.xml")); + } + + fixBoxStyleFnHeaderLineWidths(); + + // highlight token and row + if (top.RTW_TraceInfo.instance && top.RTW_TraceArgs.instance) { + var i; + // find the highlight file name + var fileIdx = top.RTW_TraceArgs.instance.getFileIdx(filename); + var ids=[], rows=[]; + if (typeof fileIdx !== "undefined") { + ids = top.RTW_TraceArgs.instance.getIDs(fileIdx); + rows = top.RTW_TraceArgs.instance.getRows(fileIdx); + // highlight rows in file + for (i=0; i 0) + top.RTW_TraceInfo.instance.setInitLocation(filename,rows[0]); + else { + top.toggleNavSideBar("off"); + return; + } + } + + // display navigation side bar + if (top.rtwreport_nav_frame) top.rtwreport_nav_frame.location.reload(); + if (rows.length>0) { + top.toggleNavSideBar("on"); + top.toggleNavToolBar("on"); + } else { + top.toggleNavSideBar("off"); + } + } + top.scrollToLineBasedOnHash(document.location.hash); + function getHash() { + var loc; + var aHash=""; + var topDocObj = top.window.document; + // get the hash value from location. + loc = topDocObj.location; + loc = loc.search || loc.hash; + aHash = loc.substring(1); + aHash = decodeURI(aHash); + return aHash; + } +} + +function createPopup(filename, evt) { + var anchorObj = evt.currentTarget; + if (anchorObj.children.length > 0) + return; + var filename = location.pathname.split(/\//); + filename = filename[filename.length-1]; + var windowObj = top.getInspectWindow(); + var propObj = top.getInspectData(filename, anchorObj); + var navObj = top.getInspectLink(filename, location.pathname, anchorObj); + if (propObj) { + windowObj.appendChild(propObj); + windowObj.style.left = "0px"; + if (anchorObj.parentElement.nodeName === "TD" && + anchorObj.parentElement.parentElement.nodeName === "TR") { + anchorObj.parentElement.parentElement.lastChild.insertBefore(windowObj, + anchorObj.parentElement.parentElement.lastChild.lastChild.nextSibling); + var left = Math.min(evt.clientX , window.innerWidth - windowObj.scrollWidth - 30); + left = Math.max(0, left); + windowObj.style.left = "" + left + "px"; + } + } +}; + +function destroyPopup(anchorObj) { + var popWindow = document.getElementById("popup_window"); + if (popWindow) { + popWindow.parentElement.removeChild(popWindow); + } +}; diff --git a/simulink_export/html/multiword_types_h.html b/simulink_export/html/multiword_types_h.html new file mode 100644 index 0000000..2948250 --- /dev/null +++ b/simulink_export/html/multiword_types_h.html @@ -0,0 +1,2364 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * multiword_types.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef MULTIWORD_TYPES_H
22#define MULTIWORD_TYPES_H
23#include "rtwtypes.h"
24
25/*
26 * Definitions supporting external data access
27 */
28typedef int32_T chunk_T;
29typedef uint32_T uchunk_T;
30
31/*
32 * MultiWord supporting definitions
33 */
34typedef long int long_T;
35
36/*
37 * MultiWord types
38 */
39typedef struct {
40 uint32_T chunks[2];
41} int64m_T;
42
43typedef struct {
44 int64m_T re;
45 int64m_T im;
46} cint64m_T;
47
48typedef struct {
49 uint32_T chunks[2];
50} uint64m_T;
51
52typedef struct {
53 uint64m_T re;
54 uint64m_T im;
55} cuint64m_T;
56
57typedef struct {
58 uint32_T chunks[3];
59} int96m_T;
60
61typedef struct {
62 int96m_T re;
63 int96m_T im;
64} cint96m_T;
65
66typedef struct {
67 uint32_T chunks[3];
68} uint96m_T;
69
70typedef struct {
71 uint96m_T re;
72 uint96m_T im;
73} cuint96m_T;
74
75typedef struct {
76 uint32_T chunks[4];
77} int128m_T;
78
79typedef struct {
80 int128m_T re;
81 int128m_T im;
82} cint128m_T;
83
84typedef struct {
85 uint32_T chunks[4];
86} uint128m_T;
87
88typedef struct {
89 uint128m_T re;
90 uint128m_T im;
91} cuint128m_T;
92
93typedef struct {
94 uint32_T chunks[5];
95} int160m_T;
96
97typedef struct {
98 int160m_T re;
99 int160m_T im;
100} cint160m_T;
101
102typedef struct {
103 uint32_T chunks[5];
104} uint160m_T;
105
106typedef struct {
107 uint160m_T re;
108 uint160m_T im;
109} cuint160m_T;
110
111typedef struct {
112 uint32_T chunks[6];
113} int192m_T;
114
115typedef struct {
116 int192m_T re;
117 int192m_T im;
118} cint192m_T;
119
120typedef struct {
121 uint32_T chunks[6];
122} uint192m_T;
123
124typedef struct {
125 uint192m_T re;
126 uint192m_T im;
127} cuint192m_T;
128
129typedef struct {
130 uint32_T chunks[7];
131} int224m_T;
132
133typedef struct {
134 int224m_T re;
135 int224m_T im;
136} cint224m_T;
137
138typedef struct {
139 uint32_T chunks[7];
140} uint224m_T;
141
142typedef struct {
143 uint224m_T re;
144 uint224m_T im;
145} cuint224m_T;
146
147typedef struct {
148 uint32_T chunks[8];
149} int256m_T;
150
151typedef struct {
152 int256m_T re;
153 int256m_T im;
154} cint256m_T;
155
156typedef struct {
157 uint32_T chunks[8];
158} uint256m_T;
159
160typedef struct {
161 uint256m_T re;
162 uint256m_T im;
163} cuint256m_T;
164
165typedef struct {
166 uint32_T chunks[9];
167} int288m_T;
168
169typedef struct {
170 int288m_T re;
171 int288m_T im;
172} cint288m_T;
173
174typedef struct {
175 uint32_T chunks[9];
176} uint288m_T;
177
178typedef struct {
179 uint288m_T re;
180 uint288m_T im;
181} cuint288m_T;
182
183typedef struct {
184 uint32_T chunks[10];
185} int320m_T;
186
187typedef struct {
188 int320m_T re;
189 int320m_T im;
190} cint320m_T;
191
192typedef struct {
193 uint32_T chunks[10];
194} uint320m_T;
195
196typedef struct {
197 uint320m_T re;
198 uint320m_T im;
199} cuint320m_T;
200
201typedef struct {
202 uint32_T chunks[11];
203} int352m_T;
204
205typedef struct {
206 int352m_T re;
207 int352m_T im;
208} cint352m_T;
209
210typedef struct {
211 uint32_T chunks[11];
212} uint352m_T;
213
214typedef struct {
215 uint352m_T re;
216 uint352m_T im;
217} cuint352m_T;
218
219typedef struct {
220 uint32_T chunks[12];
221} int384m_T;
222
223typedef struct {
224 int384m_T re;
225 int384m_T im;
226} cint384m_T;
227
228typedef struct {
229 uint32_T chunks[12];
230} uint384m_T;
231
232typedef struct {
233 uint384m_T re;
234 uint384m_T im;
235} cuint384m_T;
236
237typedef struct {
238 uint32_T chunks[13];
239} int416m_T;
240
241typedef struct {
242 int416m_T re;
243 int416m_T im;
244} cint416m_T;
245
246typedef struct {
247 uint32_T chunks[13];
248} uint416m_T;
249
250typedef struct {
251 uint416m_T re;
252 uint416m_T im;
253} cuint416m_T;
254
255typedef struct {
256 uint32_T chunks[14];
257} int448m_T;
258
259typedef struct {
260 int448m_T re;
261 int448m_T im;
262} cint448m_T;
263
264typedef struct {
265 uint32_T chunks[14];
266} uint448m_T;
267
268typedef struct {
269 uint448m_T re;
270 uint448m_T im;
271} cuint448m_T;
272
273typedef struct {
274 uint32_T chunks[15];
275} int480m_T;
276
277typedef struct {
278 int480m_T re;
279 int480m_T im;
280} cint480m_T;
281
282typedef struct {
283 uint32_T chunks[15];
284} uint480m_T;
285
286typedef struct {
287 uint480m_T re;
288 uint480m_T im;
289} cuint480m_T;
290
291typedef struct {
292 uint32_T chunks[16];
293} int512m_T;
294
295typedef struct {
296 int512m_T re;
297 int512m_T im;
298} cint512m_T;
299
300typedef struct {
301 uint32_T chunks[16];
302} uint512m_T;
303
304typedef struct {
305 uint512m_T re;
306 uint512m_T im;
307} cuint512m_T;
308
309typedef struct {
310 uint32_T chunks[17];
311} int544m_T;
312
313typedef struct {
314 int544m_T re;
315 int544m_T im;
316} cint544m_T;
317
318typedef struct {
319 uint32_T chunks[17];
320} uint544m_T;
321
322typedef struct {
323 uint544m_T re;
324 uint544m_T im;
325} cuint544m_T;
326
327typedef struct {
328 uint32_T chunks[18];
329} int576m_T;
330
331typedef struct {
332 int576m_T re;
333 int576m_T im;
334} cint576m_T;
335
336typedef struct {
337 uint32_T chunks[18];
338} uint576m_T;
339
340typedef struct {
341 uint576m_T re;
342 uint576m_T im;
343} cuint576m_T;
344
345typedef struct {
346 uint32_T chunks[19];
347} int608m_T;
348
349typedef struct {
350 int608m_T re;
351 int608m_T im;
352} cint608m_T;
353
354typedef struct {
355 uint32_T chunks[19];
356} uint608m_T;
357
358typedef struct {
359 uint608m_T re;
360 uint608m_T im;
361} cuint608m_T;
362
363typedef struct {
364 uint32_T chunks[20];
365} int640m_T;
366
367typedef struct {
368 int640m_T re;
369 int640m_T im;
370} cint640m_T;
371
372typedef struct {
373 uint32_T chunks[20];
374} uint640m_T;
375
376typedef struct {
377 uint640m_T re;
378 uint640m_T im;
379} cuint640m_T;
380
381typedef struct {
382 uint32_T chunks[21];
383} int672m_T;
384
385typedef struct {
386 int672m_T re;
387 int672m_T im;
388} cint672m_T;
389
390typedef struct {
391 uint32_T chunks[21];
392} uint672m_T;
393
394typedef struct {
395 uint672m_T re;
396 uint672m_T im;
397} cuint672m_T;
398
399typedef struct {
400 uint32_T chunks[22];
401} int704m_T;
402
403typedef struct {
404 int704m_T re;
405 int704m_T im;
406} cint704m_T;
407
408typedef struct {
409 uint32_T chunks[22];
410} uint704m_T;
411
412typedef struct {
413 uint704m_T re;
414 uint704m_T im;
415} cuint704m_T;
416
417typedef struct {
418 uint32_T chunks[23];
419} int736m_T;
420
421typedef struct {
422 int736m_T re;
423 int736m_T im;
424} cint736m_T;
425
426typedef struct {
427 uint32_T chunks[23];
428} uint736m_T;
429
430typedef struct {
431 uint736m_T re;
432 uint736m_T im;
433} cuint736m_T;
434
435typedef struct {
436 uint32_T chunks[24];
437} int768m_T;
438
439typedef struct {
440 int768m_T re;
441 int768m_T im;
442} cint768m_T;
443
444typedef struct {
445 uint32_T chunks[24];
446} uint768m_T;
447
448typedef struct {
449 uint768m_T re;
450 uint768m_T im;
451} cuint768m_T;
452
453typedef struct {
454 uint32_T chunks[25];
455} int800m_T;
456
457typedef struct {
458 int800m_T re;
459 int800m_T im;
460} cint800m_T;
461
462typedef struct {
463 uint32_T chunks[25];
464} uint800m_T;
465
466typedef struct {
467 uint800m_T re;
468 uint800m_T im;
469} cuint800m_T;
470
471typedef struct {
472 uint32_T chunks[26];
473} int832m_T;
474
475typedef struct {
476 int832m_T re;
477 int832m_T im;
478} cint832m_T;
479
480typedef struct {
481 uint32_T chunks[26];
482} uint832m_T;
483
484typedef struct {
485 uint832m_T re;
486 uint832m_T im;
487} cuint832m_T;
488
489typedef struct {
490 uint32_T chunks[27];
491} int864m_T;
492
493typedef struct {
494 int864m_T re;
495 int864m_T im;
496} cint864m_T;
497
498typedef struct {
499 uint32_T chunks[27];
500} uint864m_T;
501
502typedef struct {
503 uint864m_T re;
504 uint864m_T im;
505} cuint864m_T;
506
507typedef struct {
508 uint32_T chunks[28];
509} int896m_T;
510
511typedef struct {
512 int896m_T re;
513 int896m_T im;
514} cint896m_T;
515
516typedef struct {
517 uint32_T chunks[28];
518} uint896m_T;
519
520typedef struct {
521 uint896m_T re;
522 uint896m_T im;
523} cuint896m_T;
524
525typedef struct {
526 uint32_T chunks[29];
527} int928m_T;
528
529typedef struct {
530 int928m_T re;
531 int928m_T im;
532} cint928m_T;
533
534typedef struct {
535 uint32_T chunks[29];
536} uint928m_T;
537
538typedef struct {
539 uint928m_T re;
540 uint928m_T im;
541} cuint928m_T;
542
543typedef struct {
544 uint32_T chunks[30];
545} int960m_T;
546
547typedef struct {
548 int960m_T re;
549 int960m_T im;
550} cint960m_T;
551
552typedef struct {
553 uint32_T chunks[30];
554} uint960m_T;
555
556typedef struct {
557 uint960m_T re;
558 uint960m_T im;
559} cuint960m_T;
560
561typedef struct {
562 uint32_T chunks[31];
563} int992m_T;
564
565typedef struct {
566 int992m_T re;
567 int992m_T im;
568} cint992m_T;
569
570typedef struct {
571 uint32_T chunks[31];
572} uint992m_T;
573
574typedef struct {
575 uint992m_T re;
576 uint992m_T im;
577} cuint992m_T;
578
579typedef struct {
580 uint32_T chunks[32];
581} int1024m_T;
582
583typedef struct {
584 int1024m_T re;
585 int1024m_T im;
586} cint1024m_T;
587
588typedef struct {
589 uint32_T chunks[32];
590} uint1024m_T;
591
592typedef struct {
593 uint1024m_T re;
594 uint1024m_T im;
595} cuint1024m_T;
596
597typedef struct {
598 uint32_T chunks[33];
599} int1056m_T;
600
601typedef struct {
602 int1056m_T re;
603 int1056m_T im;
604} cint1056m_T;
605
606typedef struct {
607 uint32_T chunks[33];
608} uint1056m_T;
609
610typedef struct {
611 uint1056m_T re;
612 uint1056m_T im;
613} cuint1056m_T;
614
615typedef struct {
616 uint32_T chunks[34];
617} int1088m_T;
618
619typedef struct {
620 int1088m_T re;
621 int1088m_T im;
622} cint1088m_T;
623
624typedef struct {
625 uint32_T chunks[34];
626} uint1088m_T;
627
628typedef struct {
629 uint1088m_T re;
630 uint1088m_T im;
631} cuint1088m_T;
632
633typedef struct {
634 uint32_T chunks[35];
635} int1120m_T;
636
637typedef struct {
638 int1120m_T re;
639 int1120m_T im;
640} cint1120m_T;
641
642typedef struct {
643 uint32_T chunks[35];
644} uint1120m_T;
645
646typedef struct {
647 uint1120m_T re;
648 uint1120m_T im;
649} cuint1120m_T;
650
651typedef struct {
652 uint32_T chunks[36];
653} int1152m_T;
654
655typedef struct {
656 int1152m_T re;
657 int1152m_T im;
658} cint1152m_T;
659
660typedef struct {
661 uint32_T chunks[36];
662} uint1152m_T;
663
664typedef struct {
665 uint1152m_T re;
666 uint1152m_T im;
667} cuint1152m_T;
668
669typedef struct {
670 uint32_T chunks[37];
671} int1184m_T;
672
673typedef struct {
674 int1184m_T re;
675 int1184m_T im;
676} cint1184m_T;
677
678typedef struct {
679 uint32_T chunks[37];
680} uint1184m_T;
681
682typedef struct {
683 uint1184m_T re;
684 uint1184m_T im;
685} cuint1184m_T;
686
687typedef struct {
688 uint32_T chunks[38];
689} int1216m_T;
690
691typedef struct {
692 int1216m_T re;
693 int1216m_T im;
694} cint1216m_T;
695
696typedef struct {
697 uint32_T chunks[38];
698} uint1216m_T;
699
700typedef struct {
701 uint1216m_T re;
702 uint1216m_T im;
703} cuint1216m_T;
704
705typedef struct {
706 uint32_T chunks[39];
707} int1248m_T;
708
709typedef struct {
710 int1248m_T re;
711 int1248m_T im;
712} cint1248m_T;
713
714typedef struct {
715 uint32_T chunks[39];
716} uint1248m_T;
717
718typedef struct {
719 uint1248m_T re;
720 uint1248m_T im;
721} cuint1248m_T;
722
723typedef struct {
724 uint32_T chunks[40];
725} int1280m_T;
726
727typedef struct {
728 int1280m_T re;
729 int1280m_T im;
730} cint1280m_T;
731
732typedef struct {
733 uint32_T chunks[40];
734} uint1280m_T;
735
736typedef struct {
737 uint1280m_T re;
738 uint1280m_T im;
739} cuint1280m_T;
740
741typedef struct {
742 uint32_T chunks[41];
743} int1312m_T;
744
745typedef struct {
746 int1312m_T re;
747 int1312m_T im;
748} cint1312m_T;
749
750typedef struct {
751 uint32_T chunks[41];
752} uint1312m_T;
753
754typedef struct {
755 uint1312m_T re;
756 uint1312m_T im;
757} cuint1312m_T;
758
759typedef struct {
760 uint32_T chunks[42];
761} int1344m_T;
762
763typedef struct {
764 int1344m_T re;
765 int1344m_T im;
766} cint1344m_T;
767
768typedef struct {
769 uint32_T chunks[42];
770} uint1344m_T;
771
772typedef struct {
773 uint1344m_T re;
774 uint1344m_T im;
775} cuint1344m_T;
776
777typedef struct {
778 uint32_T chunks[43];
779} int1376m_T;
780
781typedef struct {
782 int1376m_T re;
783 int1376m_T im;
784} cint1376m_T;
785
786typedef struct {
787 uint32_T chunks[43];
788} uint1376m_T;
789
790typedef struct {
791 uint1376m_T re;
792 uint1376m_T im;
793} cuint1376m_T;
794
795typedef struct {
796 uint32_T chunks[44];
797} int1408m_T;
798
799typedef struct {
800 int1408m_T re;
801 int1408m_T im;
802} cint1408m_T;
803
804typedef struct {
805 uint32_T chunks[44];
806} uint1408m_T;
807
808typedef struct {
809 uint1408m_T re;
810 uint1408m_T im;
811} cuint1408m_T;
812
813typedef struct {
814 uint32_T chunks[45];
815} int1440m_T;
816
817typedef struct {
818 int1440m_T re;
819 int1440m_T im;
820} cint1440m_T;
821
822typedef struct {
823 uint32_T chunks[45];
824} uint1440m_T;
825
826typedef struct {
827 uint1440m_T re;
828 uint1440m_T im;
829} cuint1440m_T;
830
831typedef struct {
832 uint32_T chunks[46];
833} int1472m_T;
834
835typedef struct {
836 int1472m_T re;
837 int1472m_T im;
838} cint1472m_T;
839
840typedef struct {
841 uint32_T chunks[46];
842} uint1472m_T;
843
844typedef struct {
845 uint1472m_T re;
846 uint1472m_T im;
847} cuint1472m_T;
848
849typedef struct {
850 uint32_T chunks[47];
851} int1504m_T;
852
853typedef struct {
854 int1504m_T re;
855 int1504m_T im;
856} cint1504m_T;
857
858typedef struct {
859 uint32_T chunks[47];
860} uint1504m_T;
861
862typedef struct {
863 uint1504m_T re;
864 uint1504m_T im;
865} cuint1504m_T;
866
867typedef struct {
868 uint32_T chunks[48];
869} int1536m_T;
870
871typedef struct {
872 int1536m_T re;
873 int1536m_T im;
874} cint1536m_T;
875
876typedef struct {
877 uint32_T chunks[48];
878} uint1536m_T;
879
880typedef struct {
881 uint1536m_T re;
882 uint1536m_T im;
883} cuint1536m_T;
884
885typedef struct {
886 uint32_T chunks[49];
887} int1568m_T;
888
889typedef struct {
890 int1568m_T re;
891 int1568m_T im;
892} cint1568m_T;
893
894typedef struct {
895 uint32_T chunks[49];
896} uint1568m_T;
897
898typedef struct {
899 uint1568m_T re;
900 uint1568m_T im;
901} cuint1568m_T;
902
903typedef struct {
904 uint32_T chunks[50];
905} int1600m_T;
906
907typedef struct {
908 int1600m_T re;
909 int1600m_T im;
910} cint1600m_T;
911
912typedef struct {
913 uint32_T chunks[50];
914} uint1600m_T;
915
916typedef struct {
917 uint1600m_T re;
918 uint1600m_T im;
919} cuint1600m_T;
920
921typedef struct {
922 uint32_T chunks[51];
923} int1632m_T;
924
925typedef struct {
926 int1632m_T re;
927 int1632m_T im;
928} cint1632m_T;
929
930typedef struct {
931 uint32_T chunks[51];
932} uint1632m_T;
933
934typedef struct {
935 uint1632m_T re;
936 uint1632m_T im;
937} cuint1632m_T;
938
939typedef struct {
940 uint32_T chunks[52];
941} int1664m_T;
942
943typedef struct {
944 int1664m_T re;
945 int1664m_T im;
946} cint1664m_T;
947
948typedef struct {
949 uint32_T chunks[52];
950} uint1664m_T;
951
952typedef struct {
953 uint1664m_T re;
954 uint1664m_T im;
955} cuint1664m_T;
956
957typedef struct {
958 uint32_T chunks[53];
959} int1696m_T;
960
961typedef struct {
962 int1696m_T re;
963 int1696m_T im;
964} cint1696m_T;
965
966typedef struct {
967 uint32_T chunks[53];
968} uint1696m_T;
969
970typedef struct {
971 uint1696m_T re;
972 uint1696m_T im;
973} cuint1696m_T;
974
975typedef struct {
976 uint32_T chunks[54];
977} int1728m_T;
978
979typedef struct {
980 int1728m_T re;
981 int1728m_T im;
982} cint1728m_T;
983
984typedef struct {
985 uint32_T chunks[54];
986} uint1728m_T;
987
988typedef struct {
989 uint1728m_T re;
990 uint1728m_T im;
991} cuint1728m_T;
992
993typedef struct {
994 uint32_T chunks[55];
995} int1760m_T;
996
997typedef struct {
998 int1760m_T re;
999 int1760m_T im;
1000} cint1760m_T;
1001
1002typedef struct {
1003 uint32_T chunks[55];
1004} uint1760m_T;
1005
1006typedef struct {
1007 uint1760m_T re;
1008 uint1760m_T im;
1009} cuint1760m_T;
1010
1011typedef struct {
1012 uint32_T chunks[56];
1013} int1792m_T;
1014
1015typedef struct {
1016 int1792m_T re;
1017 int1792m_T im;
1018} cint1792m_T;
1019
1020typedef struct {
1021 uint32_T chunks[56];
1022} uint1792m_T;
1023
1024typedef struct {
1025 uint1792m_T re;
1026 uint1792m_T im;
1027} cuint1792m_T;
1028
1029typedef struct {
1030 uint32_T chunks[57];
1031} int1824m_T;
1032
1033typedef struct {
1034 int1824m_T re;
1035 int1824m_T im;
1036} cint1824m_T;
1037
1038typedef struct {
1039 uint32_T chunks[57];
1040} uint1824m_T;
1041
1042typedef struct {
1043 uint1824m_T re;
1044 uint1824m_T im;
1045} cuint1824m_T;
1046
1047typedef struct {
1048 uint32_T chunks[58];
1049} int1856m_T;
1050
1051typedef struct {
1052 int1856m_T re;
1053 int1856m_T im;
1054} cint1856m_T;
1055
1056typedef struct {
1057 uint32_T chunks[58];
1058} uint1856m_T;
1059
1060typedef struct {
1061 uint1856m_T re;
1062 uint1856m_T im;
1063} cuint1856m_T;
1064
1065typedef struct {
1066 uint32_T chunks[59];
1067} int1888m_T;
1068
1069typedef struct {
1070 int1888m_T re;
1071 int1888m_T im;
1072} cint1888m_T;
1073
1074typedef struct {
1075 uint32_T chunks[59];
1076} uint1888m_T;
1077
1078typedef struct {
1079 uint1888m_T re;
1080 uint1888m_T im;
1081} cuint1888m_T;
1082
1083typedef struct {
1084 uint32_T chunks[60];
1085} int1920m_T;
1086
1087typedef struct {
1088 int1920m_T re;
1089 int1920m_T im;
1090} cint1920m_T;
1091
1092typedef struct {
1093 uint32_T chunks[60];
1094} uint1920m_T;
1095
1096typedef struct {
1097 uint1920m_T re;
1098 uint1920m_T im;
1099} cuint1920m_T;
1100
1101typedef struct {
1102 uint32_T chunks[61];
1103} int1952m_T;
1104
1105typedef struct {
1106 int1952m_T re;
1107 int1952m_T im;
1108} cint1952m_T;
1109
1110typedef struct {
1111 uint32_T chunks[61];
1112} uint1952m_T;
1113
1114typedef struct {
1115 uint1952m_T re;
1116 uint1952m_T im;
1117} cuint1952m_T;
1118
1119typedef struct {
1120 uint32_T chunks[62];
1121} int1984m_T;
1122
1123typedef struct {
1124 int1984m_T re;
1125 int1984m_T im;
1126} cint1984m_T;
1127
1128typedef struct {
1129 uint32_T chunks[62];
1130} uint1984m_T;
1131
1132typedef struct {
1133 uint1984m_T re;
1134 uint1984m_T im;
1135} cuint1984m_T;
1136
1137typedef struct {
1138 uint32_T chunks[63];
1139} int2016m_T;
1140
1141typedef struct {
1142 int2016m_T re;
1143 int2016m_T im;
1144} cint2016m_T;
1145
1146typedef struct {
1147 uint32_T chunks[63];
1148} uint2016m_T;
1149
1150typedef struct {
1151 uint2016m_T re;
1152 uint2016m_T im;
1153} cuint2016m_T;
1154
1155typedef struct {
1156 uint32_T chunks[64];
1157} int2048m_T;
1158
1159typedef struct {
1160 int2048m_T re;
1161 int2048m_T im;
1162} cint2048m_T;
1163
1164typedef struct {
1165 uint32_T chunks[64];
1166} uint2048m_T;
1167
1168typedef struct {
1169 uint2048m_T re;
1170 uint2048m_T im;
1171} cuint2048m_T;
1172
1173#endif /* MULTIWORD_TYPES_H */
1174
+
+ + diff --git a/simulink_export/html/nav.html b/simulink_export/html/nav.html new file mode 100644 index 0000000..64f68db --- /dev/null +++ b/simulink_export/html/nav.html @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/simulink_export/html/navToolbar.html b/simulink_export/html/navToolbar.html new file mode 100644 index 0000000..d07c72e --- /dev/null +++ b/simulink_export/html/navToolbar.html @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/simulink_export/html/rtGetInf_cpp.html b/simulink_export/html/rtGetInf_cpp.html new file mode 100644 index 0000000..ff1668f --- /dev/null +++ b/simulink_export/html/rtGetInf_cpp.html @@ -0,0 +1,310 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * rtGetInf.cpp
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21/*
22 * Abstract:
23 * Function to initialize non-finite, Inf
24 */
25#include "rtGetInf.h"
26#define NumBitsPerChar 8U
27
28extern "C" {
29 /*
30 * Initialize rtInf needed by the generated code.
31 * Inf is initialized as non-signaling. Assumes IEEE.
32 */
33 real_T rtGetInf(void)
34 {
35 size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar);
36 real_T inf = 0.0;
37 if (bitsPerReal == 32U) {
38 inf = rtGetInfF();
39 } else {
40 uint16_T one = 1U;
41 enum {
42 LittleEndian,
43 BigEndian
44 } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
45 switch (machByteOrder) {
46 case LittleEndian:
47 {
48 union {
49 LittleEndianIEEEDouble bitVal;
50 real_T fltVal;
51 } tmpVal;
52
53 tmpVal.bitVal.words.wordH = 0x7FF00000U;
54 tmpVal.bitVal.words.wordL = 0x00000000U;
55 inf = tmpVal.fltVal;
56 break;
57 }
58
59 case BigEndian:
60 {
61 union {
62 BigEndianIEEEDouble bitVal;
63 real_T fltVal;
64 } tmpVal;
65
66 tmpVal.bitVal.words.wordH = 0x7FF00000U;
67 tmpVal.bitVal.words.wordL = 0x00000000U;
68 inf = tmpVal.fltVal;
69 break;
70 }
71 }
72 }
73
74 return inf;
75 }
76
77 /*
78 * Initialize rtInfF needed by the generated code.
79 * Inf is initialized as non-signaling. Assumes IEEE.
80 */
81 real32_T rtGetInfF(void)
82 {
83 IEEESingle infF;
84 infF.wordL.wordLuint = 0x7F800000U;
85 return infF.wordL.wordLreal;
86 }
87
88 /*
89 * Initialize rtMinusInf needed by the generated code.
90 * Inf is initialized as non-signaling. Assumes IEEE.
91 */
92 real_T rtGetMinusInf(void)
93 {
94 size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar);
95 real_T minf = 0.0;
96 if (bitsPerReal == 32U) {
97 minf = rtGetMinusInfF();
98 } else {
99 uint16_T one = 1U;
100 enum {
101 LittleEndian,
102 BigEndian
103 } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
104 switch (machByteOrder) {
105 case LittleEndian:
106 {
107 union {
108 LittleEndianIEEEDouble bitVal;
109 real_T fltVal;
110 } tmpVal;
111
112 tmpVal.bitVal.words.wordH = 0xFFF00000U;
113 tmpVal.bitVal.words.wordL = 0x00000000U;
114 minf = tmpVal.fltVal;
115 break;
116 }
117
118 case BigEndian:
119 {
120 union {
121 BigEndianIEEEDouble bitVal;
122 real_T fltVal;
123 } tmpVal;
124
125 tmpVal.bitVal.words.wordH = 0xFFF00000U;
126 tmpVal.bitVal.words.wordL = 0x00000000U;
127 minf = tmpVal.fltVal;
128 break;
129 }
130 }
131 }
132
133 return minf;
134 }
135
136 /*
137 * Initialize rtMinusInfF needed by the generated code.
138 * Inf is initialized as non-signaling. Assumes IEEE.
139 */
140 real32_T rtGetMinusInfF(void)
141 {
142 IEEESingle minfF;
143 minfF.wordL.wordLuint = 0xFF800000U;
144 return minfF.wordL.wordLreal;
145 }
146}
147
+
+ + diff --git a/simulink_export/html/rtGetInf_h.html b/simulink_export/html/rtGetInf_h.html new file mode 100644 index 0000000..ddff78c --- /dev/null +++ b/simulink_export/html/rtGetInf_h.html @@ -0,0 +1,100 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * rtGetInf.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef RTW_HEADER_rtGetInf_h_
22#define RTW_HEADER_rtGetInf_h_
23#include <stddef.h>
24#include "rtwtypes.h"
25#include "rt_nonfinite.h"
26#ifdef __cplusplus
27
28extern "C" {
29
30#endif
31
32 extern real_T rtGetInf(void);
33 extern real32_T rtGetInfF(void);
34 extern real_T rtGetMinusInf(void);
35 extern real32_T rtGetMinusInfF(void);
36
37#ifdef __cplusplus
38
39} /* extern "C" */
40#endif
41#endif /* RTW_HEADER_rtGetInf_h_ */
42
+
+ + diff --git a/simulink_export/html/rtGetNaN_cpp.html b/simulink_export/html/rtGetNaN_cpp.html new file mode 100644 index 0000000..a2f048d --- /dev/null +++ b/simulink_export/html/rtGetNaN_cpp.html @@ -0,0 +1,230 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * rtGetNaN.cpp
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21/*
22 * Abstract:
23 * Function to initialize non-finite, NaN
24 */
25#include "rtGetNaN.h"
26#define NumBitsPerChar 8U
27
28extern "C" {
29 /*
30 * Initialize rtNaN needed by the generated code.
31 * NaN is initialized as non-signaling. Assumes IEEE.
32 */
33 real_T rtGetNaN(void)
34 {
35 size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar);
36 real_T nan = 0.0;
37 if (bitsPerReal == 32U) {
38 nan = rtGetNaNF();
39 } else {
40 uint16_T one = 1U;
41 enum {
42 LittleEndian,
43 BigEndian
44 } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
45 switch (machByteOrder) {
46 case LittleEndian:
47 {
48 union {
49 LittleEndianIEEEDouble bitVal;
50 real_T fltVal;
51 } tmpVal;
52
53 tmpVal.bitVal.words.wordH = 0xFFF80000U;
54 tmpVal.bitVal.words.wordL = 0x00000000U;
55 nan = tmpVal.fltVal;
56 break;
57 }
58
59 case BigEndian:
60 {
61 union {
62 BigEndianIEEEDouble bitVal;
63 real_T fltVal;
64 } tmpVal;
65
66 tmpVal.bitVal.words.wordH = 0x7FFFFFFFU;
67 tmpVal.bitVal.words.wordL = 0xFFFFFFFFU;
68 nan = tmpVal.fltVal;
69 break;
70 }
71 }
72 }
73
74 return nan;
75 }
76
77 /*
78 * Initialize rtNaNF needed by the generated code.
79 * NaN is initialized as non-signaling. Assumes IEEE.
80 */
81 real32_T rtGetNaNF(void)
82 {
83 IEEESingle nanF = { { 0.0F } };
84
85 uint16_T one = 1U;
86 enum {
87 LittleEndian,
88 BigEndian
89 } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
90 switch (machByteOrder) {
91 case LittleEndian:
92 {
93 nanF.wordL.wordLuint = 0xFFC00000U;
94 break;
95 }
96
97 case BigEndian:
98 {
99 nanF.wordL.wordLuint = 0x7FFFFFFFU;
100 break;
101 }
102 }
103
104 return nanF.wordL.wordLreal;
105 }
106}
107
+
+ + diff --git a/simulink_export/html/rtGetNaN_h.html b/simulink_export/html/rtGetNaN_h.html new file mode 100644 index 0000000..eec9602 --- /dev/null +++ b/simulink_export/html/rtGetNaN_h.html @@ -0,0 +1,96 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * rtGetNaN.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef RTW_HEADER_rtGetNaN_h_
22#define RTW_HEADER_rtGetNaN_h_
23#include <stddef.h>
24#include "rtwtypes.h"
25#include "rt_nonfinite.h"
26#ifdef __cplusplus
27
28extern "C" {
29
30#endif
31
32 extern real_T rtGetNaN(void);
33 extern real32_T rtGetNaNF(void);
34
35#ifdef __cplusplus
36
37} /* extern "C" */
38#endif
39#endif /* RTW_HEADER_rtGetNaN_h_ */
40
+
+ + diff --git a/simulink_export/html/rt_logging_c.html b/simulink_export/html/rt_logging_c.html new file mode 100644 index 0000000..bc21ef1 --- /dev/null +++ b/simulink_export/html/rt_logging_c.html @@ -0,0 +1,8610 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 *
3 * Copyright 1994-2020 The MathWorks, Inc.
4 *
5 * File: rt_logging.c
6 *
7 * Abstract:
8 * Real-Time Workshop data logging routines using circular buffers of
9 * fixed size. The buffers are allocated at start, filled in at each
10 * major time step and finally written to a MAT-file at the end of the
11 * simulation.
12 *
13 * This file handles redefining the following standard MathWorks types
14 * (see tmwtypes.h):
15 * [u]int8_T to be int32_T (logged as Matlab [u]int32)
16 * [u]int16_T to be int32_T (logged as Matlab [u]int32)
17 * real_T to be real32_T (logged as Matlab single)
18 *
19 */
20
21#include <stdlib.h>
22#include <string.h>
23#include <stdio.h>
24#include <limits.h>
25#include <math.h>
26
27
28#if !defined(MAT_FILE) || (defined(MAT_FILE) && MAT_FILE == 1)
29
30#include <stddef.h> /* size_t */
31#include "rt_logging.h"
32#ifndef IS_RAPID_ACCEL
33#include "rt_mxclassid.h"
34#endif
35#include "rtw_matlogging.h"
36
37#ifndef TMW_NAME_LENGTH_MAX
38#define TMW_NAME_LENGTH_MAX 64
39#endif
40#define mxMAXNAM TMW_NAME_LENGTH_MAX /* maximum name length */
41#define matUNKNOWN 0
42#define matINT8 1
43#define matUINT8 2
44#define matINT16 3
45#define matUINT16 4
46#define matINT32 5
47#define matUINT32 6
48#define matFLOAT 7
49#define matDOUBLE 9
50#define matINT64 12
51#define matUINT64 13
52#define matMATRIX 14
53
54#define matLOGICAL_BIT 0x200
55#define matCOMPLEX_BIT 0x800
56
57#define matKEY 0x4D49
58#define matVERSION 0x0100
59#define matVERSION_INFO_OFFSET 124L
60
61#define matINT64_ALIGN(e) ( ( ((unsigned)(e))+7 ) & (~7) )
62#define matTAG_SIZE (sizeof(int32_T) << 1)
63
64#ifndef DEFAULT_BUFFER_SIZE
65#define DEFAULT_BUFFER_SIZE 1024 /* used if maxRows=0 and Tfinal=0.0 */
66#endif
67
68#define FREE(m) if (m != NULL) free(m)
69
70/* Logical definitions */
71#if (!defined(__cplusplus))
72# ifndef false
73# define false (0U)
74# endif
75# ifndef true
76# define true (1U)
77# endif
78#endif
79
80/*==========*
81 * typedefs *
82 *==========*/
83
84typedef struct LogInfo_Tag {
85 LogVar *t; /* Time log variable */
86 void *x; /* State log variable */
87 int_T ny; /* Length of "y" log variables */
88 void **y; /* Output log vars */
89 void *xFinal; /* Final state log variable */
90
91 LogVar *logVarsList; /* Linked list of all LogVars */
92 StructLogVar *structLogVarsList; /* Linked list of all StructLogVars */
93
94 boolean_T haveLogVars; /* Are logging one or more vars? */
95} LogInfo;
96
97typedef struct MatItem_tag {
98 int32_T type;
99 uint32_T nbytes;
100 const void *data;
101} MatItem;
102
103typedef enum {
104 DATA_ITEM,
105 MATRIX_ITEM,
106 STRUCT_LOG_VAR_ITEM,
107 SIGNALS_STRUCT_ITEM
108} ItemDataKind;
109
110/*===========*
111 * Constants *
112 *===========*/
113
114static const char_T rtMemAllocError[] = "Memory allocation error";
115
116#define ZEROS32 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
117
118#if mxMAXNAM==32
119
120#define ZERO_PAD
121
122#elif mxMAXNAM==64
123
124#define ZERO_PAD ZEROS32
125
126#elif mxMAXNAM==128
127
128#define ZERO_PAD ZEROS32 ZEROS32 ZEROS32
129
130#else
131
132#error "Cannot Handle mxMAXNAM other than 32,64, and 128"
133
134#endif
135/* field names: for variable-size signal logging */
136static const char_T rtStructLogVarFieldNames[] =
137 "time\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
138 "signals\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
139 "blockName\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD;
140
141static const char_T rtLocalLoggingSignalsStructFieldNames[] =
142 "values\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
143 "valueDimensions\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
144 "dimensions\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
145 "label\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
146 "title\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
147 "plotStyle\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD;
148
149static const char_T rtGlobalLoggingSignalsStructFieldNames[] =
150 "values\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
151 "valueDimensions\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
152 "dimensions\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
153 "label\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
154 "blockName\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
155 "stateName\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
156 "inReferencedModel\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD;
157
158
159#define TIME_FIELD_NAME (rtStructLogVarFieldNames[0*mxMAXNAM])
160#define SIGNALS_FIELD_NAME (rtStructLogVarFieldNames[1*mxMAXNAM])
161#define BLOCKNAME_FIELD_NAME (rtStructLogVarFieldNames[2*mxMAXNAM])
162
163#define VALUES_FIELD_NAME (rtLocalLoggingSignalsStructFieldNames[0*mxMAXNAM])
164#define VALUEDIMENSIONS_FIELD_NAME (rtLocalLoggingSignalsStructFieldNames[1*mxMAXNAM])
165#define DIMENSION_FIELD_NAME (rtLocalLoggingSignalsStructFieldNames[2*mxMAXNAM])
166#define LABEL_FIELD_NAME (rtLocalLoggingSignalsStructFieldNames[3*mxMAXNAM])
167#define TITLE_FIELD_NAME (rtLocalLoggingSignalsStructFieldNames[4*mxMAXNAM])
168#define PLOTSTYLE_FIELD_NAME (rtLocalLoggingSignalsStructFieldNames[5*mxMAXNAM])
169
170#define STATENAME_FIELD_NAME (rtGlobalLoggingSignalsStructFieldNames[5*mxMAXNAM])
171#define CROSS_MDL_REF_FIELD_NAME (rtGlobalLoggingSignalsStructFieldNames[6*mxMAXNAM])
172
173/* field names: for fixed-size signal logging */
174static const char_T rtLocalLoggingSignalsStructFieldNames_noValDims[] =
175 "values\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
176 "dimensions\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
177 "label\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
178 "title\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
179 "plotStyle\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD;
180static const char_T rtGlobalLoggingSignalsStructFieldNames_noValDims[] =
181 "values\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
182 "dimensions\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
183 "label\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
184 "blockName\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
185 "stateName\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD
186 "inReferencedModel\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ZERO_PAD;
187
188extern real_T rtInf; /* declared by rt_nonfinite.c */
189extern real_T rtNaN;
190extern real32_T rtNaNF;
191
192/*================*
193 * Local routines *
194 *================*/
195
196/* Function: rt_GetSizeofDataType ==============================================
197 * Abstract:
198 * Get the element size in bytes given the data type id.
199 */
200static size_t rt_GetSizeofDataType(BuiltInDTypeId dTypeID)
201{
202 size_t elSz = 0; /* unknown */
203
204 switch (dTypeID) {
205 case SS_DOUBLE:
206 elSz = sizeof(real_T);
207 break;
208 case SS_SINGLE:
209 elSz = sizeof(real32_T);
210 break;
211 case SS_INT8:
212 elSz = sizeof(int8_T);
213 break;
214 case SS_UINT8:
215 elSz = sizeof(uint8_T);
216 break;
217 case SS_INT16:
218 elSz = sizeof(int16_T);
219 break;
220 case SS_UINT16:
221 elSz = sizeof(uint16_T);
222 break;
223 case SS_INT32:
224 elSz = sizeof(int32_T);
225 break;
226 case SS_UINT32:
227 elSz = sizeof(uint32_T);
228 break;
229 case SS_BOOLEAN:
230 elSz = sizeof(boolean_T);
231 break;
232 }
233 return(elSz);
234
235} /* end rt_GetSizeofDataType */
236
237
238/* Function: rt_GetSizeofComplexType ===========================================
239 * Abstract:
240 * Get the element size in bytes given the data type id.
241 */
242static size_t rt_GetSizeofComplexType(BuiltInDTypeId dTypeID)
243{
244 size_t elSz = 2*rt_GetSizeofDataType(dTypeID);
245
246 switch (dTypeID) {
247 case SS_DOUBLE:
248 #ifdef CREAL_T
249 elSz = sizeof(creal_T);
250 #endif
251 break;
252 case SS_SINGLE:
253 #ifdef CREAL_T
254 elSz = sizeof(creal32_T);
255 #endif
256 break;
257 case SS_INT8:
258 #ifdef CINT8_T
259 elSz = sizeof(cint8_T);
260 #endif
261 break;
262 case SS_UINT8:
263 #ifdef CUINT8_T
264 elSz = sizeof(cuint8_T);
265 #endif
266 break;
267 case SS_INT16:
268 #ifdef CINT16_T
269 elSz = sizeof(cint16_T);
270 #endif
271 break;
272 case SS_UINT16:
273 #ifdef CUINT16_T
274 elSz = sizeof(cuint16_T);
275 #endif
276 break;
277 case SS_INT32:
278 #ifdef CINT32_T
279 elSz = sizeof(cint32_T);
280 #endif
281 break;
282 case SS_UINT32:
283 #ifdef CUINT32_T
284 elSz = sizeof(cuint32_T);
285 #endif
286 break;
287 case SS_BOOLEAN:
288 elSz = sizeof(boolean_T);
289 break;
290 }
291
292 return(elSz);
293
294} /* end rt_GetSizeofComplexType */
295
296
297/* Function: rt_GetDataTypeConvertInfo =========================================
298 * Abstract:
299 * Directly copy if pointer to structure is non-NULL, otherwise set to
300 * default.
301 */
302static RTWLogDataTypeConvert rt_GetDataTypeConvertInfo(
303 const RTWLogDataTypeConvert *pDataTypeConvertInfo,
304 BuiltInDTypeId dTypeID
305 )
306{
307 RTWLogDataTypeConvert dataTypeConvertInfoCopy;
308
309 if (pDataTypeConvertInfo == NULL) {
310 dataTypeConvertInfoCopy.conversionNeeded = 0;
311 dataTypeConvertInfoCopy.dataTypeIdLoggingTo = dTypeID;
312 dataTypeConvertInfoCopy.dataTypeIdOriginal = (DTypeId)dTypeID;
313 dataTypeConvertInfoCopy.bitsPerChunk = 0;
314 dataTypeConvertInfoCopy.numOfChunk = 0;
315 dataTypeConvertInfoCopy.isSigned = 0;
316 dataTypeConvertInfoCopy.fracSlope = 1.0;
317 dataTypeConvertInfoCopy.fixedExp = 0;
318 dataTypeConvertInfoCopy.bias = 0.0;
319 } else {
320 dataTypeConvertInfoCopy = *pDataTypeConvertInfo;
321 }
322
323 return dataTypeConvertInfoCopy;
324
325} /* end rt_GetDataTypeConvertInfo */
326
327
328/* Function: rt_GetDblValueFromOverSizedData ===================================
329 * Abstract:
330 */
331static double rt_GetDblValueFromOverSizedData(
332 const void *pVoid,
333 int bitsPerChunk,
334 int numOfChunk,
335 unsigned int isSigned,
336 double fracSlope,
337 int fixedExp,
338 double bias)
339{
340 double retValue = 0;
341
342 double *dblValue = (double *) calloc(numOfChunk, sizeof(double));
343
344 int i;
345 double isSignedNeg;
346
347 if(isSigned) {
348 const chunk_T *pData = (const chunk_T *) (pVoid);
349 for (i = 0; i <numOfChunk; i++) {
350 dblValue[i] = (double)(pData[i]);
351 }
352 } else {
353 const uchunk_T *pData = (const uchunk_T *) (pVoid);
354 for (i = 0; i <numOfChunk; i++) {
355 dblValue[i] = (double)(pData[i]);
356 }
357 }
358
359 /*
360 Assuming multi chunks b_n ... b_2 b_1 b_0, and the length of each chunk is N.
361 Suppose b_i is the i-th chunk's value.
362 Then for unsigned data or data with one chunk: we have
363 retValue = b_n * 2^(n*N) + ... + b_1 * 2^N + b_0 * 2^0;
364 But for signed data, we have
365 retValue = b_n * 2^(n*N) + ... + b_1 * 2^N + b_0 * 2^0+ (b_0<0) * 2^N +
366 ... (b_(n-1) <0) * 2^(n*N)
367 = (b_n + (b_(n-1)<0)) * 2^(n*N) +... + (b_1 + (b_0<0)) * 2^N + b_0 * 2^0;
368 Together:
369 retValue =
370 (b_n + isSigned * (b_(n-1)<0)) * 2^(n*N) +... + (b_1 + isSigned * (b_0<0)) * 2^N + b_0 * 2^0;
371 */
372
373 retValue = dblValue[numOfChunk - 1];
374
375 for(i = numOfChunk - 1; i > 0; i--) {
376 isSignedNeg = dblValue[i - 1] < 0 ? (double)isSigned : 0;
377 retValue = retValue + isSignedNeg;
378
379 retValue = ldexp(retValue, bitsPerChunk)+ dblValue[i-1];
380 }
381 retValue = ldexp( fracSlope * retValue, fixedExp ) + bias;
382
383 FREE(dblValue);
384 return (retValue);
385
386} /* end rt_GetDblValueFromOverSizedData */
387
388
389/* Function: rt_GetNonBoolMxIdFromDTypeId ======================================
390 * Abstract:
391 * Get the mx???_CLASS given the simulink builtin data type id.
392 */
393static mxClassID rt_GetNonBoolMxIdFromDTypeId(BuiltInDTypeId dTypeID)
394{
395 mxClassID mxID;
396
397 switch (dTypeID) {
398 case SS_DOUBLE:
399 mxID = (sizeof(real_T)==4? mxSINGLE_CLASS: mxDOUBLE_CLASS);
400 break;
401 case SS_SINGLE:
402 mxID = mxSINGLE_CLASS;
403 break;
404 case SS_INT8:
405 switch (sizeof(int8_T)) {
406 case 4: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
407 "Needed for when PWS maps int8_T into 32-bits" */
408 mxID = mxINT32_CLASS;
409 break;
410 case 2: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
411 "Needed for when PWS maps int8_T into 16-bits" */
412 mxID = mxINT16_CLASS;
413 break;
414 case 1:
415 mxID = mxINT8_CLASS;
416 break;
417 default: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
418 "Needed to handle an unknown data type ID" */
419 mxID = mxUNKNOWN_CLASS;
420 break;
421 }
422 break;
423 case SS_UINT8:
424 switch (sizeof(uint8_T)) {
425 case 4: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
426 "Needed for when PWS maps uint8_T into 32-bits" */
427 mxID = mxUINT32_CLASS;
428 break;
429 case 2: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
430 "Needed for when PWS maps uint8_T into 16-bits" */
431 mxID = mxUINT16_CLASS;
432 break;
433 case 1:
434 mxID = mxUINT8_CLASS;
435 break;
436 default: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
437 "Needed to handle an unknown data type ID" */
438 mxID = mxUNKNOWN_CLASS;
439 break;
440 }
441 break;
442 case SS_INT16:
443 mxID = (sizeof(int16_T)==4? mxINT32_CLASS: mxINT16_CLASS);
444 break;
445 case SS_UINT16:
446 mxID = (sizeof(uint16_T)==4? mxUINT32_CLASS: mxUINT16_CLASS);
447 break;
448 case SS_INT32:
449 mxID = mxINT32_CLASS;
450 break;
451 case SS_UINT32:
452 mxID = mxUINT32_CLASS;
453 break;
454 /*case SS_BOOLEAN:
455 mxID = (sizeof(boolean_T)==4? mxUINT32_CLASS: mxLOGICAL_CLASS);
456 break;*/
457 default:
458 mxID = mxUNKNOWN_CLASS;
459 break;
460 }
461
462 return(mxID);
463
464} /* end rt_GetNonBoolMxIdFromDTypeId */
465
466
467
468#ifdef __cplusplus
469extern "C" {
470#endif
471
472
473/* Function: rt_GetMxIdFromDTypeIdForRSim ======================================
474 * Abstract:
475 * Get the mx???_CLASS given the simulink builtin data type id.
476 */
477mxClassID rt_GetMxIdFromDTypeIdForRSim(BuiltInDTypeId dTypeID)
478{
479 mxClassID mxID;
480
481 if (dTypeID == SS_BOOLEAN) {
482 switch (sizeof(boolean_T)) {
483 case 4: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
484 "Needed for when PWS maps boolean_T into 32-bits" */
485 mxID = mxUINT32_CLASS;
486 break;
487 case 2: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
488 "Needed for when PWS maps boolean_T into 16-bits" */
489 mxID = mxUINT16_CLASS;
490 break;
491 default:
492 mxID = mxLOGICAL_CLASS;
493 break;
494 }
495 } else {
496 mxID = rt_GetNonBoolMxIdFromDTypeId(dTypeID);
497 }
498
499 return(mxID);
500
501} /* end rt_GetMxIdFromDTypeIdForRSim */
502
503
504#ifdef __cplusplus
505}
506#endif
507
508
509
510
511#ifdef __cplusplus
512extern "C" {
513#endif
514
515
516/* Function: rt_GetMxIdFromDTypeId =============================================
517 * Abstract:
518 * Get the mx???_CLASS given the simulink builtin data type id.
519 */
520mxClassID rt_GetMxIdFromDTypeId(BuiltInDTypeId dTypeID)
521{
522 mxClassID mxID;
523
524 if (dTypeID == SS_BOOLEAN) {
525 switch (sizeof(boolean_T)) {
526 case 4: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
527 "Needed for when PWS maps boolean_T into 32-bits" */
528 mxID = mxUINT32_CLASS;
529 break;
530 case 2: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
531 "Needed for when PWS maps boolean_T into 16-bits" */
532 mxID = mxUINT16_CLASS;
533 break;
534 default:
535 mxID = mxUINT8_CLASS;
536 break;
537 }
538 } else {
539 mxID = rt_GetNonBoolMxIdFromDTypeId(dTypeID);
540 }
541 return(mxID);
542
543} /* end rt_GetMxIdFromDTypeId */
544
545
546#ifdef __cplusplus
547}
548#endif
549
550
551
552/* Function: rt_GetMatIdFromMxId ===============================================
553 * Abstract:
554 * Get the MatId given the mxClassID.
555 */
556static int_T rt_GetMatIdFromMxId(mxClassID mxID)
557{
558 int_T matID;
559
560 switch (mxID) {
561 case mxCELL_CLASS:
562 case mxSTRUCT_CLASS:
563 case mxOBJECT_CLASS:
564 matID = -1;
565 break;
566 case mxCHAR_CLASS:
567 matID = matUINT16;
568 break;
569 case mxDOUBLE_CLASS:
570 matID = matDOUBLE;
571 break;
572 case mxSINGLE_CLASS:
573 matID = matFLOAT;
574 break;
575 case mxINT8_CLASS:
576 matID = matINT8;
577 break;
578 case mxUINT8_CLASS:
579 matID = matUINT8;
580 break;
581 case mxINT16_CLASS:
582 matID = matINT16;
583 break;
584 case mxUINT16_CLASS:
585 matID = matUINT16;
586 break;
587 case mxINT32_CLASS:
588 matID = matINT32;
589 break;
590 case mxUINT32_CLASS:
591 matID = matUINT32;
592 break;
593 case mxINT64_CLASS:
594 matID = matINT64;
595 break;
596 case mxUINT64_CLASS:
597 matID = matUINT64;
598 break;
599 default:
600 matID = matUNKNOWN;
601 break;
602 }
603 return(matID);
604
605} /* end rt_GetMatIdFromMxId */
606
607
608/* Forward declaration */
609static int_T rt_WriteItemToMatFile(FILE *fp,
610 MatItem *pItem,
611 ItemDataKind dataKind);
612
613
614/* Function: rt_ProcessMatItem =================================================
615 * Abstract:
616 * This routine along with rt_WriteItemToMatFile() write out a specified
617 * mat-item the .mat file. Note that if the input argument
618 * cmd == 0, then this function just calculates the size of the item.
619 * cmd <> 0, this function writes the mat-item to the file.
620 * Return values is
621 * -1 : coding/logic error
622 * 0 : upon success
623 * > 0 : upon write failure (1)
624 */
625static int_T rt_ProcessMatItem(FILE *fp,
626 MatItem *pItem,
627 ItemDataKind itemKind,
628 int_T cmd)
629{
630 mxClassID mxID = mxUNKNOWN_CLASS;
631 uint32_T arrayFlags[2] = {0, 0};
632 int32_T *dims = NULL;
633 int32_T _dims[3] = {0, 0, 0};
634 int32_T nDims = 2;
635 int32_T nBytesInItem = 0;
636 const char_T *itemName;
637 MatItem item;
638 int_T retStat = 0;
639
640 switch (itemKind) {
641 case DATA_ITEM: {
642 (void)fprintf(stderr,"Unexpected itemKind = DATA_ITEM in "
643 "rt_ProcessMatItem @A\n");
644 retStat = -1;
645 goto EXIT_POINT;
646 }
647 case MATRIX_ITEM: {
648 const MatrixData *var = (const MatrixData *) pItem->data;
649
650 mxID = var->mxID;
651 arrayFlags[0] = mxID;
652 arrayFlags[0] |= var->logical;
653 arrayFlags[0] |= var->complex;
654 if (var->nDims < 2) {
655 dims = _dims;
656 dims[0] = var->nRows;
657 dims[1] = var->nCols;
658 nDims = 2;
659 } else {
660 int32_T k;
661 dims = (int32_T*)malloc(sizeof(int32_T)*(var->nDims+1));
662 for (k = 0; k < var->nDims; k++) {
663 dims[k] = var->dims[k];
664 }
665 dims[var->nDims] = var->nRows;
666 nDims = var->nDims + 1;
667 }
668 itemName = var->name;
669 break;
670 }
671 case STRUCT_LOG_VAR_ITEM: {
672 const StructLogVar *var = (const StructLogVar *) pItem->data;
673
674 mxID = mxSTRUCT_CLASS;
675 arrayFlags[0] = mxID;
676 dims = _dims;
677 dims[0] = 1;
678 dims[1] = 1;
679 itemName = var->name;
680 break;
681 }
682 case SIGNALS_STRUCT_ITEM: {
683 const SignalsStruct *var = (const SignalsStruct *) pItem->data;
684
685 mxID = mxSTRUCT_CLASS;
686 arrayFlags[0] = mxID;
687 dims = _dims;
688 dims[0] = 1;
689 dims[1] = var->numSignals;
690 itemName = &SIGNALS_FIELD_NAME;
691 break;
692 }
693 default:
694 (void)fprintf(stderr,"Unexpected itemKind=%d in rt_ProcessMatItem @B\n",
695 itemKind);
696 retStat = -1;
697 goto EXIT_POINT;
698 }
699
700 /* array flags */
701 item.nbytes = 2*sizeof(uint32_T);
702 if (cmd) {
703 item.type = matUINT32;
704 item.data = arrayFlags;
705 if (rt_WriteItemToMatFile(fp,&item, DATA_ITEM)) {
706 retStat = 1;
707 goto EXIT_POINT;
708 }
709 } else {
710 /*LINTED E_CAST_INT_TO_SMALL_INT*/
711 nBytesInItem += matINT64_ALIGN(matTAG_SIZE + item.nbytes);
712 }
713 /* dimensions */
714 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
715 item.nbytes = nDims*sizeof(int32_T);
716 if (cmd) {
717 item.type = matINT32;
718 item.data = dims;
719 if (rt_WriteItemToMatFile(fp,&item, DATA_ITEM)) {
720 retStat = 1;
721 goto EXIT_POINT;
722 }
723 } else {
724 /*LINTED E_CAST_INT_TO_SMALL_INT*/
725 nBytesInItem += matINT64_ALIGN(matTAG_SIZE + item.nbytes);
726 }
727 /* name */
728 item.nbytes = (int32_T)strlen(itemName);
729 if (cmd) {
730 item.type = matINT8;
731 item.data = (const char_T*) itemName;
732 if (rt_WriteItemToMatFile(fp,&item, DATA_ITEM)) {
733 retStat = 1;
734 goto EXIT_POINT;
735 }
736 } else {
737 nBytesInItem += (item.nbytes <= 4) ? /*LINTED E_CAST_INT_TO_SMALL_INT*/
738 matTAG_SIZE : matINT64_ALIGN(matTAG_SIZE + item.nbytes);
739 }
740
741 if (itemKind == MATRIX_ITEM) {
742 const MatrixData *var = (const MatrixData*) pItem->data;
743 int_T matID = rt_GetMatIdFromMxId(mxID);
744 size_t elSize = var->elSize;
745
746 /* data */
747 item.nbytes = (int32_T)(var->nRows * var->nCols * elSize);
748 if (cmd) {
749 item.type = matID;
750 item.data = var->re;
751 if (rt_WriteItemToMatFile(fp, &item, DATA_ITEM)) {
752 retStat = 1;
753 goto EXIT_POINT;
754 }
755 } else {
756 nBytesInItem += (item.nbytes <= 4) ? /*LINTED*/
757 matTAG_SIZE : matINT64_ALIGN(matTAG_SIZE + item.nbytes);
758 }
759 /* imaginary part */
760 if (var->complex) {
761 item.nbytes = (int32_T)(var->nRows * var->nCols * elSize);
762 if (cmd) {
763 item.type = matID;
764 item.data = var->im;
765 if (rt_WriteItemToMatFile(fp, &item, DATA_ITEM)) {
766 retStat = 1;
767 goto EXIT_POINT;
768 }
769 } else {
770 nBytesInItem += (item.nbytes <= 4) ? /*LINTED*/
771 matTAG_SIZE : matINT64_ALIGN(matTAG_SIZE + item.nbytes);
772 }
773 }
774 } else { /* some type of structure item */
775 const char_T *fieldNames;
776 int_T sizeofFieldNames;
777
778 /* field names */
779 switch (itemKind) {
780 case STRUCT_LOG_VAR_ITEM: {
781 const StructLogVar *var = (const StructLogVar *) pItem->data;
782 fieldNames = rtStructLogVarFieldNames;
783 sizeofFieldNames = var->numActiveFields * mxMAXNAM;
784 break;
785 }
786 case SIGNALS_STRUCT_ITEM: {
787 const SignalsStruct *var = (const SignalsStruct *) pItem->data;
788 fieldNames = var->fieldNames;
789 sizeofFieldNames = var->numActiveFields * mxMAXNAM;
790 break;
791 }
792 default: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
793 "Needed to handle an unknown itemKind" */
794 (void)fprintf(stderr, "Unexpected itemKind=%d in "
795 "rt_ProcessMatItem @C\n", itemKind);
796 retStat = -1;
797 goto EXIT_POINT;
798 }
799
800 /* write field names */
801 if (cmd) {
802 int32_T tmpInt = mxMAXNAM;
803
804 item.nbytes = sizeof(int32_T);
805 item.type = matINT32;
806 item.data = &tmpInt;
807 if (rt_WriteItemToMatFile(fp,&item, DATA_ITEM)) {
808 retStat = 1;
809 goto EXIT_POINT;
810 }
811
812 item.nbytes = sizeofFieldNames;
813 item.type = matINT8;
814 item.data = (const char_T*) fieldNames;
815 if (rt_WriteItemToMatFile(fp,&item, DATA_ITEM)) {
816 retStat = 1;
817 goto EXIT_POINT;
818 }
819 } else {
820 /*LINTED E_CAST_INT_TO_SMALL_INT*/
821 nBytesInItem += matINT64_ALIGN( matTAG_SIZE + matTAG_SIZE +
822 sizeofFieldNames );
823 }
824
825 /* process each field of the structure */
826 switch (itemKind) {
827 case STRUCT_LOG_VAR_ITEM: {
828 const StructLogVar *var = pItem->data;
829
830 /* time */
831 {
832 const void *data = var->time;
833
834 if (var->logTime) { /* time is a LogVar, get the MatrixData */
835 data = &(((const LogVar*) (var->time))->data);
836 }
837
838 item.type = matMATRIX;
839 item.data = data;
840 if (cmd) {
841 if (rt_WriteItemToMatFile(fp,&item,MATRIX_ITEM)){
842 retStat = 1;
843 goto EXIT_POINT;
844 }
845 } else {
846 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM,0)){
847 retStat = 1;
848 goto EXIT_POINT;
849 }
850 nBytesInItem += item.nbytes + matTAG_SIZE;
851 }
852 }
853
854 /* signals */
855 item.type = matMATRIX;
856 item.data = &(var->signals);
857 if (cmd) {
858 if (rt_WriteItemToMatFile(fp,&item,SIGNALS_STRUCT_ITEM)) {
859 retStat = 1;
860 goto EXIT_POINT;
861 }
862 } else {
863 if (rt_ProcessMatItem(fp, &item, SIGNALS_STRUCT_ITEM,0)) {
864 retStat = 1;
865 goto EXIT_POINT;
866 }
867 nBytesInItem += item.nbytes + matTAG_SIZE;
868 }
869
870 /* block name */
871 if (var->blockName != NULL) {
872 item.type = matMATRIX;
873 item.data = var->blockName;
874 if (cmd) {
875 if (rt_WriteItemToMatFile(fp, &item, MATRIX_ITEM)) {
876 retStat = 1;
877 goto EXIT_POINT;
878 }
879 } else {
880 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
881 retStat = 1;
882 goto EXIT_POINT;
883 }
884 nBytesInItem += item.nbytes + matTAG_SIZE;
885 }
886 }
887 break;
888 }
889 case SIGNALS_STRUCT_ITEM: {
890 const SignalsStruct *var = pItem->data;
891 const LogVar *values = var->values;
892 const MatrixData *dimensions = var->dimensions;
893 const MatrixData *labels = var->labels;
894 const MatrixData *plotStyles = var->plotStyles;
895 const MatrixData *titles = var->titles;
896 const MatrixData *blockNames = var->blockNames;
897 const MatrixData *stateNames = var->stateNames;
898 const MatrixData *crossMdlRef = var->crossMdlRef;
899 const boolean_T logValueDimensions = var->logValueDimensions;
900 int_T i;
901
902 for (i = 0; i < var->numSignals; i++) {
903 /* values */
904 item.type = matMATRIX;
905 item.data = &(values->data);
906 if (cmd) {
907 if (rt_WriteItemToMatFile(fp, &item,MATRIX_ITEM)) {
908 retStat = 1;
909 goto EXIT_POINT;
910 }
911 } else {
912 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
913 retStat = 1;
914 goto EXIT_POINT;
915 }
916 nBytesInItem += item.nbytes + matTAG_SIZE;
917 }
918
919 if(logValueDimensions)
920 {
921 /* valueDimensions */
922 /* Since the functions rt_WriteItemToMatFile and
923 rt_ProcessMatItem deal with MatrixData,
924 convert valDims to tempData, and fill up the
925 necessary fields.
926 */
927 MatrixData tempData;
928 (void)memcpy(tempData.name, &VALUEDIMENSIONS_FIELD_NAME, mxMAXNAM);
929 tempData.nRows = values->valDims->nRows;
930 tempData.nCols = values->valDims->nCols;
931 tempData.nDims = 1;
932 tempData._dims[0] = values->valDims->nCols;
933 tempData.re = values->valDims->dimsData;
934 tempData.im = NULL;
935 tempData.dTypeID = SS_DOUBLE;
936 tempData.elSize = sizeof(real_T);
937 tempData.mxID = mxDOUBLE_CLASS;
938 tempData.logical = 0;
939 tempData.complex = 0;
940 tempData.frameData = 0;
941 tempData.frameSize = 1;
942
943 item.type = matMATRIX;
944 item.data = &tempData; /*values->valDims;*/
945
946 if (cmd) {
947 if (rt_WriteItemToMatFile(fp, &item,MATRIX_ITEM)) {
948 retStat = 1;
949 goto EXIT_POINT;
950 }
951 } else {
952 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
953 retStat = 1;
954 goto EXIT_POINT;
955 }
956 nBytesInItem += item.nbytes + matTAG_SIZE;
957 }
958 }
959 values = values->next;
960
961 /* dimensions */
962 if (dimensions != NULL) {
963 item.type = matMATRIX;
964 item.data = &(dimensions[i]);
965 if (cmd) {
966 if (rt_WriteItemToMatFile(fp,&item, MATRIX_ITEM)) {
967 retStat = 1;
968 goto EXIT_POINT;
969 }
970 } else {
971 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
972 retStat = 1;
973 goto EXIT_POINT;
974 }
975 nBytesInItem += item.nbytes + matTAG_SIZE;
976 }
977 }
978
979 /* label */
980 item.type = matMATRIX;
981 item.data = &(labels[i]);
982 if (cmd) {
983 if (rt_WriteItemToMatFile(fp, &item,MATRIX_ITEM)) {
984 retStat = 1;
985 goto EXIT_POINT;
986 }
987 } else {
988 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
989 retStat = 1;
990 goto EXIT_POINT;
991 }
992 nBytesInItem += item.nbytes + matTAG_SIZE;
993 }
994 /* title */
995 if (titles != NULL) {
996 item.type = matMATRIX;
997 item.data = &(titles[i]);
998 if (cmd) {
999 if (rt_WriteItemToMatFile(fp, &item, MATRIX_ITEM)) {
1000 retStat = 1;
1001 goto EXIT_POINT;
1002 }
1003 } else {
1004 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
1005 retStat = 1;
1006 goto EXIT_POINT;
1007 }
1008 nBytesInItem += item.nbytes + matTAG_SIZE;
1009 }
1010 }
1011 /* plot style */
1012 if (plotStyles != NULL) {
1013 item.type = matMATRIX;
1014 item.data = &(plotStyles[i]);
1015 if (cmd) {
1016 if (rt_WriteItemToMatFile(fp,&item, MATRIX_ITEM)) {
1017 retStat = 1;
1018 goto EXIT_POINT;
1019 }
1020 } else {
1021 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
1022 retStat = 1;
1023 goto EXIT_POINT;
1024 }
1025 nBytesInItem += item.nbytes + matTAG_SIZE;
1026 }
1027 }
1028 /* block name */
1029 if (blockNames != NULL) {
1030 item.type = matMATRIX;
1031 item.data = &(blockNames[i]);
1032 if (cmd) {
1033 if (rt_WriteItemToMatFile(fp, &item, MATRIX_ITEM)) {
1034 retStat = 1;
1035 goto EXIT_POINT;
1036 }
1037 } else {
1038 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
1039 retStat = 1;
1040 goto EXIT_POINT;
1041 }
1042 nBytesInItem += item.nbytes + matTAG_SIZE;
1043 }
1044 }
1045 /* state name */
1046 if (stateNames != NULL) {
1047 item.type = matMATRIX;
1048 item.data = &(stateNames[i]);
1049 if (cmd) {
1050 if (rt_WriteItemToMatFile(fp, &item, MATRIX_ITEM)) {
1051 retStat = 1;
1052 goto EXIT_POINT;
1053 }
1054 } else {
1055 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
1056 retStat = 1;
1057 goto EXIT_POINT;
1058 }
1059 nBytesInItem += item.nbytes + matTAG_SIZE;
1060 }
1061 }
1062 /* crossMdlRef */
1063 if (crossMdlRef != NULL) {
1064 item.type = matMATRIX;
1065 item.data = &(crossMdlRef[i]);
1066 if (cmd) {
1067 if (rt_WriteItemToMatFile(fp, &item, MATRIX_ITEM)) {
1068 retStat = 1;
1069 goto EXIT_POINT;
1070 }
1071 } else {
1072 if (rt_ProcessMatItem(fp, &item, MATRIX_ITEM, 0)) {
1073 retStat = 1;
1074 goto EXIT_POINT;
1075 }
1076 nBytesInItem += item.nbytes + matTAG_SIZE;
1077 }
1078 }
1079 } /* for i=1:numSignals */
1080 break;
1081 }
1082 default: /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
1083 "Needed to handle an unknown itemKind" */
1084 (void)fprintf(stderr, "Unexpected itemKind=%d in "
1085 "rt_ProcessMatItem @D\n", itemKind);
1086 retStat = -1;
1087 goto EXIT_POINT;
1088 }
1089 } /* end struct item */
1090
1091 if (!cmd) {
1092 pItem->nbytes = nBytesInItem;
1093 }
1094
1095 EXIT_POINT:
1096 if (dims != _dims) {
1097 FREE(dims);
1098 }
1099 return(retStat);
1100
1101} /* end rt_ProcessMatItem */
1102
1103
1104/* Function: rt_WriteItemToMatFile =============================================
1105 * Abstract:
1106 * Entry function for writing out a mat item to the mat file.
1107 *
1108 * Return values is
1109 * == 0 : upon success
1110 * <> 0 : upon failure
1111 */
1112static int_T rt_WriteItemToMatFile(FILE *fp,
1113 MatItem *pItem,
1114 ItemDataKind itemKind)
1115{
1116 /* Determine the item size */
1117 if (pItem->type == matMATRIX) {
1118 if (rt_ProcessMatItem(fp, pItem, itemKind, 0)) return(1);
1119 }
1120
1121 /* Write the item tag and data */
1122 if (pItem->nbytes > 4) {
1123 int32_T nAlignBytes;
1124
1125 if (fwrite(pItem, 1, matTAG_SIZE, fp) != matTAG_SIZE) return(1);
1126
1127 if (pItem->type == matMATRIX) {
1128 if (rt_ProcessMatItem(fp, pItem, itemKind, 1)) return(1);
1129 } else {
1130 if ( fwrite(pItem->data, 1, pItem->nbytes, fp) !=
1131 ((size_t) pItem->nbytes) ) {
1132 return(1);
1133 }
1134 }
1135
1136 /* Add offset for 8-byte alignment */
1137 nAlignBytes = matINT64_ALIGN(pItem->nbytes) - pItem->nbytes;
1138 if (nAlignBytes > 0) {
1139 int pad[2] = {0, 0};
1140 if ( fwrite(pad,1,nAlignBytes,fp) != ((size_t) nAlignBytes) ) {
1141 return(1);
1142 }
1143 }
1144 } else {
1145 MatItem item = {0, 0, NULL};
1146 item.type = ((uint32_T)(pItem->type))|(((uint32_T)(pItem->nbytes))<<16);
1147 (void)memcpy(&item.nbytes, pItem->data, pItem->nbytes);
1148 if (fwrite(&item, 1, matTAG_SIZE, fp) != matTAG_SIZE) return(1);
1149 }
1150
1151 return(0);
1152
1153} /* end rt_WriteItemToMatFile */
1154
1155
1156/* Function: rt_WriteMat5FileHeader ============================================
1157 * Abstract:
1158 * Function to write the mat file header.
1159 * Return values is
1160 * == 0 : upon success
1161 * <> 0 : upon failure
1162 */
1163static int_T rt_WriteMat5FileHeader(FILE *fp)
1164{
1165 int_T nbytes;
1166 int_T nspaces;
1167 int_T i, n;
1168 unsigned short ver[2];
1169 char_T spaces[16];
1170 const char_T *matversion = "MATLAB 5.0 MAT-file";
1171
1172 (void)memset(spaces, ' ', sizeof(spaces));
1173
1174 n = (int_T)strlen(matversion);
1175 nbytes = (int_T)fwrite(matversion, 1, n, fp);
1176 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1177 nspaces = matVERSION_INFO_OFFSET - nbytes;
1178 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1179 n = nspaces % sizeof(spaces);
1180 nbytes += (int_T)fwrite(spaces, 1, n, fp);
1181 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1182 n = nspaces / sizeof(spaces);
1183 for (i = 0; i < n; ++i) {
1184 nbytes += (int_T)fwrite(spaces, 1, sizeof(spaces), fp);
1185 }
1186 if (nbytes == matVERSION_INFO_OFFSET) {
1187 ver[0] = matVERSION;
1188 ver[1] = matKEY;
1189 nbytes += (int_T)fwrite(ver, 1, sizeof(ver), fp);
1190 }
1191 return(nbytes != matVERSION_INFO_OFFSET + sizeof(ver));
1192
1193} /* end rt_WriteMat5FileHeader */
1194
1195
1196/* Function: rt_FixupLogVar ====================================================
1197 * Abstract:
1198 * Make the logged variable suitable for MATLAB.
1199 */
1200static const char_T *rt_FixupLogVar(LogVar *var,int verbose)
1201{
1202 int_T nCols = var->data.nCols;
1203 int_T maxRows = var->data.nRows;
1204 int_T nDims = var->data.nDims;
1205 size_t elSize = var->data.elSize;
1206 int_T nRows = (var->wrapped ? maxRows : var->rowIdx);
1207
1208 var->nDataPoints = var->rowIdx + var->wrapped * maxRows;
1209
1210 if (var->wrapped > 1 || (var->wrapped == 1 && var->rowIdx != 0)) {
1211 /*
1212 * Warn the user the circular buffer has wrapped, implying that
1213 * some data has been lost.
1214 */
1215 if( verbose) {
1216 (void)fprintf(stdout,
1217 "*** Log variable %s has wrapped %d times\n"
1218 " using a circular buffer of size %d\n",
1219 var->data.name, var->wrapped, var->data.nRows);
1220 }
1221 if (var->usingDefaultBufSize) {
1222 /*
1223 * If wrapping occurred using the default buffer size,
1224 * let the user know what size buffer to use in the
1225 * future to avoid wrapping. If the default buffer
1226 * size was not used, the user has no control to specify
1227 * the correct value. Wrapping may occur when not using
1228 * the default buffer if we allocated too small a buffer
1229 * size for this logvar. One common case is a toWorkspace
1230 * block inside of an iterative subsystem - we can not take
1231 * the number of iterations into account (they may be
1232 * variable) when allocating the buffer. In this case,
1233 * just warn the buffer wrapped and don't tell user they
1234 * can override the buffer size.
1235 */
1236 if( verbose ) {
1237 (void)fprintf(stdout,
1238 "*** To avoid wrapping, explicitly specify a\n"
1239 " buffer size of %d in your Simulink model\n"
1240 " by adding OPTS=\"-DDEFAULT_BUFFER_SIZE=%d\"\n"
1241 " as an argument to the ConfigSet MakeCommand\n"
1242 " parameter\n",
1243 var->nDataPoints, var->nDataPoints);
1244 }
1245 }
1246 }
1247
1248 if (nDims < 2 && nCols > 1) { /* Transpose? */
1249 /* Don't need to transpose valueDimensions */
1250 int_T nEl = nRows*nCols;
1251 char *src = var->data.re;
1252 char *pmT;
1253 int_T k;
1254
1255 /**********************************
1256 * If memory cannot be allocated, *
1257 * write to a temporary buffer *
1258 **********************************/
1259 if ((pmT = malloc(nEl*elSize)) == NULL) {
1260 FILE *fptr;
1261 char fName[mxMAXNAM+13];
1262
1263 (void)sprintf(fName, "%s%s", var->data.name, "_rtw_tmw.tmw");
1264 if ((fptr=fopen(fName,"w+b")) == NULL) {
1265 (void)fprintf(stderr,"*** Error opening %s",fName);
1266 return("unable to open data file\n");
1267 }
1268
1269 /****************************
1270 * Write the data to a file *
1271 ****************************/
1272 for (k=0; k<nEl; k++) {
1273 int_T kT = nCols*(k%nRows) + (k/nRows);
1274 char *dst = src + kT*elSize;
1275 (void)fwrite(dst, elSize, 1, fptr);
1276 }
1277 if (var->data.complex) {
1278 char *pmiT = var->data.re;
1279 src = var->data.im;
1280 for (k=0; k<nEl; k++) {
1281 int_T kT = nRows*(k%nCols) + (k/nCols);
1282 char *dst = pmiT + kT*elSize;
1283 (void)memcpy(dst, src, elSize);
1284 src += elSize;
1285 }
1286 var->data.re = var->data.im;
1287 var->data.im = pmiT;
1288 }
1289
1290 /*******************************
1291 * Read the data from the file *
1292 *******************************/
1293 (void)rewind(fptr);
1294 (void)fread(var->data.re, elSize, nEl, fptr);
1295 (void)fclose(fptr);
1296 (void)remove(fName);
1297 } else {
1298 for (k=0; k<nEl; k++) {
1299 int_T kT = nRows*(k%nCols) + (k/nCols);
1300 char *dst = pmT + kT*elSize;
1301 (void)memcpy(dst, src, elSize);
1302 src += elSize;
1303 }
1304 if (var->data.complex) {
1305 char *pmiT = var->data.re;
1306 src = var->data.im;
1307 for (k=0; k<nEl; k++) {
1308 int_T kT = nRows*(k%nCols) + (k/nCols);
1309 char *dst = pmiT + kT*elSize;
1310 (void)memcpy(dst, src, elSize);
1311 src += elSize;
1312 }
1313 var->data.re = var->data.im;
1314 var->data.im = pmiT;
1315 }
1316 FREE(var->data.re);
1317 var->data.re = pmT;
1318 }
1319 } /* Transpose? */
1320
1321 if (var->wrapped > 0 && var->rowIdx != 0 ) { /* Rotate? */
1322 char_T *buffer = var->data.re;
1323 int_T done = 0; /* done: 0 (1) rotate real (imag) part. */
1324
1325 do {
1326 char_T *col = buffer;
1327 int_T rowOffset = (int_T)((nDims == 1) ? (elSize) : (elSize * nCols));
1328 int_T colOffset = (int_T)((nDims == 1)? (nRows*elSize) : elSize);
1329 int_T zeroIdx = var->rowIdx;
1330 int_T j;
1331
1332 for (j = 0 ; j < nCols; ++j, col += colOffset) {
1333 int_T swapCount;
1334 int_T srcIdx;
1335 int_T dstIdx;
1336 int_T tmpIdx;
1337 MatReal tmp;
1338
1339 for (tmpIdx=0, swapCount=0; swapCount < nRows; tmpIdx++) {
1340 (void)memcpy(&tmp, col + tmpIdx*rowOffset, elSize);
1341
1342 dstIdx=tmpIdx;
1343 srcIdx = ((dstIdx + zeroIdx) % nRows);
1344 while (srcIdx != tmpIdx) {
1345 (void)memcpy(col + dstIdx*rowOffset,
1346 col + srcIdx*rowOffset,
1347 elSize);
1348 ++swapCount;
1349 dstIdx = srcIdx;
1350 srcIdx = ((dstIdx + zeroIdx) % nRows);
1351
1352 }
1353 (void)memcpy(col + dstIdx*rowOffset, &tmp, elSize);
1354 ++swapCount;
1355 }
1356 }
1357 done ++;
1358 /* need to rotate the imaginary part */
1359 } while ((done == 1) && ((buffer = var->data.im) != NULL));
1360
1361 var->rowIdx = 0;
1362 } /* Rotate? */
1363
1364 /*
1365 * We might have allocated more number of rows than the number of data
1366 * points that have been logged, in which case set nRows to nDataPoints
1367 * so that only these values get saved.
1368 */
1369 if (var->nDataPoints < var->data.nRows) {
1370 var->data.nRows = var->nDataPoints;
1371 if(var->valDims != NULL){
1372 size_t elSizeValDims = sizeof(real_T);
1373 int_T k;
1374 real_T *dimsData = var->valDims->dimsData + nRows;
1375 /*
1376 Keep nRows of values and that of valueDimensions consistent
1377 for variable-size signals.
1378 */
1379 var->valDims->nRows = var->data.nRows;
1380 /*
1381 Also need to move data when shrinking the array size,
1382 because valueDimensions data is stored in array format.
1383 e.g. maxRows = 4; nRows = 2; nDims = 3;
1384 Before fixing up the logVar, the locations of data are as below:
1385 (x, y, z -- useful data / o -- junk)
1386 a[0] = x a[4] = y a[8] = z
1387 a[1] = x a[5] = y a[9] = z
1388 a[2] = o a[6] = o a[10]= o
1389 a[3] = o a[7] = o a[11]= o
1390 After fixing up the logVar, we want the data to be stored as:
1391 a[0] = x a[4] = z a[8] = o
1392 a[1] = x a[5] = z a[9] = o
1393 a[2] = y a[6] = o a[10]= o
1394 a[3] = y a[7] = o a[11]= o
1395 */
1396 for(k = 1; k < nDims; k++){
1397 (void) memmove(dimsData,
1398 var->valDims->dimsData + k*maxRows,
1399 elSizeValDims * nRows);
1400 dimsData += nRows;
1401 }
1402 }
1403 }
1404 return(NULL);
1405
1406} /* end rt_FixupLogVar */
1407
1408
1409/* Function: rt_LoadModifiedLogVarName =========================================
1410 * Abstract:
1411 * The name of the logged variable is obtained from the input argument
1412 * varName and the nameModifier which is obtained from the simstruct. If
1413 * the nameModifier begins with an '_', then nameModifier is post-pended to
1414 * varName to obtain the name of the logged variable. If the first
1415 * character does not begin with an '_', then the nameModifier is
1416 * pre-pended to varName.
1417 *
1418 * Examples:
1419 * a) varName = "tout" & nameModifier = "_rt" => logVarName = "tout_rt"
1420 * b) varName = "tout" & nameModifier = "rt_" => logVarName = "rt_tout"
1421 * c) varName = "tout" & nameModifier = "none" => logVarName = "tout"
1422 */
1423static void rt_LoadModifiedLogVarName(const RTWLogInfo *li, /* in */
1424 const char *varName, /* in */
1425 char *logVarName) /* out */
1426{
1427 int_T nameLen;
1428 const char_T *nameModifier = rtliGetLogVarNameModifier(li);
1429
1430 if (nameModifier != NULL && strcmp(nameModifier,"none")==0) {
1431 nameModifier = NULL;
1432 }
1433
1434 logVarName[mxMAXNAM-1] = '\0';
1435 if (nameModifier == NULL) {
1436 (void)strncpy(logVarName, varName, mxMAXNAM-1);
1437 } else if (nameModifier[0] == '_') {
1438 (void)strncpy(logVarName, varName, mxMAXNAM-1);
1439 nameLen = (int_T)strlen(logVarName);
1440 (void)strncat(logVarName, nameModifier, (size_t)mxMAXNAM-1-nameLen);
1441 } else {
1442 (void)strncpy(logVarName, nameModifier, mxMAXNAM-1);
1443 nameLen = (int_T)strlen(logVarName);
1444 (void)strncat(logVarName, varName, (size_t)mxMAXNAM-1-nameLen);
1445 }
1446
1447} /* end rt_LoadModifiedLogVarName */
1448
1449
1450/* Function: rt_GetActualDTypeID ===============================================
1451 * Abstract:
1452 * Given a built-in data type id, return the actual data type id.
1453 * The only time these are different is when real_T has been mapped
1454 * to a single.
1455 */
1456#if defined(_MSC_VER)
1457 #pragma warning(push)
1458 #pragma warning(disable: 4127)
1459#endif
1460static BuiltInDTypeId rt_GetActualDTypeID(BuiltInDTypeId dTypeID)
1461{
1462 /*LINTED E_FALSE_LOGICAL_EXPR*/
1463 if (dTypeID == SS_DOUBLE && sizeof(real_T) != 8) { /* polyspace DEFECT:DEAD_CODE
1464 [Not a defect:Unset]
1465 "Needed for when real_T has been
1466 mapped to a single" */
1467 return(SS_SINGLE);
1468 } else {
1469 return(dTypeID);
1470 }
1471
1472} /* end rt_GetActualDTypeID */
1473#if defined(_MSC_VER)
1474 #pragma warning(pop)
1475#endif
1476
1477
1478/* Function: rt_DestroyLogVar ==================================================
1479 * Abstract:
1480 * Destroy the log var linked list.
1481 */
1482static void rt_DestroyLogVar(LogVar *head)
1483{
1484 while(head) {
1485 LogVar *var = head;
1486 head = var->next;
1487 FREE(var->data.re);
1488 FREE(var->data.im);
1489 if (var->data.dims != var->data._dims) {
1490 FREE(var->data.dims);
1491 }
1492 /* free valDims if necessary */
1493 if(var->valDims != NULL) {
1494 FREE(var->valDims->dimsData);
1495 FREE(var->valDims);
1496 }
1497 /* free coords, strides and currStrides if necessary */
1498 FREE(var->coords);
1499 FREE(var->strides);
1500 FREE(var->currStrides);
1501
1502 FREE(var);
1503 }
1504
1505} /* end rt_DestroyLogVar */
1506
1507
1508/* Function: rt_DestroyStructLogVar ============================================
1509 * Abstract:
1510 * Destroy the struct log var linked list.
1511 */
1512static void rt_DestroyStructLogVar(StructLogVar *head)
1513{
1514 while(head) {
1515 StructLogVar *var = head;
1516
1517 head = var->next;
1518
1519 if (var->logTime) { /* time is LogVar */
1520 rt_DestroyLogVar(var->time);
1521 } else { /* time is MatrixData */
1522 FREE(var->time);
1523 }
1524 rt_DestroyLogVar(var->signals.values);
1525 FREE(var->signals.labels);
1526 FREE(var->signals.plotStyles);
1527 FREE(var->signals.dimensions);
1528 FREE(var->signals.titles);
1529 FREE(var->signals.blockNames);
1530 FREE(var->signals.stateNames);
1531 FREE(var->signals.crossMdlRef);
1532 FREE(var->blockName);
1533 FREE(var);
1534 }
1535
1536} /* end rt_DestroyStructLogVar */
1537
1538
1539/* Function: rt_InitSignalsStruct ==============================================
1540 * Abstract:
1541 * Initialize the signals structure in the struct log variable.
1542 *
1543 * Returns:
1544 * == NULL => success.
1545 * ~= NULL => failure, the return value is a pointer to the error
1546 * message, which is also set in the simstruct.
1547 */
1548static const char_T *rt_InitSignalsStruct(RTWLogInfo *li,
1549 const real_T startTime,
1550 const real_T finalTime,
1551 const real_T inStepSize,
1552 const char_T **errStatus,
1553 StructLogVar *var,
1554 int_T maxRows,
1555 int_T decimation,
1556 real_T sampleTime,
1557 const RTWLogSignalInfo *sigInfo)
1558{
1559 int_T i, sigIdx;
1560 SignalsStruct *sig = &(var->signals);
1561 int_T nSignals = sigInfo->numSignals;
1562 const int_T *numCols = sigInfo->numCols;
1563 const int_T *numDims = sigInfo->numDims;
1564 const int_T *dims = sigInfo->dims;
1565 const BuiltInDTypeId *dTypes = sigInfo->dataTypes;
1566 const int_T *cSgnls = sigInfo->complexSignals;
1567 const int_T *fData = sigInfo->frameData;
1568 const char_T **labels = sigInfo->labels.cptr;
1569 const int_T *plotStyles = sigInfo->plotStyles;
1570 const char_T *titles = sigInfo->titles;
1571 const int_T *titleLen = sigInfo->titleLengths;
1572 const char_T **blockNames = sigInfo->blockNames.cptr;
1573 const char_T **stateNames = sigInfo->stateNames.cptr;
1574 const boolean_T *crossMdlRef = sigInfo->crossMdlRef;
1575 void **currSigDims = sigInfo->currSigDims;
1576 int_T *currSigDimsSize = sigInfo->currSigDimsSize;
1577 LogVar *prevValues = NULL;
1578 int_T dimsOffset = 0;
1579 boolean_T *isVarDims = sigInfo->isVarDims;
1580 /* if any signal is variable-size, the field 'valueDimensions' is needed */
1581 boolean_T logValueDimensions = false;
1582 const RTWLogDataTypeConvert *pDTConvInfo = sigInfo->dataTypeConvert;
1583
1584 /* reset error status */
1585 *errStatus = NULL;
1586
1587 sig->numActiveFields = 1;
1588 sig->numSignals = nSignals;
1589
1590 sig->isVarDims = isVarDims;
1591 /* check whether we need valueDimensions field*/
1592 for (i=0; i<nSignals; i++){
1593 if(isVarDims[i]){
1594 logValueDimensions = true;
1595 break;
1596 }
1597 }
1598
1599 /* values */
1600 dimsOffset = 0;
1601 for (i = 0; i < nSignals; i++) {
1602 BuiltInDTypeId dt = (dTypes) ? dTypes[i] : SS_DOUBLE;
1603 int_T cs = (cSgnls) ? cSgnls[i] : 0;
1604 int_T fd = (fData) ? fData[i] : 0;
1605 int_T nd = (numDims) ? numDims[i] : 1;
1606
1607 const RTWLogDataTypeConvert *pDTConvInfoCur =
1608 (pDTConvInfo) ? (pDTConvInfo+i) : 0;
1609
1610 LogVar *values = NULL;
1611 LogValDimsStat logValDimsStat;
1612
1613 if(!logValueDimensions){
1614 logValDimsStat = NO_LOGVALDIMS;
1615 }
1616 else{
1617 logValDimsStat = isVarDims[i] ? LOGVALDIMS_VARDIMS :
1618 LOGVALDIMS_EMPTYMX;
1619 }
1620
1621 values = rt_CreateLogVarWithConvert(li, startTime, finalTime,
1622 inStepSize, errStatus,
1623 &VALUES_FIELD_NAME,
1624 dt,
1625 pDTConvInfoCur,
1626 0, cs, fd,
1627 numCols[i],nd,
1628 dims + dimsOffset,
1629 logValDimsStat,
1630 currSigDims + dimsOffset,
1631 currSigDimsSize + dimsOffset,
1632 maxRows,decimation,sampleTime, 0);
1633
1634 if (values == NULL) goto ERROR_EXIT;
1635
1636 if (sig->values == NULL) {
1637 sig->values = values;
1638 } else {
1639 if (prevValues == NULL) goto ERROR_EXIT;
1640 prevValues->next = values;
1641 }
1642 prevValues = values;
1643 dimsOffset += nd;
1644 }
1645
1646 if(logValueDimensions){
1647 ++sig->numActiveFields;
1648 sig->logValueDimensions = true;
1649 }
1650 else{
1651 sig->logValueDimensions = false;
1652 }
1653
1654 /* Dimensions */
1655 {
1656 real_T *data;
1657 size_t nbytes;
1658 int_T dataLen = 0;
1659 BuiltInDTypeId dTypeId = rt_GetActualDTypeID(SS_DOUBLE);
1660 size_t dataOffset = nSignals*sizeof(MatrixData);
1661 uint_T overhang = (uint_T)(dataOffset % sizeof(real_T));
1662
1663 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
1664 "Needed for possible padding determination. */
1665 dataOffset += (sizeof(real_T) - overhang);
1666 }
1667 for (i=0; i< nSignals; i++) {
1668 int_T nd = (numDims) ? numDims[i] : 1;
1669 dataLen += nd;
1670 }
1671 nbytes = dataOffset + dataLen*sizeof(real_T);
1672
1673 if ( (sig->dimensions = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
1674
1675 data = (real_T*) (((char_T*) (sig->dimensions)) + dataOffset);
1676
1677 for (i = 0; i < dataLen; i++) {
1678 data[i] = dims[i]; /* cannot memcpy double <- int */
1679 }
1680
1681 for (i = 0; i < nSignals; i++) {
1682 MatrixData *mtxData = &(sig->dimensions[i]);
1683 int_T nd = (numDims) ? numDims[i] : 1;
1684
1685 (void)memcpy(mtxData->name, &DIMENSION_FIELD_NAME, mxMAXNAM);
1686
1687 mtxData->nRows = 1;
1688 mtxData->nCols = nd;
1689
1690 mtxData->nDims = 1; /* assume */
1691 mtxData->dims = mtxData->_dims;
1692 mtxData->dims[0] = mtxData->nCols;
1693
1694 mtxData->re = data;
1695 mtxData->im = NULL;
1696 mtxData->dTypeID = dTypeId;
1697 mtxData->mxID = rt_GetMxIdFromDTypeId(dTypeId);
1698 mtxData->elSize = rt_GetSizeofDataType(dTypeId);
1699 mtxData->logical = 0U;
1700 mtxData->complex = 0U;
1701
1702 data += nd;
1703 }
1704 ++sig->numActiveFields;
1705 }
1706
1707 /* labels */
1708 if (labels != NULL) {
1709 unsigned short *data;
1710 size_t nbytes;
1711 int_T dataLen = 0;
1712 size_t dataOffset = nSignals * sizeof(MatrixData);
1713 uint_T overhang = (uint_T)(dataOffset % sizeof(short));
1714 int_T dataIdx = 0;
1715
1716 for (i=0;i<nSignals;i++) {
1717 if (labels[i] != NULL){
1718 dataLen = dataLen + (int_T)strlen(labels[i]);
1719 }
1720 }
1721
1722 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
1723 "Needed for possible padding determination. */
1724 dataOffset += (sizeof(short) - overhang);
1725 }
1726 nbytes = dataOffset + dataLen*sizeof(short);
1727
1728 if ( (sig->labels = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
1729
1730 data = (unsigned short*) (((char_T*) (sig->labels)) + dataOffset);
1731 for(sigIdx=0;sigIdx<nSignals;sigIdx++) {
1732 int_T labelLen = (labels[sigIdx]==NULL) ? 0 : (int_T)strlen(labels[sigIdx]);
1733 for (i = 0; i < labelLen; i++) {
1734 data[dataIdx++] = (uint8_T)labels[sigIdx][i];
1735 }
1736 }
1737
1738 for (i = 0; i < nSignals; i++) {
1739 MatrixData *mtxData = &(sig->labels[i]);
1740 int_T labelLen = (int_T)strlen(labels[i]);
1741
1742 (void)memcpy(mtxData->name, &LABEL_FIELD_NAME, mxMAXNAM);
1743 mtxData->nRows = (labelLen) ? 1 : 0;
1744 mtxData->nCols = labelLen;
1745
1746 mtxData->re = data;
1747 mtxData->im = NULL;
1748
1749 mtxData->nDims = 1; /* assume */
1750 mtxData->dims = mtxData->_dims;
1751 mtxData->dims[0] = mtxData->nCols;
1752
1753 mtxData->dTypeID = SS_INT16;
1754 mtxData->mxID = mxCHAR_CLASS;
1755 mtxData->elSize = sizeof(short);
1756 mtxData->logical = 0U;
1757 mtxData->complex = 0U;
1758
1759 data += labelLen;
1760 }
1761 ++sig->numActiveFields;
1762 }
1763
1764 /* plot styles */
1765 if (plotStyles != NULL) {
1766 real_T *data;
1767 size_t nbytes;
1768 int_T dataLen = 0;
1769 BuiltInDTypeId dTypeId = rt_GetActualDTypeID(SS_DOUBLE);
1770 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1771 size_t dataOffset = nSignals*sizeof(MatrixData);
1772 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1773 uint_T overhang = (uint_T)(dataOffset % sizeof(real_T));
1774
1775 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
1776 "Needed for possible padding determination. */
1777 dataOffset += (sizeof(real_T) - overhang);
1778 }
1779 for (i=0; i< nSignals; i++) {
1780 dataLen += numCols[i];
1781 }
1782 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1783 nbytes = dataOffset + dataLen*sizeof(real_T);
1784
1785 if ( (sig->plotStyles = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
1786
1787 /*LINTED E_BAD_PTR_CAST_ALIGN*/
1788 data = (real_T*) (((char_T*) (sig->plotStyles)) + dataOffset);
1789
1790 for (i = 0; i < dataLen; i++) {
1791 data[i] = plotStyles[i];
1792 }
1793
1794 dimsOffset = 0;
1795 for (i = 0; i < nSignals; i++) {
1796 MatrixData *mtxData = &(sig->plotStyles[i]);
1797
1798 (void)memcpy(mtxData->name, &PLOTSTYLE_FIELD_NAME, mxMAXNAM);
1799
1800 mtxData->nRows = (numCols[i]) ? 1 : 0;
1801 mtxData->nCols = numCols[i];
1802
1803 mtxData->nDims = numDims[i];
1804
1805 if(mtxData->nDims > 2) {
1806 if ((mtxData->dims = calloc(mtxData->nDims, sizeof(int_T))) == NULL) goto ERROR_EXIT;
1807 } else {
1808 mtxData->dims = mtxData->_dims;
1809 }
1810
1811 mtxData->dims[0] = *(dims + dimsOffset);
1812 if(mtxData->nDims >= 2) {
1813 int32_T j;
1814 for (j=1; j<mtxData->nDims; j++) {
1815 mtxData->dims[j] = *(dims + dimsOffset + j);
1816 }
1817 }
1818
1819 mtxData->re = data;
1820 mtxData->im = NULL;
1821 mtxData->dTypeID = dTypeId;
1822 mtxData->mxID = rt_GetMxIdFromDTypeId(dTypeId);
1823 mtxData->elSize = rt_GetSizeofDataType(dTypeId);
1824 mtxData->logical = 0U;
1825 mtxData->complex = 0U;
1826
1827 data += numCols[i];
1828 dimsOffset += numDims[i];
1829 }
1830 ++sig->numActiveFields;
1831 }
1832
1833 /* titles */
1834 if (titles != NULL) {
1835 unsigned short *data;
1836 size_t nbytes;
1837 int_T dataLen = (int_T)strlen(titles);
1838 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1839 size_t dataOffset = nSignals * sizeof(MatrixData);
1840 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1841 uint_T overhang = (uint_T)(dataOffset % sizeof(short));
1842
1843 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
1844 "Needed for possible padding determination. */
1845 dataOffset += (sizeof(short) - overhang);
1846 }
1847 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
1848 nbytes = dataOffset + dataLen*sizeof(short);
1849
1850 if ( (sig->titles = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
1851
1852 /*LINTED E_BAD_PTR_CAST_ALIGN*/
1853 data = (unsigned short*) (((char_T*) (sig->titles)) + dataOffset);
1854 for (i = 0; i < dataLen; i++) {
1855 data[i] = titles[i];
1856 }
1857
1858 for (i = 0; i < nSignals; i++) {
1859 MatrixData *mtxData = &(sig->titles[i]);
1860
1861 (void)memcpy(mtxData->name, &TITLE_FIELD_NAME, mxMAXNAM);
1862 if (titleLen) {
1863 mtxData->nRows = (titleLen[i]) ? 1 : 0;
1864 mtxData->nCols = titleLen[i];
1865 } else {
1866 mtxData->nRows = (dataLen) ? 1 : 0;
1867 mtxData->nCols = dataLen;
1868 }
1869
1870 mtxData->nDims = 1; /* assume */
1871 mtxData->dims = mtxData->_dims;
1872 mtxData->dims[0] = mtxData->nCols;
1873
1874 mtxData->re = data;
1875 mtxData->im = NULL;
1876 mtxData->dTypeID = SS_INT16;
1877 mtxData->mxID = mxCHAR_CLASS;
1878 mtxData->elSize = sizeof(short);
1879 mtxData->logical = 0U;
1880 mtxData->complex = 0U;
1881
1882 data += ((titleLen) ? titleLen[i] : dataLen);
1883 }
1884 ++sig->numActiveFields;
1885 }
1886
1887 /* block names */
1888 if (blockNames != NULL) {
1889 unsigned short *data;
1890 size_t nbytes;
1891 int_T dataLen = 0;
1892 size_t dataOffset = nSignals * sizeof(MatrixData);
1893 uint_T overhang = (uint_T)(dataOffset % sizeof(short));
1894 int_T dataIdx = 0;
1895
1896 for (i=0;i<nSignals;i++) {
1897 if (blockNames[i] != NULL) {
1898 dataLen = dataLen + (int_T)strlen(blockNames[i]);
1899 }
1900 }
1901
1902 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
1903 "Needed for possible padding determination. */
1904 dataOffset += (sizeof(short) - overhang);
1905 }
1906
1907 nbytes = dataOffset + dataLen*sizeof(short);
1908
1909 if ( (sig->blockNames = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
1910
1911 data = (unsigned short*) (((char_T*) (sig->blockNames)) + dataOffset);
1912
1913 for(sigIdx=0;sigIdx<nSignals;sigIdx++) {
1914 int_T nameLen = (blockNames[sigIdx]==NULL) ? 0 :
1915 (int_T)strlen(blockNames[sigIdx]);
1916 for (i = 0; i < nameLen; i++) {
1917 data[dataIdx++] = (uint8_T)blockNames[sigIdx][i];
1918 }
1919 }
1920
1921 for (i = 0; i < nSignals; i++) {
1922 MatrixData *mtxData = &(sig->blockNames[i]);
1923 int_T blockNameLen = (int_T)strlen(blockNames[i]);
1924
1925 (void)memcpy(mtxData->name, &BLOCKNAME_FIELD_NAME, mxMAXNAM);
1926 mtxData->nRows = (blockNameLen) ? 1 : 0;
1927 mtxData->nCols = blockNameLen;
1928
1929 mtxData->nDims = 1; /* assume */
1930 mtxData->dims = mtxData->_dims;
1931 mtxData->dims[0] = mtxData->nCols;
1932
1933 mtxData->re = data;
1934 mtxData->im = NULL;
1935 mtxData->dTypeID = SS_INT16;
1936 mtxData->mxID = mxCHAR_CLASS;
1937 mtxData->elSize = sizeof(short);
1938 mtxData->logical = 0U;
1939 mtxData->complex = 0U;
1940
1941 data += blockNameLen;
1942 }
1943 ++sig->numActiveFields;
1944 if(logValueDimensions){
1945 sig->fieldNames = rtGlobalLoggingSignalsStructFieldNames;
1946 }
1947 else{
1948 sig->fieldNames = rtGlobalLoggingSignalsStructFieldNames_noValDims;
1949 }
1950
1951 } else {
1952 if(logValueDimensions){
1953 sig->fieldNames = rtLocalLoggingSignalsStructFieldNames;
1954 }
1955 else{
1956 sig->fieldNames = rtLocalLoggingSignalsStructFieldNames_noValDims;
1957 }
1958
1959 }
1960
1961 /* state names */
1962 if (stateNames != NULL) {
1963 unsigned short *data;
1964 size_t nbytes;
1965 int_T dataLen = 0;
1966 size_t dataOffset = nSignals * sizeof(MatrixData);
1967 uint_T overhang = (uint_T)(dataOffset % sizeof(short));
1968 int_T dataIdx = 0;
1969
1970 for (i=0;i<nSignals;i++) {
1971 if (stateNames[i] != NULL) {
1972 dataLen = dataLen + (int_T)strlen(stateNames[i]);
1973 }
1974 }
1975
1976 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
1977 "Needed for possible padding determination. */
1978 dataOffset += (sizeof(short) - overhang);
1979 }
1980
1981 nbytes = dataOffset + dataLen*sizeof(short);
1982
1983 if ( (sig->stateNames = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
1984
1985 data = (unsigned short*) (((char_T*) (sig->stateNames)) + dataOffset);
1986
1987 for(sigIdx=0;sigIdx<nSignals;sigIdx++) {
1988 int_T nameLen = (stateNames[sigIdx]==NULL) ? 0 :
1989 (int_T)strlen(stateNames[sigIdx]);
1990 for (i = 0; i < nameLen; i++) {
1991 data[dataIdx++] = (uint8_T)stateNames[sigIdx][i];
1992 }
1993 }
1994
1995 for (i = 0; i < nSignals; i++) {
1996 MatrixData *mtxData = &(sig->stateNames[i]);
1997 int_T stateNameLen = (int_T)strlen(stateNames[i]);
1998
1999 (void)memcpy(mtxData->name, &STATENAME_FIELD_NAME, mxMAXNAM);
2000 mtxData->nRows = (stateNameLen) ? 1 : 0;
2001 mtxData->nCols = stateNameLen;
2002
2003 mtxData->nDims = 1; /* assume */
2004 mtxData->dims = mtxData->_dims;
2005 mtxData->dims[0] = mtxData->nCols;
2006
2007 mtxData->re = data;
2008 mtxData->im = NULL;
2009 mtxData->dTypeID = SS_INT16;
2010 mtxData->mxID = mxCHAR_CLASS;
2011 mtxData->elSize = sizeof(short);
2012 mtxData->logical = 0U;
2013 mtxData->complex = 0U;
2014
2015 data += stateNameLen;
2016 }
2017 ++sig->numActiveFields;
2018
2019 if(logValueDimensions){
2020 sig->fieldNames = rtGlobalLoggingSignalsStructFieldNames;
2021 }
2022 else{
2023 sig->fieldNames = rtGlobalLoggingSignalsStructFieldNames_noValDims;
2024 }
2025
2026 }
2027
2028 /* CrossMdlRef */
2029 if (crossMdlRef != NULL) {
2030 real_T *data;
2031 size_t nbytes;
2032 size_t dataOffset = nSignals * sizeof(MatrixData);
2033 uint_T overhang = (uint_T)(dataOffset % sizeof(real_T));
2034
2035 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
2036 "Needed for possible padding determination. */
2037 dataOffset += (sizeof(real_T) - overhang);
2038 }
2039
2040 nbytes = dataOffset + nSignals*sizeof(real_T);
2041
2042 if ( (sig->crossMdlRef = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
2043
2044 data = (real_T*) (((char_T*) (sig->crossMdlRef)) + dataOffset);
2045
2046 for(sigIdx=0;sigIdx<nSignals;sigIdx++) {
2047 data[sigIdx] = crossMdlRef[sigIdx];
2048 }
2049
2050 for (i = 0; i < nSignals; i++) {
2051 MatrixData *mtxData = &(sig->crossMdlRef[i]);
2052
2053 (void)memcpy(mtxData->name, &CROSS_MDL_REF_FIELD_NAME, mxMAXNAM);
2054 mtxData->nRows = 1;
2055 mtxData->nCols = 1;
2056 mtxData->nDims = 1; /* => matlab scalar */
2057
2058 mtxData->re = &data[i];
2059 mtxData->im = NULL;
2060 mtxData->dTypeID = SS_DOUBLE;
2061 mtxData->mxID = rt_GetMxIdFromDTypeId(SS_DOUBLE);
2062 mtxData->elSize = sizeof(real_T);
2063 mtxData->logical = matLOGICAL_BIT;
2064 mtxData->complex = 0U;
2065 mtxData->frameData = 0;
2066 mtxData->frameSize = 1;
2067 }
2068 ++sig->numActiveFields;
2069 }
2070
2071 return(NULL); /* NORMAL_EXIT */
2072
2073 ERROR_EXIT:
2074
2075 (void)fprintf(stderr, "*** Error creating signals structure "
2076 "in the struct log variable %s\n", var->name);
2077 if (*errStatus == NULL) {
2078 *errStatus = rtMemAllocError;
2079 }
2080 rt_DestroyLogVar(sig->values);
2081 FREE(sig->labels);
2082 FREE(sig->plotStyles);
2083 FREE(sig->dimensions);
2084 FREE(sig->titles);
2085 FREE(sig->blockNames);
2086 FREE(sig->stateNames);
2087 FREE(sig->crossMdlRef);
2088 return(*errStatus);
2089
2090} /* end rt_InitSignalsStruct */
2091
2092
2093/* Function: local_CreateStructLogVar ==========================================
2094 * Abstract:
2095 * Create a logging variable in the structure format.
2096 *
2097 * Returns:
2098 * ~= NULL => success, returns the log variable created.
2099 * == NULL => failure, error message set in the simstruct.
2100 */
2101static StructLogVar *local_CreateStructLogVar(
2102 RTWLogInfo *li,
2103 const real_T startTime,
2104 const real_T finalTime,
2105 const real_T inStepSize,
2106 const char_T **errStatus,
2107 const char_T *varName,
2108 boolean_T logTime,
2109 int_T maxRows,
2110 int_T decimation,
2111 real_T sampleTime,
2112 const RTWLogSignalInfo *sigInfo,
2113 const char_T *blockName)
2114{
2115 StructLogVar *var;
2116 LogInfo *logInfo = rtliGetLogInfo(li);
2117
2118 /* reset error status */
2119 *errStatus = NULL;
2120
2121 if ( (var = calloc(1, sizeof(StructLogVar))) == NULL ) goto ERROR_EXIT;
2122
2123 var->numActiveFields = 2;
2124
2125 /* Setup the structure name using varName and nameModifier */
2126 rt_LoadModifiedLogVarName(li,varName,var->name);
2127
2128 /* time field */
2129 if (logTime) {
2130 /* need to create a LogVar to log time */
2131 int_T dims = 1;
2132 var->time = rt_CreateLogVarWithConvert(li, startTime, finalTime,
2133 inStepSize, errStatus,
2134 &TIME_FIELD_NAME, SS_DOUBLE,
2135 NULL,
2136 0, 0, 0, 1,
2137 1, &dims, NO_LOGVALDIMS,
2138 NULL, NULL, maxRows,
2139 decimation, sampleTime, 0);
2140 if (var->time == NULL) goto ERROR_EXIT;
2141 } else {
2142 /* create a dummy MatrixData to write out time as an empty matrix */
2143 BuiltInDTypeId dt = rt_GetActualDTypeID(SS_DOUBLE);
2144 size_t nbytes = sizeof(MatrixData);
2145 MatrixData *time;
2146
2147 if ( (var->time = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
2148 time = var->time;
2149
2150 (void)memcpy(time->name, &TIME_FIELD_NAME, mxMAXNAM);
2151 time->nRows = 0;
2152 time->nCols = 0;
2153 time->nDims = 0;
2154 time->re = NULL;
2155 time->im = NULL;
2156 time->dTypeID = dt;
2157 time->mxID = rt_GetMxIdFromDTypeId(dt);
2158 time->elSize = rt_GetSizeofDataType(dt);
2159 time->logical = 0U;
2160 time->complex = 0U;
2161 }
2162 var->logTime = logTime;
2163
2164 /* signals field */
2165 if (sigInfo) {
2166 if (rt_InitSignalsStruct(li,startTime,finalTime,inStepSize,errStatus,
2167 var,maxRows,decimation,sampleTime,sigInfo)) {
2168 goto ERROR_EXIT;
2169 }
2170 }
2171
2172 /* blockName Field */
2173 if (blockName != NULL) {
2174 int_T dataLen = (int_T)strlen(blockName);
2175 size_t nbytes;
2176 size_t dataOffset = sizeof(MatrixData);
2177 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
2178 uint_T overhang = (uint_T)(dataOffset % sizeof(short));
2179
2180 if (overhang) { /* polyspace DEFECT:DEAD_CODE [Not a defect:Unset]
2181 "Needed for possible padding determination. */
2182 dataOffset += (sizeof(short) - overhang);
2183 }
2184 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
2185 nbytes = dataOffset + dataLen*sizeof(short);
2186
2187 if ( (var->blockName = calloc(nbytes, 1)) == NULL ) goto ERROR_EXIT;
2188
2189 (void)memcpy(var->blockName->name, &BLOCKNAME_FIELD_NAME, mxMAXNAM);
2190 var->blockName->nRows = (dataLen) ? 1 : 0;
2191 var->blockName->nCols = dataLen;
2192
2193 var->blockName->nDims = 1;
2194 var->blockName->dims = var->blockName->_dims;
2195 var->blockName->dims[0] = dataLen;
2196 {
2197 /*LINTED E_BAD_PTR_CAST_ALIGN*/
2198 unsigned short *data = (unsigned short*)(((char_T*) (var->blockName))+dataOffset);
2199 int_T i;
2200
2201 for (i=0; i<dataLen; i++) {
2202 data[i] = (uint8_T)blockName[i];
2203 }
2204 var->blockName->re = data;
2205 }
2206 var->blockName->im = NULL;
2207 var->blockName->dTypeID = SS_INT16;
2208 var->blockName->mxID = mxCHAR_CLASS;
2209 var->blockName->elSize = sizeof(short);
2210 var->blockName->logical = 0U;
2211 var->blockName->complex = 0U;
2212
2213 ++var->numActiveFields;
2214 }
2215
2216 /* Add this struct log var to the linked list in log info */
2217 {
2218 StructLogVar *list = logInfo->structLogVarsList;
2219
2220 if (list != NULL) {
2221 while (list->next != NULL) {
2222 list = list->next;
2223 }
2224 list->next = var;
2225 } else {
2226 logInfo->structLogVarsList = var;
2227 }
2228 }
2229
2230 return(var); /* NORMAL_EXIT */
2231
2232 ERROR_EXIT:
2233 (void)fprintf(stderr, "*** Error creating log variable %s\n", varName);
2234 if (*errStatus == NULL) {
2235 *errStatus = rtMemAllocError;
2236 }
2237 rt_DestroyStructLogVar(var);
2238 return(NULL);
2239
2240} /* end local_CreateStructLogVar */
2241
2242
2243/* Function: rt_StartDataLoggingForOutput ======================================
2244 * Abstract:
2245 */
2246static const char_T *rt_StartDataLoggingForOutput(RTWLogInfo *li,
2247 const real_T startTime,
2248 const real_T finalTime,
2249 const real_T stepSize,
2250 const char_T **errStatus)
2251{
2252 const char_T *varName;
2253 real_T sampleTime = stepSize;
2254 int_T maxRows = rtliGetLogMaxRows(li);
2255 int_T decimation = rtliGetLogDecimation(li);
2256 int_T logFormat = rtliGetLogFormat(li);
2257 boolean_T logTime = (logFormat==2) ? 1 : 0;
2258
2259 LogInfo * logInfo;
2260 logInfo = rtliGetLogInfo(li);
2261
2262 /* reset error status */
2263 *errStatus = NULL;
2264
2265 /* outputs */
2266 varName = rtliGetLogY(li);
2267 if (varName[0] != '\0') {
2268 int_T i;
2269 int_T ny;
2270 int_T yIdx;
2271 char_T name[mxMAXNAM];
2272 const char_T *cp = strchr(varName,',');
2273 LogSignalPtrsType ySigPtrs = rtliGetLogYSignalPtrs(li);
2274 const RTWLogSignalInfo *yInfo = rtliGetLogYSignalInfo(li);
2275
2276 /* count the number of variables (matrices or structures) to create */
2277 for (ny=1; cp != NULL; ny++) {
2278 cp = strchr(cp+1,',');
2279 }
2280 logInfo->ny = ny;
2281
2282 if (logFormat==0) {
2283 if ( (logInfo->y = calloc(ny,sizeof(LogVar*))) == NULL ) {
2284 *errStatus = rtMemAllocError;
2285 goto ERROR_EXIT;
2286 }
2287 } else {
2288 if ( (logInfo->y = calloc(ny,sizeof(StructLogVar*))) == NULL ) {
2289 *errStatus = rtMemAllocError;
2290 goto ERROR_EXIT;
2291 }
2292 }
2293
2294 for (i = yIdx = 0, cp = varName; i < ny; i++) {
2295 int_T len;
2296 const char_T *cp1 = strchr(cp+1,',');
2297
2298 if (cp1 != NULL) {
2299 /*LINTED E_ASSIGN_INT_TO_SMALL_INT*/
2300 len = (int_T)(cp1 - cp);
2301 if (len >= mxMAXNAM) len = mxMAXNAM - 1;
2302 } else {
2303 len = mxMAXNAM - 1;
2304 }
2305 (void)strncpy(name, cp, len);
2306 name[len] = '\0';
2307
2308 if (ny > 1 && ySigPtrs[i] == NULL) {
2309 goto NEXT_NAME;
2310 }
2311
2312 if (logFormat == 0) {
2313 int numCols;
2314 int nDims;
2315 const int *dims;
2316 BuiltInDTypeId dataType;
2317 int isComplex;
2318
2319 if (ny == 1) {
2320 int_T op;
2321
2322 numCols = yInfo[0].numCols[0];
2323 for (op = 1; op < yInfo[0].numSignals; op++) {
2324 numCols += yInfo[0].numCols[op];
2325 }
2326 /*
2327 * If we have only one "matrix" outport,
2328 * we can still log it as a matrix
2329 */
2330 if (yInfo[0].numSignals == 1) {
2331 nDims = yInfo[0].numDims ? yInfo[0].numDims[0] : 1;
2332 dims = yInfo[0].dims;
2333 } else {
2334 nDims = 1;
2335 dims = &numCols;
2336 }
2337
2338 dataType = yInfo[0].dataTypes[0];
2339 isComplex = yInfo[0].complexSignals[0];
2340 } else {
2341 numCols = yInfo[yIdx].numCols[0];
2342 nDims = yInfo[yIdx].numDims ? yInfo[yIdx].numDims[0] : 1;
2343 dims = yInfo[yIdx].dims;
2344 dataType = yInfo[yIdx].dataTypes[0];
2345 isComplex = yInfo[yIdx].complexSignals[0];
2346 }
2347
2348 logInfo->y[yIdx] = rt_CreateLogVarWithConvert(
2349 li, startTime, finalTime,
2350 stepSize, errStatus,
2351 name,
2352 dataType,
2353 yInfo[yIdx].dataTypeConvert,
2354 0,isComplex,
2355 0,numCols,nDims,dims,
2356 NO_LOGVALDIMS, NULL, NULL,
2357 maxRows,decimation,
2358 sampleTime,1);
2359 if (logInfo->y[yIdx] == NULL) goto ERROR_EXIT;
2360 } else {
2361 logInfo->y[yIdx] = local_CreateStructLogVar(li, startTime,
2362 finalTime, stepSize,
2363 errStatus, name,
2364 logTime, maxRows,
2365 decimation, sampleTime,
2366 &yInfo[yIdx], NULL);
2367 if (logInfo->y[yIdx] == NULL) goto ERROR_EXIT;
2368 }
2369 ++yIdx;
2370 NEXT_NAME:
2371 cp = cp1;
2372 if (cp != NULL && *cp == ',') cp++;
2373 }
2374 }
2375
2376 return(NULL); /* NORMAL_EXIT */
2377
2378 ERROR_EXIT:
2379 (void)fprintf(stderr, "*** Errors occurred when starting data logging.\n");
2380 if (*errStatus == NULL) {
2381 *errStatus = rtMemAllocError;
2382 }
2383 if (logInfo) { /* polyspace DEFECT:USELESS_IF [No action planned:Unset]
2384 "Defense coding." */
2385 rt_DestroyLogVar(logInfo->logVarsList);
2386 logInfo->logVarsList = NULL;
2387 rt_DestroyStructLogVar(logInfo->structLogVarsList);
2388 logInfo->structLogVarsList = NULL;
2389 FREE(logInfo->y);
2390 logInfo->y = NULL;
2391 }
2392 return(*errStatus);
2393
2394} /* end rt_StartDataLoggingForOutput */
2395
2396
2397/* Function: rt_ReallocLogVar ==================================================
2398 * Abstract:
2399 * Allocate more memory for the data buffers in the log variable.
2400 * Exit if unable to allocate more memory.
2401 */
2402static void rt_ReallocLogVar(LogVar *var, boolean_T isVarDims)
2403{
2404 void *tmp;
2405 int_T nCols = var->data.nCols;
2406 int_T nRows;
2407 size_t elSize = var->data.elSize;
2408
2409 if (isVarDims)
2410 {
2411 nRows = var->data.nRows + DEFAULT_BUFFER_SIZE;
2412 }
2413 else
2414 {
2415 nRows = var->data.nRows == 0 ? 1 : 2*var->data.nRows;
2416 }
2417
2418 tmp = realloc(var->data.re, nRows*nCols*elSize);
2419 if (tmp == NULL) {
2420 (void)fprintf(stderr,
2421 "*** Memory allocation error.\n");
2422 (void)fprintf(stderr, ""
2423 " varName = %s%s\n"
2424 " nRows = %d\n"
2425 " nCols = %d\n"
2426 " elementSize = %lu\n"
2427 " Current Size = %.16g\n"
2428 " Failed resize = %.16g\n\n",
2429 var->data.name,
2430 var->data.complex ? " (real part)" : "",
2431 var->data.nRows,
2432 var->data.nCols,
2433 (unsigned long) var->data.elSize,
2434 (double)nRows*nCols*elSize,
2435 (double)(nRows+DEFAULT_BUFFER_SIZE)*nCols*elSize);
2436 exit(1);
2437 }
2438 var->data.re = tmp;
2439
2440 if (var->data.complex) {
2441 tmp = realloc(var->data.im, nRows*nCols*elSize);
2442 if (tmp == NULL) {
2443 (void)fprintf(stderr,
2444 "*** Memory allocation error.\n");
2445 (void)fprintf(stderr, ""
2446 " varName = %s (complex part)\n"
2447 " nRows = %d\n"
2448 " nCols = %d\n"
2449 " elementSize = %lu\n"
2450 " Current Size = %.16g\n"
2451 " Failed resize = %.16g\n\n",
2452 var->data.name,
2453 var->data.nRows,
2454 var->data.nCols,
2455 (unsigned long) var->data.elSize,
2456 (double)nRows*nCols*elSize,
2457 (double)(nRows+DEFAULT_BUFFER_SIZE)*nCols*elSize);
2458 exit(1);
2459 }
2460 var->data.im = tmp;
2461 }
2462 var->data.nRows = nRows;
2463
2464 /* Also reallocate memory for "valueDimensions"
2465 when logging the variable-size signal
2466 */
2467 if(isVarDims){
2468 int_T k;
2469
2470 nCols = var->valDims->nCols;
2471 nRows = var->valDims->nRows + DEFAULT_BUFFER_SIZE;
2472 elSize = sizeof(real_T);
2473 tmp = realloc(var->valDims->dimsData, nRows*nCols*elSize);
2474 if (tmp == NULL) {
2475 (void)fprintf(stderr,
2476 "*** Memory allocation error.\n");
2477 (void)fprintf(stderr, ""
2478 " varName = %s\n"
2479 " nRows = %d\n"
2480 " nCols = %d\n"
2481 " elementSize = %lu\n"
2482 " Current Size = %.16g\n"
2483 " Failed resize = %.16g\n\n",
2484 var->valDims->name,
2485 var->valDims->nRows,
2486 var->valDims->nCols,
2487 (unsigned long) elSize,
2488 (double)nRows*nCols*elSize,
2489 (double)(nRows+DEFAULT_BUFFER_SIZE)*nCols*elSize);
2490 exit(1);
2491 }
2492
2493 /*
2494 * valueDimensions data is stored in array format and must be
2495 * adjusted after reallocation (see also rt_FixupLogVar())
2496 *
2497 * Example: maxRows = 4; nRows = 4; nDims = 3;
2498 * Before realloc of the logVar, the locations of data are as below:
2499 * (x, y, z -- useful data / o -- junk, don't care)
2500 * a[0] = x a[4] = y a[8] = z
2501 * a[1] = x a[5] = y a[9] = z
2502 * a[2] = x a[6] = y a[10]= z
2503 * a[3] = x a[7] = y a[11]= z
2504 *
2505 * After realloc of the logVar (suppose 2 extra rows are added),
2506 * the locations of data are as below:
2507 * a[0] = x a[6] = y a[12]= o
2508 * a[1] = x a[7] = y a[13]= o
2509 * a[2] = x a[8] = z a[14]= o
2510 * a[3] = x a[9] = z a[15]= o
2511 * a[4] = y a[10]= z a[16]= o
2512 * a[5] = y a[11]= z a[17]= o
2513 *
2514 * The data must be adjusted as below:
2515 * a[0] = x a[6] = y a[12]= z
2516 * a[1] = x a[7] = y a[13]= z
2517 * a[2] = x a[8] = y a[14]= z
2518 * a[3] = x a[9] = y a[15]= z
2519 * a[4] = o a[10]= o a[16]= o
2520 * a[5] = o a[11]= o a[17]= o
2521 */
2522 for(k = var->data.nDims-1; k > 0; k--){
2523 (void) memcpy((real_T*)tmp + k*nRows,
2524 (real_T*)tmp + k*var->valDims->nRows,
2525 elSize * var->valDims->nRows);
2526 }
2527
2528 var->valDims->dimsData = tmp;
2529 var->valDims->nRows = nRows;
2530 }
2531
2532} /* end rt_ReallocLogVar */
2533
2534const char_T *rt_UpdateLogVarWithDiscontiguousData(LogVar *var,
2535 int8_T** data,
2536 const int_T *segmentLengths,
2537 int_T nSegments,
2538 RTWPreprocessingFcnPtr *preprocessingPtrs);
2539
2540/* Function: rt_UpdateLogVarWithDiscontinuousData ==============================
2541 * Abstract:
2542 * Log one row of the LogVar with data that is not contiguous.
2543 */
2544const char_T *rt_UpdateLogVarWithDiscontiguousData(LogVar *var,
2545 int8_T** data,
2546 const int_T *segmentLengths,
2547 int_T nSegments,
2548 RTWPreprocessingFcnPtr *preprocessingPtrs)
2549{
2550 size_t elSize = 0;
2551 size_t offset = 0;
2552 int segIdx = 0;
2553
2554 if (++var->numHits % var->decimation) return(NULL);
2555 var->numHits = 0;
2556
2557 /*
2558 * Reallocate or wrap the LogVar
2559 */
2560 if (var->rowIdx == var->data.nRows) {
2561 if (var->okayToRealloc == 1) {
2562 rt_ReallocLogVar(var, false);
2563 } else {
2564 /* Circular buffer */
2565 var->rowIdx = 0;
2566 ++(var->wrapped); /* increment the wrap around counter */
2567 }
2568 }
2569
2570 /* This function is only used to log states, there's no var-dims issue. */
2571 elSize = var->data.elSize;
2572 offset = (size_t)(elSize * var->rowIdx * var->data.nCols);
2573
2574 if (var->data.complex) {
2575 char_T *dstRe = (char_T*)(var->data.re) + offset;
2576 char_T *dstIm = (char_T*)(var->data.im) + offset;
2577
2578 for (segIdx = 0; segIdx < nSegments; segIdx++) {
2579 int_T nEl = segmentLengths[segIdx];
2580 char_T *src = (char_T *)data[segIdx];
2581 int_T el;
2582
2583 /* preprocess data in-place before logging */
2584 RTWPreprocessingFcnPtr preprocessingPtr = preprocessingPtrs[segIdx];
2585 if (preprocessingPtr != NULL) {
2586 src = malloc(elSize * nEl * 2);
2587 preprocessingPtr(src, (void *)data[segIdx]);
2588 }
2589
2590 if (src == NULL) {
2591 const char_T *errorMessage = "Could not allocate memory for logging.";
2592 fprintf(stderr,"%s.\n", errorMessage);
2593 return(errorMessage);
2594 }
2595 else {
2596 for (el = 0; el < nEl; el++) {
2597 (void)memcpy(dstRe, src, elSize);
2598 dstRe += elSize; src += elSize;
2599 (void)memcpy(dstIm, src, elSize);
2600 dstIm += elSize; src += elSize;
2601 }
2602 }
2603
2604 /* free temporarily declared data */
2605 if (preprocessingPtr != NULL) {
2606 free( src );
2607 }
2608 }
2609 } else {
2610 char_T *dst = (char_T*)(var->data.re) + offset;
2611
2612 for (segIdx = 0; segIdx < nSegments; segIdx++) {
2613 size_t segSize = elSize*segmentLengths[segIdx];
2614 char_T *src = (void *) data[segIdx];
2615
2616 /* preprocess data in-place before logging */
2617 RTWPreprocessingFcnPtr preprocessingPtr = preprocessingPtrs[segIdx];
2618 if (preprocessingPtr != NULL) {
2619 src = malloc(segSize);
2620 preprocessingPtr(src, data[segIdx]);
2621 }
2622 if (src == NULL) {
2623 const char_T *errorMessage = "Could not allocate memory for logging.";
2624 fprintf(stderr,"%s.\n", errorMessage);
2625 return(errorMessage); }
2626 else {
2627 (void)memcpy(dst, src, segSize);
2628 dst += segSize;
2629 }
2630
2631 /* free temporarily declared data */
2632 if (preprocessingPtr != NULL) {
2633 free( src );
2634 }
2635 }
2636 }
2637
2638 ++var->rowIdx;
2639 return(NULL);
2640
2641} /* end rt_UpdateLogVarWithDiscontinuousData */
2642
2643
2644/*==================*
2645 * Visible routines *
2646 *==================*/
2647
2648
2649
2650#ifdef __cplusplus
2651extern "C" {
2652#endif
2653
2654
2655/* Function: rt_CreateLogVarWithConvert ========================================
2656 * Abstract:
2657 * Create a logging variable.
2658 *
2659 * Returns:
2660 * ~= NULL => success, returns the log variable created.
2661 * == NULL => failure, error message set in the simstruct.
2662 */
2663LogVar *rt_CreateLogVarWithConvert(
2664 RTWLogInfo *li,
2665 const real_T startTime,
2666 const real_T finalTime,
2667 const real_T inStepSize,
2668 const char_T **errStatus,
2669 const char_T *varName,
2670 BuiltInDTypeId inpDataTypeID,
2671 const RTWLogDataTypeConvert *pDataTypeConvertInfo,
2672 int_T logical,
2673 int_T complex,
2674 int_T frameData,
2675 int_T nCols,
2676 int_T nDims,
2677 const int_T *dims,
2678 LogValDimsStat logValDimsStat,
2679 void **currSigDims,
2680 int_T *currSigDimsSize,
2681 int_T maxRows,
2682 int_T decimation,
2683 real_T sampleTime,
2684 int_T appendToLogVarsList)
2685{
2686 int_T usingDefaultBufSize = 0;
2687#ifdef NO_LOGGING_REALLOC
2688 int_T okayToRealloc = 0;
2689#else
2690 int_T okayToRealloc = 1;
2691#endif
2692 LogVar *var = NULL;
2693 /*inpDataTypeID is the rt_LoggedOutputDataTypeId*/
2694 BuiltInDTypeId dTypeID = (BuiltInDTypeId)inpDataTypeID;
2695 size_t elementSize = rt_GetSizeofDataType(dTypeID);
2696 int_T frameSize;
2697 int_T nRows;
2698 int_T nColumns;
2699
2700 /*===================================================================*
2701 * Determine the frame size if the data is frame based *
2702 *===================================================================*/
2703 frameSize = frameData ? dims[0] : 1;
2704
2705 /*===================================================================*
2706 * Calculate maximum number of rows needed in the buffer *
2707 *===================================================================*/
2708
2709 if (finalTime > startTime && finalTime != rtInf) {
2710 real_T nPoints; /* Tfinal is finite ===> nRows can be */
2711 real_T stepSize; /* computed since the StepSize is fixed */
2712
2713 if (sampleTime == -2.0) { /* The signal being logged is constant, *
2714 * Hence, only one data point is logged. */
2715 stepSize = finalTime;
2716 } else if (sampleTime == -1.0 || sampleTime == 0.0) {
2717 /* Signal being logged is either inside a *
2718 * triggered sub-system or it is continuous. */
2719 stepSize = inStepSize;
2720 } else { /* Discrete signal */
2721 stepSize = sampleTime;
2722 }
2723
2724 if (stepSize == 0.0) {
2725 /* small initial value, so as to exercise the realloc code */
2726 nRows = maxRows+1;
2727 okayToRealloc = 1;
2728 } else {
2729 nPoints = 1.0 + floor((finalTime-startTime)/stepSize);
2730
2731 /*
2732 * Add one more data point if needed.
2733 */
2734 if ( stepSize*(nPoints-1.0) < (finalTime-startTime) ) {
2735 nPoints += 1.0;
2736 }
2737
2738 /*
2739 * Actual number of points to log = nPoints * size of
2740 * each frame if data is frame-based
2741 */
2742 nPoints = frameData ? (nPoints * frameSize) : nPoints;
2743
2744 nPoints /= decimation;
2745 if (nPoints != floor(nPoints)) {
2746 nPoints += 1.0;
2747 }
2748 nRows = (nPoints <= INT_MAX) ? ((int_T) nPoints) : INT_MAX;
2749 }
2750 /*
2751 * If maxRows is specified, and if this number is less
2752 * than the number we computed (nRows) then use maxRows.
2753 */
2754 if ((maxRows > 0) && (maxRows < nRows)) {
2755 nRows = maxRows;
2756 okayToRealloc = 0;
2757 }
2758 } else if (finalTime == startTime) {
2759 /*
2760 * Number of rows to log is equal to 1 if not frame-based and
2761 * equal to frame size if frame-based
2762 */
2763 nRows = frameData ? frameSize : 1;
2764
2765 /*
2766 * If maxRows is specified, and if this number is less
2767 * than the number we computed (nRows) then use maxRows.
2768 */
2769 if ((maxRows > 0) && (maxRows < nRows)) {
2770 nRows = maxRows;
2771 okayToRealloc = 0;
2772 }
2773 } else if (maxRows > 0) { /* maxRows is specified => nRows=maxRows */
2774 nRows = maxRows;
2775 okayToRealloc = 0;
2776 } else {
2777
2778 if (inStepSize == 0) {
2779 /* small initial value, so as to exercise the realloc code */
2780 nRows = maxRows+1;
2781 okayToRealloc = 1;
2782 } else { /* Use a default value for nRows */
2783 usingDefaultBufSize = 1;
2784 nRows = DEFAULT_BUFFER_SIZE;
2785 okayToRealloc = 0; /* No realloc with infinite stop time */
2786 (void)fprintf(stdout, "*** Using a default buffer of size %d for "
2787 "logging variable %s\n", nRows, varName);
2788 }
2789 }
2790
2791 /*
2792 * Figure out the number of columns that the log variable should have.
2793 * If the data is not frame based, then number of columns should equal
2794 * nCols that is provided as input to the function. If the data is
2795 * frame-based, then the number of columns should be equal to the
2796 * number of channels = nCols/frameSize = dims[1];
2797 */
2798 nColumns = frameData ? dims[1] : nCols;
2799
2800 /*
2801 * Error out if the size of the circular buffer is absurdly large, this
2802 * error message is more informative than the one we get when we try to
2803 * malloc this many number of bytes in one fell swoop.
2804 */
2805 {
2806 double tmpDbl = ((double)elementSize)*((double)nRows)*
2807 ((double)nColumns);
2808
2809 if (tmpDbl >= UINT_MAX) {
2810 (void)fprintf(stderr,
2811 "\n*** Memory required to log variable '%s' is too"
2812 "\n big. Use the 'Limit rows to last:' and (or)"
2813 "\n 'Decimation:' options to reduce the required"
2814 "\n memory size.\n", varName);
2815 (void)fprintf(stderr, "*** Details:\n"
2816 " varName = %s\n"
2817 " nRows = %d\n"
2818 " nCols = %d\n"
2819 " elementSize = %lu\n"
2820 " Bytes Required = %.16g\n\n",
2821 varName, nRows, nColumns, (unsigned long)
2822 elementSize, tmpDbl);
2823 goto ERROR_EXIT;
2824 }
2825 }
2826
2827 /* Allocate memory for the log variable */
2828 if ( (var = calloc(1, sizeof(LogVar))) == NULL ) {
2829 (void)fprintf(stderr, "*** Error allocating memory for logging %s\n",
2830 varName);
2831 goto ERROR_EXIT;
2832 }
2833
2834 /* Allocate memory for the circular buffer (real part) */
2835 if ( (var->data.re = malloc(nRows*nColumns*elementSize)) == NULL ) {
2836 (void)fprintf(stderr,
2837 "*** Error allocating memory for the circular buffer\n");
2838 (void)fprintf(stderr, "*** Details:\n"
2839 " varName = %s\n"
2840 " nRows = %d\n"
2841 " nCols = %d\n"
2842 " elementSize = %lu\n"
2843 " Bytes Requested = %.16g\n\n",
2844 varName, nRows, nColumns, (unsigned long) elementSize,
2845 ((double)elementSize)*((double)nRows)*((double)nColumns));
2846 goto ERROR_EXIT;
2847 }
2848
2849 /* Allocate memory for the circular buffer for the imaginary part */
2850 if (complex) {
2851 if ( (var->data.im = malloc(nRows*nColumns*elementSize)) == NULL ) {
2852 (void)fprintf(stderr,
2853 "*** Error allocating memory for the circular buffer "
2854 "for logging the imaginary part of %s\n", varName);
2855 (void)fprintf(stderr, "*** Details:\n"
2856 " varName = %s\n"
2857 " nRows = %d\n"
2858 " nCols = %d\n"
2859 " elementSize = %lu\n"
2860 " Bytes Requested = %.16g\n\n",
2861 varName, nRows, nColumns, (unsigned long) elementSize,
2862 ((double)elementSize)*((double)nRows)*
2863 ((double)nColumns));
2864 goto ERROR_EXIT;
2865 }
2866 }
2867 /*
2868 * Initialize the fields in LogVar structure.
2869 */
2870 if (appendToLogVarsList) {
2871 rt_LoadModifiedLogVarName(li,varName,var->data.name);
2872 } else {
2873 var->data.name[mxMAXNAM-1] = '\0';
2874 (void)strncpy(var->data.name,varName,mxMAXNAM-1);
2875 }
2876 var->data.nCols = nColumns;
2877 var->data.nRows = nRows;
2878
2879 var->data.nDims = frameData ? 1 : nDims;
2880 if (var->data.nDims > 2) {
2881 var->data.dims = (int_T*)malloc(sizeof(int_T)*var->data.nDims);
2882 } else {
2883 var->data.dims = var->data._dims;
2884 }
2885 if (frameData) {
2886 var->data.dims[0] = nColumns;
2887 } else {
2888 /*LINTED E_CAST_INT_TO_SMALL_INT*/
2889 (void)memcpy(var->data.dims, dims, (size_t)(nDims*sizeof(int_T)));
2890 }
2891
2892 var->data.dTypeID = dTypeID;
2893 var->data.elSize = elementSize;
2894
2895 var->data.dataTypeConvertInfo = rt_GetDataTypeConvertInfo(
2896 pDataTypeConvertInfo, dTypeID);
2897
2898 var->data.mxID = rt_GetMxIdFromDTypeId(dTypeID);
2899 /* over-ride logical bit if data type is boolean */
2900 logical = dTypeID == SS_BOOLEAN ? 1 : 0;
2901 var->data.logical = (logical) ? matLOGICAL_BIT : 0x0;
2902 var->data.complex = (complex) ? matCOMPLEX_BIT : 0x0;
2903 var->data.frameData = frameData;
2904 var->data.frameSize = (frameData) ? frameSize : 1;
2905
2906 /* fill up valDims field */
2907 if(logValDimsStat == NO_LOGVALDIMS){
2908 /* All signals are fixed-size, no need to log valueDimensions field */
2909 var->valDims = NULL;
2910 /* Set these pointers to NULLs in this case */
2911 var->coords = NULL;
2912 var->strides = NULL;
2913 var->currStrides = NULL;
2914 }
2915 else{
2916 if ( (var->valDims = calloc(1, sizeof(ValDimsData))) == NULL ) {
2917 goto ERROR_EXIT;
2918 }
2919
2920 (void)memcpy(var->valDims->name, &VALUEDIMENSIONS_FIELD_NAME, mxMAXNAM);
2921
2922 if (logValDimsStat == LOGVALDIMS_EMPTYMX) {
2923 /* At least one signal is variable-size,
2924 but the current signal is fixed-size.
2925 Therefore, create a dummy MatrixData to write out valueDimensions
2926 as an empty matrix.
2927 */
2928 var->valDims->nRows = 0;
2929 var->valDims->nCols = 0;
2930 var->valDims->currSigDims = NULL;
2931 var->valDims->currSigDimsSize = NULL;
2932 var->valDims->dimsData = NULL;
2933 /* Set these pointers to NULLs in this case */
2934 var->coords = NULL;
2935 var->strides = NULL;
2936 var->currStrides = NULL;
2937 } else { /* The current signal is a variable-size signal. */
2938 /* The "valueDimensions" must be double, so re-assign element size */
2939 elementSize = sizeof(real_T);
2940
2941 /* When signals are frame-based, 'valueDimensions' has 1 column */
2942 if(frameData){
2943 /* When signal is frame-based, the first dimension is always fixed,
2944 so we only need to record the second dimension.
2945 e.g. Two frame-based signals [10x4] and [10x3],
2946 'valueDimensions' and 'currSigDims'
2947 only record 4 or 3.
2948 */
2949 nColumns = 1;
2950 var->valDims->currSigDims = (void**) (currSigDims + 1);
2951 var->valDims->currSigDimsSize = (int_T*) (currSigDimsSize + 1);
2952 } else { /* non-frame based */
2953 nColumns = nDims;
2954 var->valDims->currSigDims = (void**) currSigDims;
2955 var->valDims->currSigDimsSize = (int_T*) currSigDimsSize;
2956 }
2957
2958 /* Allocate memory for the circular buffer */
2959 if ( (var->valDims->dimsData = malloc(nRows*nColumns*elementSize)) == NULL ) {
2960 (void)fprintf(stderr,
2961 "*** Error allocating memory for the circular buffer\n");
2962 (void)fprintf(stderr, "*** Details:\n"
2963 " varName = %s\n"
2964 " nRows = %d\n"
2965 " nCols = %d\n"
2966 " elementSize = %lu\n"
2967 " Bytes Requested = %.16g\n\n",
2968 var->valDims->name, nRows, nColumns, (unsigned long) elementSize,
2969 ((double)elementSize)*((double)nRows)*((double)nColumns));
2970 goto ERROR_EXIT;
2971 }
2972 var->valDims->nRows = nRows;
2973 var->valDims->nCols = nColumns;
2974
2975 /* Allocate memory for these dynamic arrays */
2976 {
2977 size_t nbytes = var->data.nDims*sizeof(int_T);
2978 if( ((var->coords = calloc(nbytes, 1)) == NULL)
2979 ||((var->strides = calloc(nbytes, 1)) == NULL)
2980 ||((var->currStrides = calloc(nbytes, 1)) == NULL) )
2981 goto ERROR_EXIT;
2982 }
2983 }
2984 }
2985
2986 var->rowIdx = 0;
2987 var->wrapped = 0;
2988 var->nDataPoints = 0;
2989 var->usingDefaultBufSize = usingDefaultBufSize;
2990 var->okayToRealloc = okayToRealloc;
2991 var->decimation = decimation;
2992 var->numHits = -1; /* so first point gets logged */
2993
2994 /* Add this log var to list in log info, if necessary */
2995 if (appendToLogVarsList) {
2996 LogInfo *logInfo = (LogInfo*) rtliGetLogInfo(li);
2997 LogVar *varList = logInfo->logVarsList;
2998
2999 if (varList != NULL) {
3000 while (varList->next != NULL) {
3001 varList = varList->next;
3002 }
3003 varList->next = var;
3004 } else {
3005 logInfo->logVarsList = var;
3006 }
3007 }
3008
3009 return(var); /* NORMAL_EXIT */
3010
3011 ERROR_EXIT:
3012
3013 *errStatus = rtMemAllocError;
3014 rt_DestroyLogVar(var);
3015 return(NULL);
3016
3017} /* end rt_CreateLogVarWithConvert */
3018
3019
3020#ifdef __cplusplus
3021}
3022#endif
3023
3024
3025
3026
3027#ifdef __cplusplus
3028extern "C" {
3029#endif
3030
3031
3032/* Function: rt_CreateLogVar ===================================================
3033 * Abstract:
3034 * Create a logging variable.
3035 *
3036 * Returns:
3037 * ~= NULL => success, returns the log variable created.
3038 * == NULL => failure, error message set in the simstruct.
3039 */
3040LogVar *rt_CreateLogVar(RTWLogInfo *li,
3041 const real_T startTime,
3042 const real_T finalTime,
3043 const real_T inStepSize,
3044 const char_T **errStatus,
3045 const char_T *varName,
3046 BuiltInDTypeId inpDataTypeID,
3047 int_T logical,
3048 int_T complex,
3049 int_T frameData,
3050 int_T nCols,
3051 int_T nDims,
3052 const int_T *dims,
3053 LogValDimsStat logValDimsStat,
3054 void **currSigDims,
3055 int_T *currSigDimsSize,
3056 int_T maxRows,
3057 int_T decimation,
3058 real_T sampleTime,
3059 int_T appendToLogVarsList)
3060{
3061 const RTWLogDataTypeConvert *pDataTypeConvertInfo = NULL;
3062
3063 return rt_CreateLogVarWithConvert(li,
3064 startTime,
3065 finalTime,
3066 inStepSize,
3067 errStatus,
3068 varName,
3069 inpDataTypeID,
3070 pDataTypeConvertInfo,
3071 logical,
3072 complex,
3073 frameData,
3074 nCols,
3075 nDims,
3076 dims,
3077 logValDimsStat,
3078 currSigDims,
3079 currSigDimsSize,
3080 maxRows,
3081 decimation,
3082 sampleTime,
3083 appendToLogVarsList);
3084
3085} /* end rt_CreateLogVar */
3086
3087
3088#ifdef __cplusplus
3089}
3090#endif
3091
3092
3093
3094
3095#ifdef __cplusplus
3096extern "C" {
3097#endif
3098
3099
3100/* Function: rt_CreateStructLogVar =============================================
3101 * Abstract:
3102 * Create a logging variable in the structure format.
3103 *
3104 * Returns:
3105 * ~= NULL => success, returns the log variable created.
3106 * == NULL => failure, error message set in the simstruct.
3107 */
3108StructLogVar *rt_CreateStructLogVar(RTWLogInfo *li,
3109 const real_T startTime,
3110 const real_T finalTime,
3111 const real_T inStepSize,
3112 const char_T **errStatus,
3113 const char_T *varName,
3114 boolean_T logTime,
3115 int_T maxRows,
3116 int_T decimation,
3117 real_T sampleTime,
3118 const RTWLogSignalInfo *sigInfo,
3119 const char_T *blockName)
3120{
3121
3122 return( local_CreateStructLogVar(li,
3123 startTime,
3124 finalTime,
3125 inStepSize,
3126 errStatus,
3127 varName,
3128 logTime,
3129 maxRows,
3130 decimation,
3131 sampleTime,
3132 sigInfo,
3133 blockName));
3134
3135} /* end rt_CreateStructLogVar */
3136
3137
3138#ifdef __cplusplus
3139}
3140#endif
3141
3142
3143
3144
3145#ifdef __cplusplus
3146extern "C" {
3147#endif
3148
3149
3150/* Function: rt_StartDataLoggingWithStartTime ==================================
3151 * Abstract:
3152 * Initialize data logging info based upon the following settings cached
3153 * in the RTWLogging data structure of the SimStruct.
3154 *
3155 * Return value is:
3156 * == NULL => success
3157 * != NULL => failure (the return value is a pointer that points to the
3158 * error message, which is also set in the simstruct)
3159 */
3160const char_T *rt_StartDataLoggingWithStartTime(RTWLogInfo *li,
3161 const real_T startTime,
3162 const real_T finalTime,
3163 const real_T stepSize,
3164 const char_T **errStatus)
3165{
3166 const char_T *varName;
3167 LogInfo *logInfo;
3168 real_T sampleTime = stepSize;
3169 int_T maxRows = rtliGetLogMaxRows(li);
3170 int_T decimation = rtliGetLogDecimation(li);
3171 int_T logFormat = rtliGetLogFormat(li);
3172 boolean_T logTime = (logFormat==2) ? 1 : 0;
3173
3174 /* reset error status */
3175 *errStatus = NULL;
3176
3177 if ((logInfo=calloc(1,sizeof(LogInfo))) == NULL) {
3178 *errStatus = rtMemAllocError;
3179 goto ERROR_EXIT;
3180 }
3181 rtliSetLogInfo(li, (void*)logInfo);
3182
3183 /* time */
3184 varName = rtliGetLogT(li);
3185 if (varName[0] != '\0') {
3186 int_T dims = 1;
3187 logInfo->t = rt_CreateLogVarWithConvert(li, startTime, finalTime,
3188 stepSize, errStatus,
3189 varName,SS_DOUBLE,
3190 NULL,
3191 0,0,0,1,1,
3192 &dims, NO_LOGVALDIMS, NULL, NULL,
3193 maxRows,decimation,
3194 sampleTime,1);
3195 if (logInfo->t == NULL) goto ERROR_EXIT;
3196 }
3197
3198 /* states */
3199 if ( rtliGetLogX(li)[0] != '\0' || rtliGetLogXFinal(li)[0] != '\0' ) {
3200 const RTWLogSignalInfo *xInfo = rtliGetLogXSignalInfo(li);
3201
3202 if (logFormat == 0) { /* Matrix Format */
3203 int numCols;
3204 int nDims;
3205 const int *dims;
3206 BuiltInDTypeId dataType;
3207 int isComplex;
3208 int_T sIdx;
3209
3210 const RTWLogDataTypeConvert *pDTConvInfo;
3211
3212 numCols = xInfo[0].numCols ? xInfo[0].numCols[0] : 0;
3213 for (sIdx = 1; sIdx < xInfo[0].numSignals; sIdx++) {
3214 numCols += xInfo[0].numCols[sIdx];
3215 }
3216 /* If we have only one "matrix" state, we can log as a matrix */
3217 if (xInfo[0].numSignals == 1) {
3218 nDims = xInfo[0].numDims ? xInfo[0].numDims[0] : 1;
3219 dims = xInfo[0].dims;
3220 } else {
3221 nDims = 1;
3222 dims = &numCols;
3223 }
3224 dataType = xInfo[0].dataTypes ? xInfo[0].dataTypes[0] : 0;
3225 isComplex = xInfo[0].complexSignals ? xInfo[0].complexSignals[0] : 0;
3226
3227 pDTConvInfo = xInfo[0].dataTypeConvert;
3228
3229 if (rtliGetLogX(li)[0] != '\0') {
3230 logInfo->x = rt_CreateLogVarWithConvert(li, startTime, finalTime,
3231 stepSize, errStatus,
3232 rtliGetLogX(li),dataType,
3233 pDTConvInfo,
3234 0,
3235 isComplex,0,numCols,nDims,dims,
3236 NO_LOGVALDIMS, NULL, NULL,
3237 maxRows,decimation,sampleTime,1);
3238 if (logInfo->x == NULL) goto ERROR_EXIT;
3239 }
3240 if (rtliGetLogXFinal(li)[0] != '\0') {
3241 logInfo->xFinal = rt_CreateLogVarWithConvert(li, startTime, finalTime,
3242 stepSize, errStatus,
3243 rtliGetLogXFinal(li),dataType,
3244 pDTConvInfo,
3245 0,isComplex,0,numCols,nDims,
3246 dims, NO_LOGVALDIMS, NULL,
3247 NULL, 1,decimation,
3248 sampleTime,1);
3249 if (logInfo->xFinal == NULL) goto ERROR_EXIT;
3250 }
3251 } else { /* Structure Format */
3252 if (rtliGetLogX(li)[0] != '\0') {
3253 logInfo->x = local_CreateStructLogVar(li, startTime, finalTime,
3254 stepSize, errStatus,
3255 rtliGetLogX(li), logTime,
3256 maxRows, decimation,
3257 sampleTime, xInfo, NULL);
3258 if (logInfo->x == NULL) goto ERROR_EXIT;
3259 }
3260 if (rtliGetLogXFinal(li)[0] != '\0') {
3261 logInfo->xFinal = local_CreateStructLogVar(li, startTime, finalTime,
3262 stepSize, errStatus,
3263 rtliGetLogXFinal(li),
3264 logTime,1,decimation,
3265 sampleTime,xInfo,NULL);
3266 if (logInfo->xFinal == NULL) goto ERROR_EXIT;
3267 }
3268 }
3269 }
3270
3271 /* outputs */
3272 *errStatus = rt_StartDataLoggingForOutput(li,startTime,finalTime,
3273 stepSize,errStatus);
3274 if (*errStatus != NULL) goto ERROR_EXIT;
3275
3276 return(NULL); /* NORMAL_EXIT */
3277
3278 ERROR_EXIT:
3279 (void)fprintf(stderr, "*** Errors occurred when starting data logging.\n");
3280 if (*errStatus == NULL) {
3281 *errStatus = rtMemAllocError;
3282 }
3283 if (logInfo) {
3284 rt_DestroyLogVar(logInfo->logVarsList);
3285 logInfo->logVarsList = NULL;
3286 rt_DestroyStructLogVar(logInfo->structLogVarsList);
3287 logInfo->structLogVarsList = NULL;
3288 FREE(logInfo);
3289 rtliSetLogInfo(li,NULL);
3290 }
3291 return(*errStatus);
3292
3293} /* end rt_StartDataLoggingWithStartTime */
3294
3295
3296#ifdef __cplusplus
3297}
3298#endif
3299
3300
3301
3302
3303#ifdef __cplusplus
3304extern "C" {
3305#endif
3306
3307
3308/* Function: rt_StartDataLogging ===============================================
3309 * Abstract:
3310 */
3311const char_T *rt_StartDataLogging(RTWLogInfo *li,
3312 const real_T finalTime,
3313 const real_T stepSize,
3314 const char_T **errStatus)
3315{
3316 return rt_StartDataLoggingWithStartTime(li,
3317 0.0,
3318 finalTime,
3319 stepSize,
3320 errStatus);
3321}
3322
3323
3324#ifdef __cplusplus
3325}
3326#endif
3327
3328
3329
3330
3331#ifdef __cplusplus
3332extern "C" {
3333#endif
3334
3335
3336/* Function: rt_UpdateLogVar ===================================================
3337 * Abstract:
3338 * Called to log data for a log variable.
3339 */
3340void rt_UpdateLogVar(LogVar *var, const void *data, boolean_T isVarDims)
3341{
3342 size_t elSize = var->data.elSize;
3343 const char_T *cData = data;
3344 const int_T frameData = var->data.frameData;
3345 const int_T frameSize = frameData ? (var->data.frameSize) : 1;
3346 const int_T logWidth = var->data.nCols;
3347 BuiltInDTypeId dTypeID = var->data.dTypeID;
3348
3349 size_t offset = 0;
3350 char_T *currRealRow = NULL;
3351 char_T *currImagRow = NULL;
3352 int_T pointSize = (int_T)((var->data.complex) ? rt_GetSizeofComplexType(dTypeID) : elSize);
3353
3354 int i, j, k;
3355
3356 /* The following variables will be used for
3357 logging variable-size signals */
3358 const int_T nDims = var->data.nDims;
3359 const int_T *dims = var->data.dims;
3360 const void * const *currDimsPtr = NULL;
3361 const int_T *currDimsSizePtr = NULL;
3362
3363 /* The following variables will be used for
3364 logging "valueDimensions" field */
3365 size_t offset_valDims = 0;
3366 char_T *currValDimsRow = NULL;
3367 size_t elSize_valDims = sizeof(real_T);
3368 real_T currentSigDims = 0;
3369 int_T nRows_valDims = 0;
3370 int_T logWidth_valDims = 0;
3371
3372 for (i = 0; i < frameSize; i++) {
3373 if (++var->numHits % var->decimation) continue;
3374 var->numHits = 0;
3375
3376 if (var->rowIdx == var->data.nRows) {
3377 if (var->okayToRealloc == 1) {
3378 rt_ReallocLogVar(var, isVarDims);
3379 } else {
3380 /* Circular buffer */
3381 var->rowIdx = 0;
3382 ++(var->wrapped); /* increment the wrap around counter */
3383 }
3384 }
3385
3386 if(isVarDims){
3387 currDimsPtr = (const void * const *) var->valDims->currSigDims;
3388 currDimsSizePtr = (const int_T*) var->valDims->currSigDimsSize;
3389 logWidth_valDims = frameData ? 1 : var->valDims->nCols;
3390 nRows_valDims = var->valDims->nRows;
3391
3392 var->strides[0] = 1;
3393 var->currStrides[0] = 1;
3394
3395 for (k = 1; k < nDims; k++){
3396 int32_T currDimsVal=0;
3397 switch (currDimsSizePtr[k-1]) {
3398 case 1:
3399 currDimsVal = (**(((const uint8_T * const *) currDimsPtr)+(k-1)));
3400 break;
3401 case 2:
3402 currDimsVal = (**(((const uint16_T * const *) currDimsPtr)+(k-1)));
3403 break;
3404 case 4:
3405 currDimsVal = (**(((const uint32_T * const *) currDimsPtr)+(k-1)));
3406 break;
3407 }
3408 var->strides[k] = var->strides[k-1] * dims[k-1];
3409 var->currStrides[k] = var->currStrides[k-1] * currDimsVal;
3410 }
3411 }
3412
3413 offset = (size_t)(elSize * var->rowIdx * logWidth);
3414 currRealRow = ((char_T*) (var->data.re)) + offset;
3415 currImagRow = (var->data.complex) ?
3416 ((char_T*) (var->data.im)) + offset : NULL;
3417
3418 /* update logging data */
3419 for (j = 0; j < logWidth; j++) {
3420
3421 boolean_T inRange = true;
3422 int idx = j;
3423
3424 /* Check whether the currently logged value is in range or not.
3425 For fixed-size signal logging, always inRange = true; idx = j;
3426 For variable-size signal logging, use strides, coordinates
3427 and current strides to decide whether the currently logged
3428 data is in range or not and its location in the logging
3429 matrix.
3430 */
3431 if(isVarDims){
3432 int rem = j;
3433 idx = 0;
3434 for(k = nDims-1; k>=0; k--){
3435 int32_T currDimsVal=0;
3436 switch (currDimsSizePtr[k]) {
3437 case 1:
3438 currDimsVal = (**(((const uint8_T * const *) currDimsPtr)+k));
3439 break;
3440 case 2:
3441 currDimsVal = (**(((const uint16_T * const *) currDimsPtr)+k));
3442 break;
3443 case 4:
3444 currDimsVal = (**(((const uint32_T * const *) currDimsPtr)+k));
3445 break;
3446 }
3447 var->coords[k] = rem / var->strides[k];
3448 if( var->coords[k] >= currDimsVal ){
3449 inRange = false;
3450 break;
3451 }
3452 rem = rem - var->coords[k] * var->strides[k];
3453 }
3454 if(inRange){
3455 idx = var->coords[0];
3456 for (k = 1; k < nDims; k++){
3457 idx += var->coords[k] * var->currStrides[k];
3458 }
3459 }
3460 }
3461
3462 if (!var->data.dataTypeConvertInfo.conversionNeeded) {
3463 /* NO conversion needed
3464 */
3465 if (inRange) {
3466 /* If in range, fill in data */
3467 const char *cDataPoint = cData + (i+frameSize*idx) * pointSize;
3468
3469 (void) memcpy(currRealRow, cDataPoint, elSize);
3470 currRealRow += elSize;
3471 if (var->data.complex) {
3472 (void) memcpy(currImagRow, cDataPoint + pointSize/2, elSize);
3473 currImagRow += elSize;
3474 }
3475 } else {
3476 /* If out of range, fill in NaN or 0:
3477 1) For bool, int32, uint32, int16, uint16, etc,
3478 memset to zeros;
3479 2) For fixed-point data type, NaN conversion is not
3480 allowed, memset to zeros.
3481 */
3482 if (dTypeID == SS_DOUBLE) {
3483 (void) memcpy(currRealRow, &rtNaN, elSize);
3484 } else if (dTypeID == SS_SINGLE){
3485 (void) memcpy(currRealRow, &rtNaNF, elSize);
3486 } else {
3487 (void) memset(currRealRow, 0, elSize);
3488 }
3489
3490 currRealRow += elSize;
3491 if (var->data.complex) {
3492 /* For imaginary part, fill in 0 */
3493 (void) memset(currImagRow, 0, elSize);
3494 currImagRow += elSize;
3495 }
3496 }
3497 }
3498 else
3499 {
3500 /* YES conversion needed
3501 */
3502 DTypeId dataTypeIdOriginal =
3503 var->data.dataTypeConvertInfo.dataTypeIdOriginal;
3504 int_T DpSize = (int_T)((var->data.complex) ?
3505 rt_GetSizeofComplexType(dataTypeIdOriginal) :
3506 rt_GetSizeofDataType(dataTypeIdOriginal));
3507
3508 DTypeId dataTypeIdLoggingTo =
3509 var->data.dataTypeConvertInfo.dataTypeIdLoggingTo;
3510
3511 int bitsPerChunk = var->data.dataTypeConvertInfo.bitsPerChunk;
3512 int numOfChunk = var->data.dataTypeConvertInfo.numOfChunk;
3513 unsigned int isSigned = var->data.dataTypeConvertInfo.isSigned;
3514
3515 double fracSlope = var->data.dataTypeConvertInfo.fracSlope;
3516 int fixedExp = var->data.dataTypeConvertInfo.fixedExp;
3517 double bias = var->data.dataTypeConvertInfo.bias;
3518
3519 double curRealValue = -0.12345678987654;
3520 double curImagValue = -0.12345678987654;
3521
3522 int_T adjIndexIfComplex = (var->data.complex) ? 2 : 1;
3523
3524 if(inRange){
3525 if(numOfChunk > 1)
3526 {
3527 /* For multiword */
3528 const char *pInData = (const char *)(cData);
3529 int dtSize = bitsPerChunk*numOfChunk/8;
3530 pInData += ((i+frameSize*idx) * adjIndexIfComplex) * dtSize;
3531
3532 curRealValue = rt_GetDblValueFromOverSizedData(pInData, bitsPerChunk, numOfChunk,
3533 isSigned, fracSlope, fixedExp, bias);
3534 if (var->data.complex) {
3535 curImagValue = rt_GetDblValueFromOverSizedData((pInData+dtSize), bitsPerChunk, numOfChunk,
3536 isSigned, fracSlope, fixedExp, bias);
3537 }
3538 }
3539 else
3540 {
3541 /* if in range, fill in data that is converted first */
3542 switch ( dataTypeIdOriginal )
3543 {
3544 case SS_DOUBLE:
3545 {
3546 const real_T *pInData = (const real_T *)(cData + (i+frameSize*idx)* DpSize);
3547
3548 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3549 if (var->data.complex) {
3550 pInData = (const real_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3551 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3552 }
3553 }
3554 break;
3555 case SS_SINGLE:
3556 {
3557 const real32_T *pInData = (const real32_T *)(cData + (i+frameSize*idx)* DpSize);
3558
3559 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3560 if (var->data.complex) {
3561 pInData = (const real32_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3562 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3563 }
3564 }
3565 break;
3566 case SS_INT8:
3567 {
3568 const int8_T *pInData = (const int8_T *)(cData + (i+frameSize*idx)* DpSize);
3569
3570 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3571 if (var->data.complex) {
3572 pInData = (const int8_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3573 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3574 }
3575 }
3576 break;
3577 case SS_UINT8:
3578 {
3579 const uint8_T *pInData = (const uint8_T *)(cData + (i+frameSize*idx)* DpSize);
3580
3581 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3582 if (var->data.complex) {
3583 pInData = (const uint8_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3584 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3585 }
3586 }
3587 break;
3588 case SS_INT16:
3589 {
3590 const int16_T *pInData = (const int16_T *)(cData + (i+frameSize*idx)* DpSize);
3591
3592 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3593 if (var->data.complex) {
3594 pInData = (const int16_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3595 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3596 }
3597 }
3598 break;
3599 case SS_UINT16:
3600 {
3601 const uint16_T *pInData = (const uint16_T *)(cData + (i+frameSize*idx)* DpSize);
3602
3603 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3604 if (var->data.complex) {
3605 pInData = (const uint16_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3606 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3607 }
3608 }
3609 break;
3610 case SS_INT32:
3611 {
3612 const int32_T *pInData = (const int32_T *)(cData + (i+frameSize*idx)* DpSize);
3613
3614 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3615 if (var->data.complex) {
3616 pInData = (const int32_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3617 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3618 }
3619 }
3620 break;
3621 case SS_UINT32:
3622 {
3623 const uint32_T *pInData = (const uint32_T *)(cData + (i+frameSize*idx)* DpSize);
3624
3625 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3626 if (var->data.complex) {
3627 pInData = (const uint32_T *)(cData + (i+frameSize*idx)* DpSize + DpSize/2);
3628 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3629 }
3630 }
3631 break;
3632 case SS_BOOLEAN:
3633 {
3634 const boolean_T *pInData = ((const boolean_T *)(cData));
3635
3636 pInData += (i+frameSize*idx) * adjIndexIfComplex;
3637
3638 curRealValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3639 if (var->data.complex) {
3640 curImagValue = ldexp( fracSlope * (double)(*pInData), fixedExp ) + bias;
3641 }
3642 }
3643 break;
3644 default:
3645 {
3646 /* For biglong */
3647 const char *pInData = (const char *)(cData);
3648 int dtSize = bitsPerChunk*numOfChunk/8;
3649 pInData += ((i+frameSize*idx) * adjIndexIfComplex) * dtSize;
3650
3651 curRealValue = rt_GetDblValueFromOverSizedData(pInData, bitsPerChunk, numOfChunk,
3652 isSigned, fracSlope, fixedExp, bias);
3653 if (var->data.complex) {
3654 curImagValue = rt_GetDblValueFromOverSizedData((pInData+dtSize), bitsPerChunk, numOfChunk,
3655 isSigned, fracSlope, fixedExp, bias);
3656 }
3657 }
3658 break;
3659 } /* -- end of switch -- */
3660 }
3661 } else {
3662 /* if out of range, just fill NaN or 0 */
3663 if(dTypeID == SS_DOUBLE || dTypeID == SS_SINGLE){
3664 /* vijay 4/11/2013: DO NOT CALL ldexp() with NaN below as it causes
3665 * lcc-win64 to generate inf instead of NaN as output.
3666 * Just use rtNaN directly */
3667 curRealValue = rtNaN;
3668 }
3669 else{
3670 curRealValue = ldexp( 0, fixedExp ) + bias;
3671 }
3672 if (var->data.complex) {
3673 /* fill 0 in imaginary part*/
3674 curImagValue = ldexp( 0, fixedExp ) + bias;
3675 }
3676 }
3677
3678 switch ( dataTypeIdLoggingTo )
3679 {
3680 case SS_DOUBLE:
3681 {
3682 *((real_T *)currRealRow) = (real_T)curRealValue;
3683
3684 if (var->data.complex) {
3685
3686 *((real_T *)currImagRow) = (real_T)curImagValue;
3687 }
3688 }
3689 break;
3690 case SS_SINGLE:
3691 {
3692 *((real32_T *)currRealRow) = (real32_T)curRealValue;
3693
3694 if (var->data.complex) {
3695
3696 *((real32_T *)currImagRow) = (real32_T)curImagValue;
3697 }
3698 }
3699 break;
3700 case SS_INT8:
3701 {
3702 *((int8_T *)currRealRow) = (int8_T)curRealValue;
3703
3704 if (var->data.complex) {
3705
3706 *((int8_T *)currImagRow) = (int8_T)curImagValue;
3707 }
3708 }
3709 break;
3710 case SS_UINT8:
3711 {
3712 *((uint8_T *)currRealRow) = (uint8_T)curRealValue;
3713
3714 if (var->data.complex) {
3715
3716 *((uint8_T *)currImagRow) = (uint8_T)curImagValue;
3717 }
3718 }
3719 break;
3720 case SS_INT16:
3721 {
3722 *((int16_T *)currRealRow) = (int16_T)curRealValue;
3723
3724 if (var->data.complex) {
3725
3726 *((int16_T *)currImagRow) = (int16_T)curImagValue;
3727 }
3728 }
3729 break;
3730 case SS_UINT16:
3731 {
3732 *((uint16_T *)currRealRow) = (uint16_T)curRealValue;
3733
3734 if (var->data.complex) {
3735
3736 *((uint16_T *)currImagRow) = (uint16_T)curImagValue;
3737 }
3738 }
3739 break;
3740 case SS_INT32:
3741 {
3742 *((int32_T *)currRealRow) = (int32_T)curRealValue;
3743
3744 if (var->data.complex) {
3745
3746 *((int32_T *)currImagRow) = (int32_T)curImagValue;
3747 }
3748 }
3749 break;
3750 case SS_UINT32:
3751 {
3752 *((uint32_T *)currRealRow) = (uint32_T)curRealValue;
3753
3754 if (var->data.complex) {
3755
3756 *((uint32_T *)currImagRow) = (uint32_T)curImagValue;
3757 }
3758 }
3759 break;
3760 case SS_BOOLEAN:
3761 {
3762 *((boolean_T *)currRealRow) = (boolean_T)(curRealValue != 0.0);
3763
3764 if (var->data.complex) {
3765
3766 *((boolean_T *)currImagRow) = (boolean_T)(curImagValue != 0.0);
3767 }
3768 }
3769 break;
3770 } /* -- end of switch -- */
3771
3772 currRealRow += elSize;
3773 if (var->data.complex) {
3774 currImagRow += elSize;
3775 }
3776 }
3777 }
3778
3779 if(isVarDims){ /* update "valueDimensions" field */
3780 for(j = 0; j < logWidth_valDims; j ++){
3781 int32_T currDimsVal=0;
3782 switch (currDimsSizePtr[j]) {
3783 case 1:
3784 currDimsVal = (**(((const uint8_T * const *) currDimsPtr)+j));
3785 break;
3786 case 2:
3787 currDimsVal = (**(((const uint16_T * const *) currDimsPtr)+j));
3788 break;
3789 case 4:
3790 currDimsVal = (**(((const uint32_T * const *) currDimsPtr)+j));
3791 break;
3792 }
3793 offset_valDims = (size_t)(elSize_valDims *( var->rowIdx + nRows_valDims * j));
3794 currValDimsRow = ((char_T*) (var->valDims->dimsData)) + offset_valDims;
3795
3796 /* convert int_T to real_T */
3797 currentSigDims = (real_T) currDimsVal;
3798 (void) memcpy(currValDimsRow, &currentSigDims, elSize_valDims);
3799 currValDimsRow += elSize_valDims;
3800 }
3801 }
3802
3803 ++var->rowIdx;
3804 }
3805
3806 return;
3807
3808} /* end rt_UpdateLogVar */
3809
3810
3811#ifdef __cplusplus
3812}
3813#endif
3814
3815
3816
3817
3818#ifdef __cplusplus
3819extern "C" {
3820#endif
3821
3822
3823/* Function: rt_UpdateStructLogVar =============================================
3824 * Abstract:
3825 * Called to log data for a structure log variable.
3826 */
3827void rt_UpdateStructLogVar(StructLogVar *var, const real_T *t, const void *data)
3828{
3829 LogVar *values = var->signals.values;
3830 const char_T *signal = data;
3831 boolean_T *isVarDims = var->signals.isVarDims;
3832 int i = 0;
3833
3834 /* time */
3835 if (var->logTime) {
3836 rt_UpdateLogVar(var->time, t, false);
3837 }
3838
3839 /* signals */
3840 while (values) {
3841 size_t elSz = values->data.elSize;
3842
3843 rt_UpdateLogVar(values, signal, isVarDims[i]);
3844
3845 if (values->data.complex) elSz *= 2;
3846 signal += elSz * values->data.nCols;
3847
3848 values = values->next;
3849 i++;
3850 }
3851
3852} /* end rt_UpdateStructLogVar */
3853
3854
3855#ifdef __cplusplus
3856}
3857#endif
3858
3859
3860
3861
3862#ifdef __cplusplus
3863extern "C" {
3864#endif
3865
3866/*
3867 * g1614989:Refactoring this function to accept number of elements
3868 * instead of accepting signalInfo and index.
3869 */
3870void* rt_getTempMemory(LogVar* var, int_T numEls);
3871
3872void* rt_getTempMemory(LogVar* var, int_T numEls)
3873{
3874 size_t elSize = var->data.elSize;
3875 size_t cmplxMult = var->data.complex ? 2 : 1;
3876 /*
3877 * g1689750: With multiword support for mat file logging in row major array layout, we need to allocate more space to
3878 * store the data when the transpose operation is being performed. The additional space is required to store multiple
3879 * chunks that each multi word contains.
3880 */
3881 size_t numOfChunks = var->data.dataTypeConvertInfo.conversionNeeded ? var->data.dataTypeConvertInfo.numOfChunk : 1;
3882 void* tempMemory = malloc(elSize * numEls * cmplxMult * numOfChunks);
3883 return tempMemory;
3884}
3885
3886/*
3887* g1614989:This function processes the signal data if a function pointer is available and then logs the data.
3888* If a function pointer is not present, signal data is logged without any processing.
3889* The idx parameter specifies which information from the SignalInfo to be used for processing and logging.
3890* When idx is -1, the provided signal info is to be used for processing and logging the data.
3891*/
3892void rt_preProcessAndLogDataWithIndex(const RTWLogSignalInfo *signalInfo, int_T idx, LogVar* val, const void * data, boolean_T isVarDims);
3893
3894void rt_preProcessAndLogDataWithIndex(const RTWLogSignalInfo *signalInfo, int_T idx, LogVar* val, const void * data, boolean_T isVarDims)
3895{
3896 RTWPreprocessingFcnPtr preprocessingPtr = NULL;
3897 int_T numEls = -1;
3898 if (idx == -1) {
3899 preprocessingPtr = *(signalInfo->preprocessingPtrs);
3900 numEls = *(signalInfo->numCols);
3901 }
3902 else {
3903 preprocessingPtr = signalInfo->preprocessingPtrs[idx];
3904 numEls = signalInfo->numCols[idx];
3905 }
3906
3907 if (preprocessingPtr != NULL) {
3908 void* curData = rt_getTempMemory(val, numEls);
3909 preprocessingPtr(curData, data);
3910 rt_UpdateLogVar(val, curData, isVarDims);
3911 free(curData);
3912 }
3913 else {
3914 rt_UpdateLogVar(val, data, isVarDims);
3915 }
3916}
3917
3918/*
3919* g1614989:This function is called when each signal has a specific RTWLogSignalInfo structure defined.
3920*/
3921
3922void rt_preProcessAndLogData(RTWLogSignalInfo signalInfo, LogVar* val, const void * data, boolean_T isVarDims);
3923
3924void rt_preProcessAndLogData(RTWLogSignalInfo signalInfo, LogVar* val, const void * data, boolean_T isVarDims)
3925{
3926 rt_preProcessAndLogDataWithIndex(&signalInfo, -1, val, data, isVarDims);
3927}
3928
3929/* Function: rt_UpdateTXYLogVars ===============================================
3930 * Abstract:
3931 * Update the xFinal,T,X,Y variables that are being logged.
3932 */
3933const char_T *rt_UpdateTXYLogVars(RTWLogInfo *li, time_T *tPtr)
3934{
3935 return rt_UpdateTXXFYLogVars(li, tPtr, true);
3936}
3937
3938/* Function: rt_UpdateTXXFYLogVars =============================================
3939 * Abstract:
3940 * Update xFinal and/or the T,X,Y variables that are being logged
3941 */
3942const char_T *rt_UpdateTXXFYLogVars(RTWLogInfo *li, time_T *tPtr, boolean_T updateTXY)
3943{
3944 LogInfo *logInfo = rtliGetLogInfo(li);
3945 int_T matrixFormat = (rtliGetLogFormat(li) == 0);
3946 const RTWLogSignalInfo* yInfo = rtliGetLogYSignalInfo(li);
3947 const RTWLogSignalInfo* xInfo = rtliGetLogXSignalInfo(li);
3948
3949 /* time */
3950 if (logInfo->t != NULL && updateTXY) {
3951 rt_UpdateLogVar(logInfo->t, tPtr, false);
3952 }
3953
3954 if (matrixFormat) { /* MATRIX_FORMAT */
3955 /* states */
3956 if (logInfo->x != NULL || logInfo->xFinal != NULL) {
3957 int8_T** segAddr = _rtliGetLogXSignalPtrs(li);
3958 const int_T *segLengths = xInfo->numCols;
3959 int_T nSegments = xInfo->numSignals;
3960 RTWPreprocessingFcnPtr* preprocessingPtrs = xInfo->preprocessingPtrs;
3961
3962 if (logInfo->x != NULL && updateTXY) {
3963 const char_T *errorMessage = rt_UpdateLogVarWithDiscontiguousData(logInfo->x, segAddr,
3964 segLengths, nSegments,
3965 preprocessingPtrs);
3966 if (errorMessage != NULL) return(errorMessage);
3967 }
3968 if (logInfo->xFinal != NULL) {
3969 const char_T *errorMessage = rt_UpdateLogVarWithDiscontiguousData(logInfo->xFinal, segAddr,
3970 segLengths, nSegments,
3971 preprocessingPtrs);
3972 if (errorMessage != NULL) return(errorMessage);
3973 }
3974 }
3975 /* outputs */
3976 if (logInfo->y != NULL && updateTXY) {
3977 LogVar **var = (LogVar**) (logInfo->y);
3978 int_T ny = logInfo->ny;
3979 int_T i;
3980 int yIdx;
3981 LogSignalPtrsType data = rtliGetLogYSignalPtrs(li);
3982
3983 for (i = 0, yIdx = 0; i < ny; i++) {
3984 if (data[i] != NULL) {
3985 /*
3986 When outputs are logged in Matrix format,
3987 no variable-size signal logging is allowed.
3988 */
3989 /* g1614989:Code refactoring and fix for logging issue.
3990 * Function pointer is now identified by using
3991 * Y Signal Info instead of iterating over pre-processing
3992 * function pointers.
3993 */
3994 rt_preProcessAndLogData(yInfo[yIdx], var[yIdx], data[i], false);
3995 yIdx++;
3996 }
3997 }
3998 }
3999 } else { /* STRUCTURE_FORMAT */
4000 /* states */
4001 if (logInfo->x != NULL && updateTXY) {
4002 int_T i;
4003 StructLogVar *var = logInfo->x;
4004 LogVar *val = var->signals.values;
4005 int_T nsig = var->signals.numSignals;
4006 LogSignalPtrsType data = rtliGetLogXSignalPtrs(li);
4007
4008 /* time */
4009 if (var->logTime) {
4010 rt_UpdateLogVar(var->time, tPtr, false);
4011 }
4012
4013 /* signals */
4014 for (i = 0; i < nsig; i++) {
4015 /* g1614989:Code refactoring and fix for logging issue.
4016 * Function pointer is now identified by using
4017 * X Signal Info instead of iterating over pre-processing
4018 * function pointers.
4019 */
4020 rt_preProcessAndLogDataWithIndex(xInfo, i, val, data[i], false);
4021 val = val->next;
4022 }
4023 }
4024
4025 /* outputs */
4026 if (logInfo->y != NULL && updateTXY) {
4027 int_T ny = logInfo->ny;
4028 LogSignalPtrsType data = rtliGetLogYSignalPtrs(li);
4029 StructLogVar **var = (StructLogVar**) (logInfo->y);
4030
4031 if (ny == 1) {
4032 int_T i;
4033 int_T dataIdx;
4034 LogVar *val = var[0]->signals.values;
4035 int_T nsig = var[0]->signals.numSignals;
4036 boolean_T *isVarDims = var[0]->signals.isVarDims;
4037
4038 /* time */
4039 if (var[0]->logTime) {
4040 rt_UpdateLogVar(var[0]->time, tPtr, false);
4041 }
4042
4043 /* signals */
4044 for (i = 0, dataIdx = 0; i < nsig; i++) {
4045 while (data[dataIdx] == NULL) {
4046 ++dataIdx;
4047 }
4048 /* g1614989:Code refactoring and fix for logging issue.
4049 * Function pointer is now identified by using
4050 * Y Signal Info instead of iterating over pre-processing
4051 * function pointers.
4052 */
4053 rt_preProcessAndLogDataWithIndex(yInfo, i, val, data[dataIdx], isVarDims[i]);
4054 dataIdx++;
4055 val = val->next;
4056 }
4057 } else {
4058 int_T i;
4059 int_T dataIdx;
4060
4061 for (i = 0, dataIdx = 0; i < ny && var[i] != NULL; i++) {
4062 LogVar *val = var[i]->signals.values;
4063 boolean_T *isVarDims = var[i]->signals.isVarDims;
4064
4065 /* time */
4066 if (var[i]->logTime) {
4067 rt_UpdateLogVar(var[i]->time, tPtr, false);
4068 }
4069
4070 /* signals */
4071 while (data[dataIdx] == NULL) {
4072 ++dataIdx;
4073 }
4074 /* g1614989:Code refactoring and fix for logging issue.
4075 * Function pointer is now identified by using
4076 * Y Signal Info instead of iterating over pre-processing
4077 * function pointers.
4078 */
4079 rt_preProcessAndLogData(yInfo[i], val, data[dataIdx], isVarDims[0]);
4080 dataIdx++;
4081 val = val->next;
4082 }
4083 }
4084 }
4085 /* final state */
4086 if (logInfo->xFinal != NULL) {
4087 StructLogVar *xf = logInfo->xFinal;
4088 LogVar *val = xf->signals.values;
4089 int_T nsig = xf->signals.numSignals;
4090 int_T i;
4091
4092 /* time */
4093 if (xf->logTime) {
4094 rt_UpdateLogVar(xf->time, tPtr, false);
4095 }
4096
4097 /* signals */
4098 for (i = 0; i < nsig; i++) {
4099 LogSignalPtrsType data = rtliGetLogXSignalPtrs(li);
4100 /* g1614989:Code refactoring and fix for logging issue.
4101 * Function pointer is now identified by using
4102 * X Signal Info instead of iterating over pre-processing
4103 * function pointers.
4104 */
4105 rt_preProcessAndLogDataWithIndex(xInfo, i, val, data[i], false);
4106 val = val->next;
4107 }
4108 }
4109 }
4110 return(NULL);
4111} /* end rt_UpdateTXXFYLogVars */
4112
4113
4114#ifdef __cplusplus
4115}
4116#endif
4117
4118
4119
4120
4121#ifdef __cplusplus
4122extern "C" {
4123#endif
4124
4125
4126/* Function: rt_StopDataLoggingImpl =======================================
4127 * Abstract:
4128 * Write logged data to model.mat and free memory.
4129 */
4130void rt_StopDataLoggingImpl(const char_T *file, RTWLogInfo *li, boolean_T isRaccel)
4131{
4132 FILE *fptr;
4133 LogInfo *logInfo = (LogInfo*) rtliGetLogInfo(li);
4134 LogVar *var = logInfo->logVarsList;
4135 StructLogVar *svar = logInfo->structLogVarsList;
4136 /* At this time, verbose is only needed if running rapid accelerator
4137 * simulations. */
4138 int verbose = isRaccel ? 0: 1;
4139
4140 boolean_T emptyFile = 1; /* assume */
4141 boolean_T errFlag = 0;
4142 const char_T *msg;
4143
4144 /*******************************
4145 * Create MAT file with header *
4146 *******************************/
4147 if ((fptr=fopen(file,"w+b")) == NULL) {
4148 (void)fprintf(stderr,"*** Error opening %s",file);
4149 goto EXIT_POINT;
4150 }
4151 if (rt_WriteMat5FileHeader(fptr)) {
4152 (void)fprintf(stderr,"*** Error writing to %s",file);
4153 goto EXIT_POINT;
4154 }
4155
4156 /**************************************************
4157 * First log all the variables in the LogVar list *
4158 **************************************************/
4159 while (var != NULL) {
4160 if ( (msg = rt_FixupLogVar(var,verbose)) != NULL ) {
4161 (void)fprintf(stderr,"*** Error writing %s due to: %s\n",file,msg);
4162 errFlag = 1;
4163 break;
4164 }
4165 if (var->nDataPoints > 0 || isRaccel) {
4166 MatItem item;
4167
4168 item.type = matMATRIX;
4169 item.nbytes = 0; /* not yet known */
4170 item.data = &(var->data);
4171 if (rt_WriteItemToMatFile(fptr, &item, MATRIX_ITEM)) {
4172 (void)fprintf(stderr,"*** Error writing log variable %s to "
4173 "file %s",var->data.name, file);
4174 errFlag = 1;
4175 break;
4176 }
4177 emptyFile = 0;
4178 }
4179 var = var->next;
4180 }
4181 /* free up some memory by destroying the log var list here */
4182 rt_DestroyLogVar(logInfo->logVarsList);
4183 logInfo->logVarsList = NULL;
4184
4185 /*******************************************************
4186 * Next log all the variables in the StructLogVar list *
4187 *******************************************************/
4188 while (svar != NULL) {
4189 MatItem item;
4190
4191 if (svar->logTime) {
4192 var = svar->time;
4193 if ( (msg = rt_FixupLogVar(var,verbose)) != NULL ) {
4194 (void)fprintf(stderr, "*** Error writing %s due to: %s\n",
4195 file, msg);
4196 errFlag = 1;
4197 break;
4198 }
4199 }
4200
4201 var = svar->signals.values;
4202 while (var) {
4203 if ( (msg = rt_FixupLogVar(var,verbose)) != NULL ) {
4204 (void)fprintf(stderr, "*** Error writing %s due to: %s\n",
4205 file, msg);
4206 errFlag = 1;
4207 break;
4208 }
4209 var = var->next;
4210 }
4211
4212 item.type = matMATRIX;
4213 item.nbytes = 0; /* not yet known */
4214 item.data = svar;
4215
4216 if (rt_WriteItemToMatFile(fptr, &item, STRUCT_LOG_VAR_ITEM)) {
4217 (void)fprintf(stderr,"*** Error writing structure log variable "
4218 "%s to file %s",svar->name, file);
4219 errFlag = 1;
4220 break;
4221 }
4222 emptyFile = 0;
4223
4224 svar = svar->next;
4225 }
4226
4227 /******************
4228 * Close the file *
4229 ******************/
4230 (void)fclose(fptr);
4231 if (emptyFile || errFlag) {
4232 (void)remove(file);
4233 } else {
4234 if( verbose ) {
4235 (void)printf("** created %s **\n\n", file);
4236 }
4237 }
4238
4239 EXIT_POINT:
4240
4241 /****************
4242 * free logInfo *
4243 ****************/
4244 rt_DestroyLogVar(logInfo->logVarsList);
4245 logInfo->logVarsList = NULL;
4246 rt_DestroyStructLogVar(logInfo->structLogVarsList);
4247 logInfo->structLogVarsList = NULL;
4248 FREE(logInfo->y);
4249 logInfo->y = NULL;
4250 FREE(logInfo);
4251 rtliSetLogInfo(li,NULL);
4252
4253} /* end rt_StopDataLoggingImpl */
4254
4255
4256#ifdef __cplusplus
4257}
4258#endif
4259
4260
4261#ifdef __cplusplus
4262extern "C" {
4263#endif
4264
4265
4266/* Function: rt_StopDataLogging ================================================
4267 * Abstract:
4268 * Write logged data to model.mat and free memory.
4269 */
4270void rt_StopDataLogging(const char_T *file, RTWLogInfo *li)
4271{
4272 rt_StopDataLoggingImpl(file,li,false);
4273
4274} /* end rt_StopDataLogging */
4275
4276
4277#ifdef __cplusplus
4278}
4279#endif
4280
4281#else /*!defined(MAT_FILE) || (defined(MAT_FILE) && MAT_FILE == 1)*/
4282
4283#define rt_StartDataLogging(li, finalTime, stepSize, errStatus) NULL /* do nothing */
4284#define rt_UpdateTXYLogVars(li, tPtr) NULL /* do nothing */
4285#define rt_StopDataLogging(file, li) { (void(file)); } /* use file quiet unused macro warning */ /* do nothing */
4286
4287#endif /*!defined(MAT_FILE) || (defined(MAT_FILE) && MAT_FILE == 1)*/
4288
4289
4290
4291/* [eof] rt_logging.c */
4292
4293/* LocalWords: Tfinal MAXNAM nonfinite DType PWS RSim Fixup logvar DDEFAULT th
4294 * LocalWords: curr Realloc realloc inp biglong vijay ldexp TXY eof XFinal th
4295 * LocalWords: TXXFY NULL typedefs ret polyspace NUL
4296 */
4297
+
+ + diff --git a/simulink_export/html/rt_nonfinite_cpp.html b/simulink_export/html/rt_nonfinite_cpp.html new file mode 100644 index 0000000..d3406e8 --- /dev/null +++ b/simulink_export/html/rt_nonfinite_cpp.html @@ -0,0 +1,216 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * rt_nonfinite.cpp
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21/*
22 * Abstract:
23 * Function to initialize non-finites,
24 * (Inf, NaN and -Inf).
25 */
26#include "rt_nonfinite.h"
27#include "rtGetNaN.h"
28#include "rtGetInf.h"
29#define NumBitsPerChar 8U
30
31extern "C" {
32 real_T rtInf;
33 real_T rtMinusInf;
34 real_T rtNaN;
35 real32_T rtInfF;
36 real32_T rtMinusInfF;
37 real32_T rtNaNF;
38}
39 extern "C"
40{
41 /*
42 * Initialize the rtInf, rtMinusInf, and rtNaN needed by the
43 * generated code. NaN is initialized as non-signaling. Assumes IEEE.
44 */
45 void rt_InitInfAndNaN(size_t realSize)
46 {
47 (void) (realSize);
48 rtNaN = rtGetNaN();
49 rtNaNF = rtGetNaNF();
50 rtInf = rtGetInf();
51 rtInfF = rtGetInfF();
52 rtMinusInf = rtGetMinusInf();
53 rtMinusInfF = rtGetMinusInfF();
54 }
55
56 /* Test if value is infinite */
57 boolean_T rtIsInf(real_T value)
58 {
59 return (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U);
60 }
61
62 /* Test if single-precision value is infinite */
63 boolean_T rtIsInfF(real32_T value)
64 {
65 return (boolean_T)(((value)==rtInfF || (value)==rtMinusInfF) ? 1U : 0U);
66 }
67
68 /* Test if value is not a number */
69 boolean_T rtIsNaN(real_T value)
70 {
71 boolean_T result = (boolean_T) 0;
72 size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar);
73 if (bitsPerReal == 32U) {
74 result = rtIsNaNF((real32_T)value);
75 } else {
76 union {
77 LittleEndianIEEEDouble bitVal;
78 real_T fltVal;
79 } tmpVal;
80
81 tmpVal.fltVal = value;
82 result = (boolean_T)((tmpVal.bitVal.words.wordH & 0x7FF00000) ==
83 0x7FF00000 &&
84 ( (tmpVal.bitVal.words.wordH & 0x000FFFFF) != 0 ||
85 (tmpVal.bitVal.words.wordL != 0) ));
86 }
87
88 return result;
89 }
90
91 /* Test if single-precision value is not a number */
92 boolean_T rtIsNaNF(real32_T value)
93 {
94 IEEESingle tmp;
95 tmp.wordL.wordLreal = value;
96 return (boolean_T)( (tmp.wordL.wordLuint & 0x7F800000) == 0x7F800000 &&
97 (tmp.wordL.wordLuint & 0x007FFFFF) != 0 );
98 }
99}
100
+
+ + diff --git a/simulink_export/html/rt_nonfinite_h.html b/simulink_export/html/rt_nonfinite_h.html new file mode 100644 index 0000000..0c2de6e --- /dev/null +++ b/simulink_export/html/rt_nonfinite_h.html @@ -0,0 +1,152 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * rt_nonfinite.h
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef RTW_HEADER_rt_nonfinite_h_
22#define RTW_HEADER_rt_nonfinite_h_
23#include <stddef.h>
24#include "rtwtypes.h"
25#ifdef __cplusplus
26
27extern "C" {
28
29#endif
30
31 extern real_T rtInf;
32 extern real_T rtMinusInf;
33 extern real_T rtNaN;
34 extern real32_T rtInfF;
35 extern real32_T rtMinusInfF;
36 extern real32_T rtNaNF;
37 extern void rt_InitInfAndNaN(size_t realSize);
38 extern boolean_T rtIsInf(real_T value);
39 extern boolean_T rtIsInfF(real32_T value);
40 extern boolean_T rtIsNaN(real_T value);
41 extern boolean_T rtIsNaNF(real32_T value);
42 struct BigEndianIEEEDouble {
43 struct {
44 uint32_T wordH;
45 uint32_T wordL;
46 } words;
47 };
48
49 struct LittleEndianIEEEDouble {
50 struct {
51 uint32_T wordL;
52 uint32_T wordH;
53 } words;
54 };
55
56 struct IEEESingle {
57 union {
58 real32_T wordLreal;
59 uint32_T wordLuint;
60 } wordL;
61 };
62
63#ifdef __cplusplus
64
65} /* extern "C" */
66#endif
67#endif /* RTW_HEADER_rt_nonfinite_h_ */
68
+
+ + diff --git a/simulink_export/html/rtmodel_h.html b/simulink_export/html/rtmodel_h.html new file mode 100644 index 0000000..8cb8867 --- /dev/null +++ b/simulink_export/html/rtmodel_h.html @@ -0,0 +1,94 @@ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1/*
2 * rtmodel.h:
3 *
4 * Academic License - for use in teaching, academic research, and meeting
5 * course requirements at degree granting institutions only. Not for
6 * government, commercial, or other organizational use.
7 *
8 * Code generation for model "Arduino_skal".
9 *
10 * Model version : 1.1
11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
13 *
14 * Target selection: grt.tlc
15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
16 * Embedded hardware selection: Intel->x86-64 (Windows64)
17 * Code generation objective: Debugging
18 * Validation result: Not run
19 */
20
21#ifndef RTW_HEADER_rtmodel_h_
22#define RTW_HEADER_rtmodel_h_
23
24/*
25 * Includes the appropriate headers when we are using rtModel
26 */
27#include "Arduino_skal.h"
28#define MODEL_CLASSNAME Arduino_skalModelClass
29#define MODEL_STEPNAME step
30#define GRTINTERFACE 0
31
32/*
33 * ROOT_IO_FORMAT: 0 (Individual arguments)
34 * ROOT_IO_FORMAT: 1 (Structure reference)
35 * ROOT_IO_FORMAT: 2 (Part of model data structure)
36 */
37#define ROOT_IO_FORMAT 2
38#endif /* RTW_HEADER_rtmodel_h_ */
39
+
+ + diff --git a/simulink_export/html/rtwhilite.js b/simulink_export/html/rtwhilite.js new file mode 100644 index 0000000..7d27053 --- /dev/null +++ b/simulink_export/html/rtwhilite.js @@ -0,0 +1,2091 @@ +// Copyright 2006-2019 The MathWorks, Inc. + +// Class RTW_Hash ------------------------------------------------------------ +// Internal web browser doesn't change window.location.hash if the link points +// to the same page. +// RTW_Hash remembers the hash value when the page is loaded in the first time +// or a link is clicked. +// removeHiliteByHash cleans the high lighted elements according to the stored +// hash value +function RTW_Hash(aHash) { + if (aHash == null) { + this.fHash = ""; + } else { + this.fHash = aHash; + }; + + this.getHash = function() { + return this.fHash; + } + + this.setHash = function(aHash) { + this.fHash = aHash; + } +} + +RTW_Hash.instance = null; + +// Class RTW_TraceInfo -------------------------------------------------------- +function RTW_TraceInfo(aFileLinks) { + this.fFileLinks = aFileLinks; + this.fLines = new Array(); + this.fTotalLines = 0; // total number of highlighted lines + this.fNumLines = new Array(); + this.fFileIdxCache = new Array(); + this.fDisablePanel = false; + this.fCurrFileIdx = -1; + this.fCurrLineIdx = -1; + this.fCurrCodeNode = null; + this.getHtmlFileName = function(aIndex) { + if (aIndex < this.fFileLinks.length) { + var href = this.fFileLinks[aIndex].href; + return href.substring(href.lastIndexOf('/')+1); + } + } + this.getSrcFileName = function(aIndex) { + var name = this.getHtmlFileName(aIndex); + if (name) + name = RTW_TraceInfo.toSrcFileName(name); + return name; + } + this.getNumFileLinks = function() { + return this.fFileLinks.length; + } + this.setFileLinkColor = function(aIndex, aColor) { + var link = this.fFileLinks[aIndex]; + if (link && link.parentNode && link.parentNode.style) + link.parentNode.style.backgroundColor = aColor; + } + this.highlightFileLink = function(aIndex, aColor) { + for (var i = 0; i < this.fFileLinks.length; ++i) { + this.setFileLinkColor(i, i == aIndex ? aColor : ""); + } + } + this.highlightCurrFileLink = function(aColor) { + this.highlightFileLink(this.fCurrFileIdx); + } + this.highlightLines = function(aCodeNode,aColor) { + this.fCurrCodeNode = aCodeNode; + var lines = this.fLines[this.getHtmlFileName(this.fCurrFileIdx)]; + if (lines && aCodeNode) { + for (var i = 0; i < lines.length; ++i) { + var lineObj = aCodeNode.childNodes[lines[i]-1]; + if (lineObj) + lineObj.style.backgroundColor=aColor; + } + } + } + this.getFileIdx = function(aFile) { + if (this.fFileIdxCache[aFile] != null) + return this.fFileIdxCache[aFile]; + for (var i = 0; i < this.fFileLinks.length; ++i) { + if (this.getHtmlFileName(i) == aFile) { + this.fFileIdxCache[aFile] = i; + return i; + } + } + return null; + } + this.getCurrFileIdx = function() { return this.fCurrFileIdx; } + this.setNumHighlightedLines = function(aFileIdx, aNumLines) { + this.fNumLines[aFileIdx] = aNumLines; + updateNumHighlightedLines(this.fFileLinks[aFileIdx], aNumLines); + } + this.getNumLines = function(aFileIdx) { + return this.fNumLines[aFileIdx] != null ? this.fNumLines[aFileIdx] : 0; + } + this.getNumLinesAll = function() { + var sum = 0; + var len = this.fNumLines.length; + for (var i = 0; i < len; ++i) { + sum += this.getNumLines(i); + } + return sum; + } + this.getPrevButton = function() { + var aFrame = getNavFrame(); + if (typeof aFrame !== "undefined" && aFrame !== null) + return aFrame.document.getElementById("rtwIdButtonPrev"); + else + return document.getElementById("rtwIdButtonPrev"); + } + this.getNextButton = function() { + var aFrame = getNavFrame(); + if (typeof aFrame !== "undefined" && aFrame !== null) + return aFrame.document.getElementById("rtwIdButtonNext"); + else + return document.getElementById("rtwIdButtonNext"); + } + this.getPanel = function() { + var aFrame = getNavFrame(); + if (typeof aFrame !== "undefined" && aFrame !== null) + return aFrame.document.getElementById("rtwIdTracePanel"); + else + return document.getElementById("rtwIdTracePanel"); + } + this.removeHighlighting = function() { + for (var i = 0; i < this.fFileLinks.length; ++i) { + this.setFileLinkColor(i, ""); + this.setNumHighlightedLines(i, 0); + } + // remove highlight and reset current code node + try { + if (this.fCurrCodeNode != null) + this.highlightLines(getCodeNode(),""); + } catch (e) {}; + this.fCurrCodeNode = null; + if (this.getPrevButton()) { this.getPrevButton().disabled = true; } + if (this.getNextButton()) { this.getNextButton().disabled = true; } + if (this.getPanel()) { this.getPanel().style.display = "none"; } + this.fCurrFileIdx = -1; + this.fCurrLineIdx = -1; + } + this.setCurrLineIdx = function(aLineIdx) { + this.fCurrLineIdx = aLineIdx; + } + this.getCurrLineIdx = function() { return this.fCurrLineIdx; } + this.setCurrent = function(aFileIdx, aLineIdx) { + this.fCurrFileIdx = aFileIdx; + var numLines = this.getNumLines(aFileIdx); + if (!numLines || aLineIdx >= numLines) + this.fCurrLineIdx = -1; + else + this.fCurrLineIdx = aLineIdx; + var allNumLines = this.getNumLinesAll(); + if (this.getPrevButton()) { + this.getPrevButton().disabled = (allNumLines <= 1 || !this.hasPrev()); + } + if (this.getNextButton()) { + this.getNextButton().disabled = (allNumLines <= 1 || !this.hasNext()); + } + if (this.getPanel() && !this.fDisablePanel) { + this.getPanel().style.display = 'block'; + } + } + this.setDisablePanel = function(aDisable) { + this.fDisablePanel = aDisable; + } + this.getPrevFileIdx = function() { + if (this.fCurrLineIdx > 0) + return this.fCurrFileIdx; + for (var i = this.fCurrFileIdx - 1; i >= 0; --i) + if (this.fNumLines[i] > 0) + return i; + return null; + } + // update the navigation bar state + this.updateNavState = function() { + if (this.getPrevButton()) + this.getPrevButton().disabled = !this.hasPrev(); + if (this.getNextButton()) + this.getNextButton().disabled = !this.hasNext(); + setTraceNumber(); + } + this.hasPrev = function() { + return this.getPrevFileIdx() != null; + } + this.getFirstFileIdx = function() { + for (var i = 0; i < this.getNumFileLinks(); ++i) + if (this.fNumLines[i] > 0) + return i; + } + this.getLastFileIdx = function() { + for (var i = this.getNumFileLinks(); i >= 0; --i) + if (this.fNumLines[i] > 0) + return i; + } + this.goFirst = function() { + this.fCurrFileIdx = this.getFirstFileIdx(); + this.fCurrLineIdx = 0; + this.updateNavState(); + } + this.goLast = function() { + this.fCurrFileIdx = this.getLastFileIdx();; + this.fCurrLineIdx = this.getNumLines(this.fCurrFileIdx) - 1; + this.updateNavState(); + } + this.goPrev = function() { + var fileIdx = this.getPrevFileIdx(); + if (fileIdx == null) + return; + if (fileIdx == this.fCurrFileIdx) + --this.fCurrLineIdx; + else { + this.fCurrFileIdx = fileIdx; + this.fCurrLineIdx = this.getNumLines(fileIdx) - 1; + } + this.updateNavState(); + } + this.getNextFileIdx = function() { + if (this.fCurrLineIdx < this.getNumLines(this.fCurrFileIdx) - 1 && this.getNumLines(this.fCurrFileIdx) > 0) + return this.fCurrFileIdx; + for (var i = this.fCurrFileIdx + 1; i < this.getNumFileLinks(); ++i) + if (this.fNumLines[i] > 0) + return i; + return null; + } + this.hasNext = function() { + return this.getNextFileIdx() != null; + } + this.goNext = function() { + var fileIdx = this.getNextFileIdx(); + if (fileIdx == null) + return; + if (fileIdx == this.fCurrFileIdx) + ++this.fCurrLineIdx; + else { + this.fCurrFileIdx = fileIdx; + this.fCurrLineIdx = 0; + } + this.updateNavState(); + } + this.setTotalLines = function(num) { + this.fTotalLines = num; + } + this.getTotalLines = function() { return this.fTotalLines;} + this.setLines = function(aFile, aLines) { + this.fLines[aFile] = aLines; + var index = this.getFileIdx(aFile); + if (index != null) + this.setNumHighlightedLines(index,aLines.length); + } + this.getLines = function(aFile) { + return this.fLines[aFile]; + } + // get current on focus line number + this.getCurrLine = function() { + var file = this.getHtmlFileName(this.getCurrFileIdx()); + var lines = this.fLines[file]; + var line = null; + if (lines) { + var line = lines[this.fCurrLineIdx]; + } + return line; + } + this.getHRef = function(aFileIdx, aLineIdx, offset) { + var file = this.getHtmlFileName(aFileIdx); + var lines = this.fLines[file]; + if (lines) { + var line = lines[aLineIdx]; + line = offset_line(line, offset); + file = file+"#"+line; + } + return file; + } + + this.getCurrentHRef = function(offset) { + return this.getHRef(this.fCurrFileIdx, this.fCurrLineIdx, offset); + } + this.setInitLocation = function(aFile, aLine) { + var fileIdx = this.getFileIdx(aFile); + var lineIdx = null; + if (fileIdx != null && aLine) { + var lines = this.getLines(aFile); + for (var i = 0; i < lines.length; ++i) { + if (lines[i] == aLine) { + lineIdx = i; + break; + } + } + } + if (fileIdx == null || lineIdx == null) + this.setCurrent(-1,-1); + else + this.setCurrent(fileIdx,lineIdx); + } +} + +// Static methods in RTW_TraceInfo + +RTW_TraceInfo.getFileLinks = function(docObj) { + var links; + if (docObj && docObj.getElementsByName) + links = docObj.getElementsByName("rtwIdGenFileLinks"); + return links ? links : new Array(); +} + +RTW_TraceInfo.toSrcFileName = function(aHtmlFileName) { + aHtmlFileName = aHtmlFileName.replace(/_c.html$/,".c"); + aHtmlFileName = aHtmlFileName.replace(/_h.html$/,".h"); + aHtmlFileName = aHtmlFileName.replace(/_cpp.html$/,".cpp"); + aHtmlFileName = aHtmlFileName.replace(/_hpp.html$/,".hpp"); + aHtmlFileName = aHtmlFileName.replace(/_cc.html$/,".hpp"); + return aHtmlFileName; +} + +RTW_TraceInfo.instance = null; + +// Class RTW_TraceArgs -------------------------------------------------------- +// file.c:10,20,30&file.h:10,20,30[&color=value] or +// sid=model:1[&color=value] +RTW_TraceArgs = function(aHash) { + this.fColor = null; + this.fFontSize = null; + this.fInitFile = null; + this.fInitLine = null; + this.fSID = null; + this.fFiles = new Array(); + this.fLines = new Array(); + this.fMessage = null; + this.fBlock = null; + this.fNumBlocks = 0; + this.fUseExternalBrowser = true; + this.fInStudio = false; + this.fModel2CodeSrc = null; + this.fInCodeTrace = false; + this.fTraceData = null; + this.fFileIdx = []; // filename to fileId + this.fRows = []; // highlighted rows indexed by fileId + this.fIDs = []; // highlighted IDs indexed by fileId + + this.hasSid = function() { + return !(this.fSID == null); + } + this.parseCommand = function(aHash) { + var args = new Array(); + args = aHash.split('&'); + for (var i = 0; i < args.length; ++i) { + var arg = args[i]; + sep = arg.indexOf('='); + if (sep != -1) { + var cmd = arg.substring(0,sep); + var opt = arg.substring(sep+1); + switch (cmd.toLowerCase()) { + case "color": + this.fColor = opt; + break; + case "fontsize": + this.fFontSize = opt; + break; + case "initfile": + this.fInitFile = RTW_TraceArgs.toHtmlFileName(opt); + break; + case "initline": + this.fInitLine = opt; + break; + case "msg": + this.fMessage = opt; + break; + case "block": + this.fBlock = unescape(opt); + break; + case "numblocks": + this.fNumBlocks = parseInt(opt); + break; + case "sid": + this.fSID = opt; + // convert sid to code location + break; + case "model2code_src": + // model2code_src from model or webview + this.fModel2CodeSrc = opt; + break; + case "useexternalbrowser": + this.fUseExternalBrowser = (opt=="true"); + break; + case "instudio": + this.fInStudio = (opt=="true"); + break; + case "incodetrace": + this.fInCodeTrace = (opt=="true"); + break; + case "tracedata": + this.fTraceData = decodeURI(opt); + break; + } + } + } + } + this.parseUrlHash = function(aHash) { + var rows, sep, assignSep; + if (aHash) { + args = aHash.split('&'); + for (var i = 0; i < args.length; ++i) { + var arg = args[i]; + sep = arg.indexOf(':'); + assignSep = arg.indexOf('='); + if (sep !== -1 && assignSep === -1) { + var fileLines = arg.split(':'); + var htmlFileName = RTW_TraceArgs.toHtmlFileName(fileLines[0]); + this.fFileIdx[htmlFileName] = i; + this.fFiles.push(htmlFileName); + if (fileLines[1]) { + rows = fileLines[1].split(','); + rows = uniqueRows(rows); + this.fLines.push(rows); + this.fRows[i] = rows; + } + } + } + if (this.fInitFile == null && this.fFiles.length > 0) { + this.fInitFile = this.fFiles[0]; + this.fInitLine = (this.fLines[0] == null ? -1 : this.fLines[0][0]); + } + } + } + this.parseUrlHash2 = function(aHash) { + aHash = decodeURI(aHash); + var rows; + var ids; + if (aHash && aHash.length > 0 && aHash[0] === "[") { + var input = eval(aHash); + var i; + var j; + // set highlight files from url + for (i=0; i 0 + && top.rtwreport_document_frame.location.href !== "about:blank" && forceReload !== true) { + updateHyperlinks(); + return; + } + + // modify modelref links + update_modelref_report_link(top.rtwreport_contents_frame.document); + try { + // ignore browser security error + update_modelref_report_link(top.rtwreport_document_frame.document); + } catch(e) {}; + + // redirect the page based on the url + var initPage = null; + if (RTW_TraceArgs.instance.getNumFiles()) { + var fileLinks = RTW_TraceInfo.getFileLinks(tocDocObj); + RTW_TraceInfo.instance = new RTW_TraceInfo(fileLinks); + RTW_TraceInfo.instance.removeHighlighting() + var numFiles = RTW_TraceArgs.instance.getNumFiles(); + var tLines = 0; + for (var i = 0; i < numFiles; ++i) { + RTW_TraceInfo.instance.setLines(RTW_TraceArgs.instance.getFile(i),RTW_TraceArgs.instance.getLines(i)); + tLines += RTW_TraceArgs.instance.getLines(i).length; + } + RTW_TraceInfo.instance.setTotalLines(tLines); + if (aPanel == false) { + RTW_TraceInfo.instance.setDisablePanel(true); + } + var initFile = RTW_TraceArgs.instance.getInitFile(); + RTW_TraceInfo.instance.setInitLocation(initFile,RTW_TraceArgs.instance.getInitLine()); + if (!hasInCodeTrace()) { + initPage = RTW_TraceInfo.instance.getCurrentHRef(); + } else { + initPage = initFile; + } + } else { + // catch error that document frame is in another domain + try { + var fileDocObj = top.rtwreport_document_frame.document; + if (fileDocObj.location && (!fileDocObj.location.href || fileDocObj.location.href == "about:blank")) { + var summaryPage = tocDocObj.getElementById("rtwIdSummaryPage"); + var tracePage = tocDocObj.getElementById("rtwIdTraceability"); + if (summaryPage) { + initPage = summaryPage.href; + } else if (tracePage) { + initPage = tracePage; + } + } + } catch(e) {}; + } + if (RTW_TraceArgs.instance && RTW_TraceArgs.instance.fMessage) { + // display diagnostic message + var linkId = "rtwIdMsgFileLink"; + var msgFile = tocDocObj.getElementById(linkId); + if (msgFile && msgFile.style) { + msgFile.style.display = "block"; + // Highlight the background of msg link + tocHiliteById(linkId); + } + initPage = "rtwmsg.html"; + } + if (initPage) { + var is_same_page = false; + try { + var fileDocObj = top.rtwreport_document_frame.document; + is_same_page = isSamePage(fileDocObj.location.href, initPage); + } catch(e) {}; + if (document.getElementById("rtwreport_document_frame")) { + document.getElementById("rtwreport_document_frame").setAttribute("src", initPage); + } else { + top.rtwreport_document_frame.location.href = initPage; + } + + if (is_same_page) { + // Goto the same page won't trigger onload function. + // Call it manuelly to highligh new code location. + rtwFileOnLoad(top.rtwreport_document_frame.document); + } + } +} + +// Compare if href1(i.e. file:///path/file1.html#222) and href2(i.e.file2.html) are same pages. +// isSamePage return true if file1 == file2. +function isSamePage(href1, href2) { + var page1 = href1.substring(href1.lastIndexOf('/')+1,href1.lastIndexOf('.html')); + var page2 = href2.substring(href2.lastIndexOf('/')+1,href2.lastIndexOf('.html')); + return (page1 == page2); +} + +// Callback for main document loading +function rtwMainOnLoad() { + rtwMainOnLoadFcn(document,null,true, false); + var newUrl; + // modify history state to avoid reload from pressing back + if (RTW_TraceArgs.instance && !RTW_TraceArgs.instance.getUseExternalBrowser() && + typeof window.history.replaceState === "function") { + if (window.location.search.length > 0) { + if (window.location.search.indexOf("loaded=true") === -1) { + newUrl = document.location.pathname + window.location.search + '&loaded=true'; + } else { + newUrl = document.location.pathname + window.location.search; + } + } else { + newUrl = document.location.pathname + window.location.search + '?loaded=true'; + } + window.history.replaceState("","",newUrl); + } +} + +// Helper function for traceability report +function rtwMainReload(location) { + // remove highlight filename and lines before reloading the page + if (RTW_TraceInfo.instance) + RTW_TraceInfo.instance.removeHighlighting(); + rtwMainOnLoadFcn(document,location,true,true); +} + +function rtwMainReloadNoPanel(location) { + rtwMainOnLoadFcn(document,location,false,true); +} + +// Callback for hyperlink "Remove Highlighting" +function rtwRemoveHighlighting() { + if (RTW_TraceInfo.instance) + RTW_TraceInfo.instance.removeHighlighting(); + if (rtwSrcFrame()) { + rtwSrcFrame().focus(); + } + if (hasInCodeTrace()) { + removeInCodeTraceHighlight(); + } +} + +// Display diagnostic message in document frame +function rtwDisplayMessage() { + var docObj = top.rtwreport_document_frame.document; + var msg = docObj.getElementById(RTW_TraceArgs.instance.fMessage); + if (!msg) { + msg = docObj.getElementById("rtwMsg_notTraceable"); + } + if (msg && msg.style) { + msg.style.display = "block"; // make message visible + var msgstr = msg.innerHTML; + // replace '%s' in message with block name + if (top.RTW_TraceArgs.instance) { + var sid = top.RTW_TraceArgs.instance.getBlock(); + if (sid) { + var block = sid; + if (top.RTW_rtwnameSIDMap && top.RTW_rtwnameSIDMap.instance && top.RTW_rtwnameSIDMap.instance.getRtwname(sid)) { + block = top.RTW_rtwnameSIDMap.instance.getRtwname(sid).rtwname; + block = block.replace("<", "<").replace(">", ">"); + } else { + block = sid; + } + if (block) { + msgstr = msgstr.replace("%s", block); + } + } + } + msg.innerHTML = msgstr; + } +} + +function updateHyperlinks() { + docObj = top.rtwreport_document_frame; + if (docObj && docObj.document) { + if (RTW_TraceArgs.instance === null || !RTW_TraceArgs.instance.getUseExternalBrowser()) { + var plain_link = docObj.document.getElementById("linkToText_plain"); + if (plain_link && plain_link.href && plain_link.href.indexOf("matlab:coder.internal.editUrlTextFile") === -1 ) { + plain_link.href = "matlab:coder.internal.editUrlTextFile('" + str2StrVar(plain_link.href) + "')"; + } + var alink = docObj.document.getElementById("linkToCS"); + var linkCmd = "matlab:coder.internal.viewCodeConfigsetFromReport"; + if (alink && alink.href && alink.href.indexOf(linkCmd) === -1) { + alink.href = linkCmd+ "('" + str2StrVar(alink.href) + "');"; + if(alink.style) { + alink.style.display = ""; + hidden_link = docObj.document.getElementById("linkToCS_disabled"); + if (hidden_link) { + hidden_link.style.display = "none"; + } + } + } + } else { + var alink = docObj.document.getElementById("linkToCS"); + if (alink && alink.style) { + alink.style.display = "none"; + hidden_link = docObj.document.getElementById("linkToCS_disabled"); + if (hidden_link) + hidden_link.style.display = ""; + } + if (typeof docObj.document.getElementsByClassName === "function") { + alinks = docObj.document.getElementsByClassName("callMATLAB"); + } else if (typeof docObj.document.getElementsByName === "function") { + alinks = docObj.document.getElementsByName("callMATLAB"); + } else { + alinks = []; + } + alink = docObj.document.getElementById("CodeGenAdvCheck"); + if (alink && alink.href && alink.href.indexOf("externalweb=true")===-1) { + alink.href = alink.href + "?externalweb=true"; + } + + if (typeof docObj.document.getElementsByName === "function") + var objs = docObj.document.getElementsByName("MATLAB_link"); + else + objs = []; + for (var objIndex = 0; objIndex < objs.length; ++objIndex) { + objs[objIndex].style.display = "none"; + } + } + } + updateCode2ModelLinks(docObj.document); + // modify modelref links + update_modelref_report_link(top.rtwreport_contents_frame.document); + try { + // ignore browser security error + update_modelref_report_link(top.rtwreport_document_frame.document); + } catch(e) {}; +} + +function update_modelref_report_link(docObj) { + if (docObj.getElementsByName) { + var arg = ""; + if (RTW_TraceArgs.instance && !RTW_TraceArgs.instance.getUseExternalBrowser()) { + arg = "?useExternalBrowser=false"; + } + if (RTW_TraceArgs && RTW_TraceArgs.instance && RTW_TraceArgs.instance.getModel2CodeSrc() != null) { + if (arg.length > 0) + arg = arg + "&model2code_src=" + RTW_TraceArgs.instance.getModel2CodeSrc(); + else + arg = "?model2code_src=" + RTW_TraceArgs.instance.getModel2CodeSrc(); + } + if (arg.length > 0) { + links = docObj.getElementsByName('external_link'); + for (var link_idx = 0; link_idx < links.length; ++link_idx) { + links[link_idx].href = links[link_idx].href + arg; + } + } + } +} + +function rtwResizeFrame(f) { + if (f) { + f.style.height = f.contentWindow.document.body.scrollHeight + "px"; + } +} + +function rtwPageOnLoad(id) { + // highlight toc entry + tocHiliteById(id); + // restore elements state + if (top && top.restoreState) { + if (top.rtwreport_contents_frame && top.rtwreport_contents_frame.document) + top.restoreState(top.rtwreport_contents_frame.document); + if (top.rtwreport_document_frame && top.rtwreport_document_frame.document) { + top.restoreState(top.rtwreport_document_frame.document); + rtwResizeFrame(top.rtwreport_document_frame.document.getElementById("rtwIdContentsIframe")); + } + } + updateHyperlinks(); +} + +// highlight code after changeSys +function rtwChangeSysCallback(sid) { + if (sid == "" || typeof RTW_Sid2UrlHash == "undefined" || !RTW_Sid2UrlHash.instance) + return false; + urlHash = RTW_Sid2UrlHash.instance.getUrlHash(sid); + if (urlHash != undefined) { + if (RTW_TraceArgs && RTW_TraceArgs.instance && + !RTW_TraceArgs.instance.getUseExternalBrowser()) + urlHash = (urlHash == "")? "?useExternalBrowser=false" : + urlHash+"&useExternalBrowser=false"; + rtwMainReload(urlHash, true); + return true; + } else { + // remove highlighting from traceinfo + rtwRemoveHighlighting(); + return false; + } +} + +function emlFileOnload(docObj) { + var loc = docObj.location; + if (loc.hash) { + var line = loc.hash.substring(1); + hiliteEmlLine(docObj, line); + } +} + +function hiliteEmlLine(docObj, line) { + var bgColor; + if (top.HiliteCodeStatus) + bgColor = "#66CCFF"; + else + bgColor = "#E8D152"; + // unhighlight + if (typeof docObj.HiliteLine != "undefined") { + trObj = docObj.getElementById("LN_"+docObj.HiliteLine); + if (trObj != null) { + trObj.style.backgroundColor = ""; + } + } + // hilighlight + trObj = docObj.getElementById("LN_"+line); + if (trObj != null) { + trObj.style.backgroundColor = bgColor; + docObj.HiliteLine = line; + } +} + +function emlLineOnClick(docObj,sid,line) { + if (top) { + top.HiliteCodeStatus = top.rtwChangeSysCallback(sid); + } + hiliteEmlLine(docObj, line); +} + +function updateCode2ModelLinks(docObj) { + var webviewFrame = top.document.getElementById('rtw_webviewMidFrame'); + var link2model = false; + var isTestHarness = false; + if (top.testHarnessInfo && top.testHarnessInfo.IsTestHarness === "1") { + isTestHarness = true; + } + if (webviewFrame || isTestHarness) { + if (webviewFrame && RTW_TraceArgs.instance && + (RTW_TraceArgs.instance.getModel2CodeSrc() !== "model" || + RTW_TraceArgs.instance.getUseExternalBrowser()) + ) { + hiliteCmd = "javascript:top.rtwHilite("; + } else { + hiliteCmd = "matlab:coder.internal.code2model("; + link2model = true; + } + var objs = docObj.getElementsByName('code2model'); + var o = null; + var str = ''; + var sid = ''; + var pattern = "'code2model',"; + for (var objIndex = 0; objIndex < objs.length; ++objIndex) { + o = objs[objIndex]; + str = o.href.substring(o.href.indexOf('(')+1); + if (str.indexOf(pattern) > -1) { + str = str.substring(str.indexOf(pattern) + pattern.length); + } + o.href = hiliteCmd + str; + if (link2model && isTestHarness) { + sid = str.substring(0, str.indexOf(")")); + o.href = hiliteCmd + sid + ",'" + + top.testHarnessInfo.HarnessName+ "','" + + top.testHarnessInfo.HarnessOwner+ "','" + + top.testHarnessInfo.OwnerFileName + "');"; + } + } + } +} + +function rtwHilite(aBlock,aParentSID) { + if (aBlock.indexOf('-') !== -1) { + // remove sid range: model:sid:2-10 => model:sid + var s; + s = aBlock.split(':'); + if (s.length > 0) { + s = s[s.length-1]; + if (s.indexOf('-') != -1) { + aBlock = aBlock.substring(0, aBlock.lastIndexOf(':')); + } + } + } + if (typeof aParentSID === "undefined") { + if (top.RTW_SidParentMap && top.RTW_SidParentMap.instance) + aParentSID = top.RTW_SidParentMap.instance.getParentSid(aBlock); + else + aParentSID = aBlock; + } + top.HiliteCodeStatus = true; + + // webview 2 defines an interface api, call slwebview. + if (top.slwebview) { + // webview 2.x + if (top.codeToWebView(aBlock, aParentSID) === -1) { + alert("Cannot highlight block in model Web view. It may not be exported."); + } + + } else { + // webview 1.x + if (hiliteBlockForRTWReport(aBlock,aParentSID) === false) { + if (hiliteBlockForRTWReport(aBlock, aBlock) === false) { + rtwHilite(aParentSID); + } + } + } +} + +function rtwHiliteMultiple(sids, action) { + //For new Code Gen report + if (top.slwebview) { + // webview 2.x + if (top.codeToWebViewArray(sids, action) === -1) { + alert("Cannot highlight block(s) in model Web view. It may not be exported."); + } + } +} + +function str2StrVar(str) { + return str.replace(/'/g,"''"); +} +window.onload=rtwMainOnLoad; + +// handle incode traceability highlighting +function inCodeTraceOnload() { + var tocDocObj = top.rtwreport_contents_frame.document; + if (!top.RTW_TraceArgs.instance) { + var summaryPage = tocDocObj.getElementById("rtwIdSummaryPage"); + top.rtwreport_document_frame.location.href = summaryPage.href; + return; + } + + var files = top.RTW_TraceArgs.instance.getFile(); + if (files.length === 0) { + if (top.RTW_TraceArgs.instance) { + var block = top.RTW_TraceArgs.instance.getBlock(); + block = block.replace("<", "<").replace(">", ">"); + } + top.rtwreport_document_frame.document.write("
No traceability information for block " + block + ".
"); + return; + }; + + var fileLinks = RTW_TraceInfo.getFileLinks(tocDocObj); + RTW_TraceInfo.instance = new RTW_TraceInfo(fileLinks); + + // update filelist with num of highlighted lines + var tocDoc = top.rtwreport_contents_frame.document; + var tLines = 0; + for (var i=0; i 1) { + var spanNodes = parent.getElementsByTagName('span'); + var len = spanNodes.length; + if (len > 0) { + if (aNumLines > 0) { + /* display number of matches */ + spanNodes.item(len-1).innerHTML = " ("+aNumLines+")"; + } else { + /* clear number of matches */ + spanNodes.item(len-1).innerHTML = ""; + } + } + } +} + +function setupInStudio() { + if (top.whole) { + var tmp = top.whole.rows.split(","); + tmp[0] = "35px"; + top.whole.rows = tmp.join(); + } + if (top.main) { + var tmp = top.main.cols.split(","); + tmp[0] = "0"; + top.main.cols = tmp.join(); + } + // add file list to source file + if (top.Html2SrcLink && top.Html2SrcLink.instance && top.fileSelector) { + var myDoc = top.fileSelector.document; + var fileSelector = myDoc.createElement("select"); + fileSelector.id = "fileSelector"; + fileSelector.onchange = top.fileSelectorOnChange; + var filename; + var filelink; + fileSelector.innerHTML += ""; + for (var i=0; i < top.fileList.length; i++) { + filename = top.fileList[i]; + filelink = top.Html2SrcLink.instance.getLink2Src(filename); + fileSelector.innerHTML += ""; + } + var bodyNode = myDoc.body; + bodyNode.insertBefore(fileSelector, bodyNode.firstElementChild); + var textNode = myDoc.createElement("span"); + textNode.innerHTML = "Goto: "; + bodyNode.insertBefore(textNode, fileSelector); + var myCss = myDoc.createElement("link"); + myCss.type = "text/css"; + myCss.rel = "stylesheet"; + myCss.href = "rtwreport.css"; + myDoc.getElementsByTagName("head")[0].appendChild(myCss); + } +} + +function toggleNavSideBar(val) { + if (top.main) { + var tmp = top.main.cols.split(","); + + if (val === "on") { + tmp[tmp.length-1] = "15px"; + } else { + tmp[tmp.length-1] = "0"; + } + top.main.cols = tmp.join(); + if (top.rtwreport_nav_frame) + top.rtwreport_nav_frame.location.href = "nav.html"; + } +}; + +function toggleNavToolBar(val) +{ + var midFrame = rtwMidFrame(); + if (midFrame) { + var tmp1 = midFrame.rows.split(","); + var frameIdx = getNavToolbarFrameIdx(); + if (val === "on") { + tmp1[frameIdx] = "40px"; + } else { + tmp1[frameIdx] = "0"; + } + midFrame.rows = tmp1.join(); + if (top.rtwreport_navToolbar_frame) { + top.rtwreport_navToolbar_frame.location.href = "navToolbar.html"; + } + } +}; + +var GlobalConfig = { + navHiliteColor: "#0000ff", + fileLinkHiliteColor: "#ffff99", + navToolbarBgcolor: "ivory", + offset: 10, + hiliteToken: false +}; +var NavSideBarState = { + calLineHeight: 0, + overLink: false, + linkTarget: null, + lastLinkTarget: null, + linkTargetIdx: 0 +} +function drawNavSideBar() { + var rectHeight = 1; + if (!top || !top.rtwreport_document_frame || !top.rtwreport_nav_frame) return; + + if (!top.RTW_TraceArgs.instance) return; + var fileIdx = top.RTW_TraceArgs.instance.getFileIdx(); + if (fileIdx === undefined) return; + var rows = top.RTW_TraceArgs.instance.getRows(fileIdx); + if (rows.length === 0) return; // no highlighted line + + var codeTbl = top.rtwreport_document_frame.document.getElementById("codeTbl"); + if (!codeTbl) return; // no code table + + var nRows = codeTbl.rows.length + 1; + var canvas = top.rtwreport_nav_frame.document.getElementById("canvas"); + canvas.width = top.rtwreport_nav_frame.innerWidth; + canvas.height = top.rtwreport_nav_frame.innerHeight-2; + NavSideBarState.calLineHeight = canvas.height/nRows; + if (canvas.getContext) { + var ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + // fill background + ctx.fillStyle = GlobalConfig.navToolbarBgcolor; + ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.fillStyle = GlobalConfig.navHiliteColor; + for (var i=0;i" + anchorObj.text + "
  • "+ + size + "
  • "; + } + propObj.appendChild(ulObj); + + return propObj; +} +function getInspectLink(file, pathname, anchorObj) { + var model = top.reportModel; + var tokenId = anchorObj.id; + var navObj = document.createElement("div"); + navObj.id = "token_usage_nav"; + ulObj = document.createElement("ul"); + ulObj.id = "token_nav_links"; + ulObj.className="popup_attrib_list"; + var srcFileName = RTW_TraceInfo.toSrcFileName(file); + var defObj; + if (top.CodeDefine.instance.def[srcFileName + ":" + anchorObj.text]) { + defObj = top.CodeDefine.instance.def[srcFileName + ":" + anchorObj.text]; + } else if (top.CodeDefine.instance.def[anchorObj.text]) { + defObj = top.CodeDefine.instance.def[anchorObj.text]; + } + var line = anchorObj.id.substring(0,anchorObj.id.indexOf("c")); + // link to model + if (top.TraceInfoFlag && top.TraceInfoFlag.instance && + top.TraceInfoFlag.instance.traceFlag[srcFileName+":"+anchorObj.id]) { + return null; + } + // link to def/decl + if (defObj) { + var filename = defObj.file.split(/\//); + filename = filename[filename.length-1]; + ulObj.innerHTML += "
  • " + anchorObj.text + " defined at " + RTW_TraceInfo.toSrcFileName(filename) + " line " + defObj.line + "
  • "; + } + navObj.appendChild(ulObj); + return navObj; +} + +var LastHiliteTokenId = null; +function rmHiliteClickedToken() { + if (LastHiliteTokenId) { + var o = top.rtwreport_document_frame.document.getElementById(LastHiliteTokenId); + if (o) { + o.className = o.className.replace("hiliteToken", ""); + } + } +} +function hiliteClickedToken(elem) { + rmHiliteClickedToken(); + LastHiliteTokenId = elem.id; + elem.className += " hiliteToken"; +} + +var initLine = null; +function scrollToInitLine() { + if (initLine) { + var lineElem = top.rtwreport_document_frame.document.getElementById(initLine); + if (lineElem) { + lineElem.scrollIntoView(); + } + } +} + +function scrollToLineBasedOnHash(hashValue) { + // move to the current highlight line if the hash is not empty + if (hashValue === "") { + if (top.RTW_TraceInfo.instance && top.RTW_TraceInfo.instance.getCurrLine() !== null) { + top.rtwreport_document_frame.document.location.href=top.RTW_TraceInfo.instance.getCurrentHRef(); + top.initLine = top.rtwreport_document_frame.document.location.hash.substr(1); + } + } else { + // scroll and hilite line + hashValue = hashValue.substr(1); + if (isNaN(hashValue)) { + // #fcn_name + var pattern = "+newPage"; + if (hashValue.indexOf(pattern) != -1) { + hashValue = hashValue.replace(pattern, ''); + var lineElem = top.rtwreport_document_frame.document.getElementById(hashValue); + initLine = hashValue; // save initLine in case the dom is updated later by anootation + if (lineElem) { + lineElem.scrollIntoView(); + addTagToCurrentLine(); + } + + } else { + var token = null; + pattern = ["var_", "fcn_", "type_"]; + for (var i =0; i < pattern.length; i++) { + if (hashValue.indexOf(pattern[i]) === 0) { + token = hashValue.substr(pattern[i].length); + break; + } + } + if (token !== null && top.CodeDefine && top.CodeDefine.instance) { + var addr; + var filename = location.pathname.split(/\//); + filename = filename[filename.length-1]; + var srcFileName; + if (top.RTW_TraceInfo) { + srcFileName = top.RTW_TraceInfo.toSrcFileName(filename); + } + if (top.CodeDefine.instance.def[srcFileName + ":" + token]) { + addr = top.CodeDefine.instance.def[srcFileName + ":" + token]; + } else { + addr = top.CodeDefine.instance.def[token]; + } + if (addr) { + hilite_line(addr.line); + } + } else { // token id like #line"c"#col + if (hashValue.indexOf("c") !== -1) { + hilite_line(hashValue.substr(0, hashValue.indexOf("c")), hashValue); + } + } + } + } else { // #line + hilite_line(hashValue); + } + } + return false; + // hilite line number and scroll with an offset + function hilite_line(line, tokenId) { + if (isNaN(line)) return; + if (!tokenId) { + tokenId = line; + } + var elem = top.rtwreport_document_frame.document.getElementById(tokenId); + hiliteClickedToken(elem); + initLine = offset_line(line); + scrollToInitLine(); + } +} + +function tokenLinkOnClick(event) { + var alink = event.currentTarget; + if (alink.pathname === top.rtwreport_document_frame.location.pathname) { + event.preventDefault(); + scrollToLineBasedOnHash(alink.hash); + } + return false; +} +function inspectToken(file, pathname, event) { + var height = "70px"; + // show inspect data + if (top.rtwreport_inspect_frame) { + var windowObj = getInspectWindow(); + var propObj = getInspectData(file, event.currentTarget); + var navObj = getInspectLink(file, pathname, event.currentTarget); + if (navObj === null) { + closeInspectWindow(); + return false; + } + if (propObj === null) { + height = "50px"; + } else { + windowObj.appendChild(propObj); + } + windowObj.appendChild(navObj); + var data = top.rtwreport_inspect_frame.document.getElementById("popup_window"); + if (data) { + data.parentNode.replaceChild(windowObj.cloneNode(true), data); + } + } + var offsetHeight = 0; + var docHeight = 0; + if (typeof(top.rtwInspectFrame().document.body.offsetHeight) === "number") { + offsetHeight = top.rtwInspectFrame().document.body.offsetHeight; + } + if (typeof(top.rtwInspectFrame().document.height) === "number") { + docHeight = top.rtwInspectFrame().document.height; + } + if (offsetHeight > 0) { + height = ""+offsetHeight+"px"; + } else if (docHeight > 0) { + height = ""+docHeight+"px"; + } + setInspectWindow(height); + return false; +} +function setInspectWindow(height) { + // show inspect code frame + var midFrame = rtwMidFrame(); + if (midFrame) { + var tmp = midFrame.rows.split(","); + tmp[getInspectFrameIdx()] = height; + midFrame.rows = tmp.join(); + } +} +function closeInspectWindow() { + setInspectWindow(0); + return false; +} + +// set the trace number in the navigation toolbar +function setTraceNumber() { + if (RTW_TraceInfo.instance) { + var aFrame = rtwNavToolbarFrame(); + if (aFrame) { + var node = aFrame.document.getElementById("rtwIdTraceNumber"); + // calculate current line index over total highlighted lines + var currNum = RTW_TraceInfo.instance.getCurrLineIdx(); + for (var idx=0;idx 0) + line = (line > GlobalConfig.offset ? line - GlobalConfig.offset : 1); + return line; +} + +function load_js(frame, file) { + var h = frame.document.getElementsByTagName("head")[0]; + var o = h.getElementsByTagName('script'); + for (var i=0;i + + + Block-to-Code Highlighting Message + + + +

    Block-to-Code Highlighting Message

    + + + + + + + + + diff --git a/simulink_export/html/rtwreport.css b/simulink_export/html/rtwreport.css new file mode 100644 index 0000000..8af948c --- /dev/null +++ b/simulink_export/html/rtwreport.css @@ -0,0 +1,257 @@ +/* Copyright 2011-2019 The MathWorks, Inc. */ +body,p,table {font-family: calibri, verdana, sans-serif;} +button,.buton {font-family: calibri, verdana, sans-serif;} +button,.button {font-size: small;} +.small_font {font-size: small;} +h1 { font-weight: normal; color: #000066; } +td { vertical-align: top } +th { background-color: #eeeeee; text-align: left; } +a:link { color: #0033cc; } +a:visited { color: #666666; } +input { font-family: sans-serif, verdana, calibri; } +table { + background-color: #ffffff; + width: 100%; +} + +table.toc, table.button, table.panel { + border-style: none; +} + +/* LineNumber */ +.LN { + font-style: italic; + color: #888888; +} + +/* Comment */ +.CT { + font-style: italic; + color: #117755; +} + +/* PreProcessor */ +PP { + /* font-weight: bold; */ + color: #992211; +} + +/* Keyword */ +.KW { + /* font-weight: bold; */ + color: #0000FF; +} + +/* Datatype */ +.DT { + /* font-weight: bold; */ + color: #112266 +} + +.highlighted { + background-color: yellow; +} + +.highlightedCurrent { + background-color: rgba(150, 12, 116, 0.1); +} + +input.search { + background-color: #ffffff; +} + +input.failedSearch { + background-color: #F78181; +} + +/* ensure that code2model links are comment green */ +a.code2model:link { + color: #117755; + font-style: italic; +} +a.code2model:visited{ + color: #117755; + font-style: italic; +} + +.toc td, .button td, .panel td { + border-style: none; + padding: 4px; +} + +h1 { font-weight: normal; color: #000066; } +td { vertical-align: top } +th { background-color: #eeeeee; text-align: left; } +a:link { color: #0033cc; } +a:visited { color: #666666; } + +/******* table *******/ +/* default table style */ +table.AltRow { + border-collapse: collapse; border: none; border-spacing: 0pt; + border-top: solid #4F81BD 1.0pt; border-bottom: solid #4F81BD 1.0pt; +} +table.AltRow th, table.AltRow td { padding: 2pt 8pt 2pt 2pt } +/* default alternating row style */ +table.AltRow tr.even td { background-color:#D3DFEE; border:none;} +table.AltRow tr.odd td { background-color:#FFFFFF; border:none;} +/* tr class="heading" */ +table.AltRow tr.heading td, table.AltRow th { + background-color:#FFFFFF; font-weight:bold; border:none; + border-bottom: solid #4F81BD 1.0pt; +} +/* table class="FirstColumn" */ +table.FirstColumn td:first-child { font-weight:bold } +/* table class="TotalRow" */ +table.TotalRow tr:last-child { font-weight:bold } +table.TotalRow tr:last-child td { border-top: solid #4F81BD 1.0pt } + +a.closeButton { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f9f9f9), color-stop(1, #e9e9e9) ); + background:-moz-linear-gradient( center top, #f9f9f9 5%, #e9e9e9 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e9e9e9'); + background-color:#f9f9f9; + -webkit-border-top-left-radius:20px; + -moz-border-radius-topleft:20px; + border-top-left-radius:20px; + -webkit-border-top-right-radius:20px; + -moz-border-radius-topright:20px; + border-top-right-radius:20px; + -webkit-border-bottom-right-radius:20px; + -moz-border-radius-bottomright:20px; + border-bottom-right-radius:20px; + -webkit-border-bottom-left-radius:20px; + -moz-border-radius-bottomleft:20px; + border-bottom-left-radius:20px; + text-indent:0; + border:2px solid #dcdcdc; + display:inline-block; + color:#454143; + font-family:Arial; + font-size:15px; + font-weight:bold; + font-style:normal; + height:20px; + line-height:20px; + width:20px; + text-decoration:none; + text-align:center; + cursor: pointer; +} +a.closeButton:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #e9e9e9), color-stop(1, #f9f9f9) ); + background:-moz-linear-gradient( center top, #e9e9e9 5%, #f9f9f9 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e9e9e9', endColorstr='#f9f9f9'); + background-color:#e9e9e9; +} +a.closeButton:active { + position:relative; + top:1px; +} + +.button { + -moz-box-shadow:inset 0px 1px 0px 0px #ffffff; + -webkit-box-shadow:inset 0px 1px 0px 0px #ffffff; + box-shadow:inset 0px 1px 0px 0px #ffffff; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ededed), color-stop(1, #dfdfdf) ); + background:-moz-linear-gradient( center top, #ededed 5%, #dfdfdf 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#dfdfdf'); + background-color:#ededed; + -webkit-border-top-left-radius:5px; + -moz-border-radius-topleft:5px; + border-top-left-radius:5px; + -webkit-border-top-right-radius:5px; + -moz-border-radius-topright:5px; + border-top-right-radius:5px; + -webkit-border-bottom-right-radius:5px; + -moz-border-radius-bottomright:5px; + border-bottom-right-radius:5px; + -webkit-border-bottom-left-radius:5px; + -moz-border-radius-bottomleft:5px; + border-bottom-left-radius:5px; + text-indent:0px; + border:1px solid #dcdcdc; + display:inline-block; + color:black; + font-family:Arial; + font-size:12px; + font-weight:bold; + font-style:normal; + height:12px; + line-height:12px; + width:45px; + text-decoration:none; + text-align:center; + text-shadow:1px 1px 0px #ffffff; +} +.button:hover { + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #dfdfdf), color-stop(1, #ededed) ); + background:-moz-linear-gradient( center top, #dfdfdf 5%, #ededed 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dfdfdf', endColorstr='#ededed'); + background-color:#dfdfdf; +}.button:active { + position:relative; + top:1px; +}.button:disabled { + color:#777777; +} + +ul.nav_list { + list-style-type:none; + display: block; + margin: 0; + padding: 0; +} +ul.nav_list li { + list-style-type:none; + display: inline; + margin: 0 18px 0 0; + padding: 0; +} + +.nav_toolbar { + background-color: ivory; + margin-top: 0; +} + +.inspect_body { + margin: 0; + margin-bottom: 0; + display: inline; + vertical-align:middle; +} + +table.nav_table { + background-color: ivory; + border: none; + width: 100%; + display: inline; + vertical-align:middle; +} + +table#rtwIdTracePanel > tr > td { + white-space: nowrap; + table-layout:fixed; + vertical-align:middle; +} + +table.nav_table > button { + height: 20px; +} +select#fileSelector { + padding: 5px; + font-size: 16px; + line-height: 1; + border-radius: 0; + height: 34px; +} + +.treeTable table{ + table-layout: fixed; +} +.treeTable td:first-child > span{ + display: inline-block; + text-overflow: ellipsis; + overflow: hidden; + width: 100%; +} diff --git a/simulink_export/html/rtwreport_utils.js b/simulink_export/html/rtwreport_utils.js new file mode 100644 index 0000000..f58fb49 --- /dev/null +++ b/simulink_export/html/rtwreport_utils.js @@ -0,0 +1,92 @@ +// Copyright 2011-2013 The MathWorks, Inc. + + +function local_onload() { + if (typeof top.rtwreport_document_frame !== "undefined") { + var docObj = window.document; + var alink = docObj.getElementById("linkToText_plain"); + if (alink) { + alink.href = "matlab:coder.internal.editUrlTextFile('" + alink.href + "')"; + } + alink = docObj.getElementById("linkToCS"); + if (alink) { + alink.href = "matlab:coder.internal.viewCodeConfigsetFromReport('" + alink.href + "');"; + } + } +} + +var utils = (function() { + + // Load via Microsoft.XMLDOM--for older versions of IE + function loadXML_MSXMLDOM(filename, callback, async) { + if (navigator.appName == "Microsoft Internet Explorer") { + // Internet Explorer 5/6 + try { + var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); + xmlDoc.async = async; + xmlDoc.onreadystatechange = function() { + if (xmlDoc.readyState == 4) { + callback(xmlDoc); + } + } + xmlDoc.load(filename); + return true; + } catch(e) { + } + } + return false; + } + + // Load via XMLHttpRequest + function loadXML_XHR(filename, callback, async) { + if (window.XMLHttpRequest) { + try { + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function() { + if (this.readyState == 4) { + callback(this.responseXML); + } + } + xhr.open("GET", filename, async); + xhr.send(""); + return true; + } catch(e) { + if (navigator.appName === "Netscape" && e.code === 1012) { + // file not found: ignore + return true; + } + } + } + return false; + } + + return { + trimText: function(s) { + // In IE9, String.trim not present + if (s && s.trim) { + return s.trim(); + } + else { + return s; + } + }, + getText: function(elt) { + // In IE9, use 'text' property rather than 'textContent' + return elt.textContent ? elt.textContent : elt.text; + }, + loadXML: function(filename, callback, options) { + var async = !!options && typeof(options["async"]) !== "undefined" ? options.async : true; + if (!loadXML_XHR(filename, callback, async)) { + if (!loadXML_MSXMLDOM(filename, callback, async)) { + return false; + } + } + return true; + } + }; +})(); + +function code2model(sid) { + utils.loadXML("http://localhost:31415/matlab/feval/coder.internal.code2model?arguments=[\"" + sid + "\"]", function() {}); + //window.location.href = "matlab:coder.internal.code2model('" + sid + "')"; +} diff --git a/simulink_export/html/rtwshrink.js b/simulink_export/html/rtwshrink.js new file mode 100644 index 0000000..8e2affb --- /dev/null +++ b/simulink_export/html/rtwshrink.js @@ -0,0 +1,210 @@ +// Copyright 2011-2017 The MathWorks, Inc. + +function RTW_STRUCT(prop, value) { + this.prop = prop; + if (typeof(value) == 'undefined') { + this.value = ""; + } else { + this.value = value; + } +} + +// initialize the cache when code generation report is first loaded +function RTW_BOOK() { + this.length = 0; + this.rtw_pages = new Array(); + this.getPage = function(file) { + return this.rtw_pages[file]; + }; + this.addPage = function(file) { + var page; + if (this.hasPage(file)) { + page = this.rtw_pages[file]; + } else { + page = new RTW_PAGE(file); + this.rtw_pages[file] = page; + } + return page; + }; + this.hasPage = function(file) { + return typeof(this.rtw_pages[file]) != 'undefined'; + }; + this.removePage = function(file) { + var tmp; + if (typeof(this.rtw_pages[file]) != 'undefined') { + tmp = this.rtw_pages[file]; + delete this.rtw_pages[file]; + this.length--; + } + return tmp; + }; +} + +if (!RTW_BOOK.instance) { + RTW_BOOK.instance = new RTW_BOOK(); +} + +function RTW_PAGE() { + this.length = 0; + this.items = new Array(); + this.pagename = ''; + if (arguments.length > 0 && typeof(arguments[1]) != 'undefined') { + this.pagename = arguments[1]; + } + + this.getItem = function(id) { + return this.items[id]; + }; + this.getItems = function() { + return this.items; + }; + this.addItem = function(id, value) { + var tmp; + if (typeof(value) != 'undefined') { + if (typeof(this.items[id]) != 'undefined') { + this.length++; + } else { + tmp = this.items[id]; + } + this.items[id] = value; + this.length++; + } + return tmp; + }; + this.hasItem = function(id) { + return typeof(this.items[id]) != 'undefined'; + }; + this.removeItem = function(id) { + var tmp; + if (typeof(this.items[id]) != 'undefined') { + tmp = this.items[id]; + delete this.items[id]; + this.length--; + } + return tmp; + }; +} + +function rtwTableShrink(doc, obj, id, isSymbol) { + var hide, hide_text, show, show_text; + if (isSymbol) { + hide = "[-]"; + hide_text = hide; + show = "[+]"; + show_text = show; + } else { + hide = "[hide]"; + hide_text = "[hide]"; + show = "[show]"; + show_text = "[show]"; + } + hide = "" + hide + ""; + show = "" + show + ""; + if (doc.getElementsByName) { + var o = doc.getElementsByName(id); + for (var oid = 0; oid < o.length; ++oid) { + if (o[oid].style.display === "none") { + o[oid].style.display = ""; + } else { + o[oid].style.display = "none"; + } + } + if (o.length >= 0 && addToPage) { + addToPage(doc, o[0], 'display'); + } + } + + // IE supports innerText while other browsers support textContent + if (obj.textContent) { + var objText = obj.textContent; + } else { + var objText = obj.innerText; + } + + if (objText.toLowerCase() === show_text.toLowerCase()) { + obj.innerHTML = hide; + } else { + obj.innerHTML = show; + } + + if (addToPage) { + addToPage(doc, obj, 'innerHTML'); + } +} + +function rtwTableExpand(doc, controlObj, id) { + if (doc.getElementById) { + var obj = doc.getElementById(id); + if (obj && obj.style.display === "none") { + rtwTableShrink(doc, controlObj, id, false); + } + } +} + +function restoreState(docObj) { + var filename = docObj.location.href; + if (RTW_BOOK.instance && RTW_BOOK.instance.hasPage(filename)) { + var page = RTW_BOOK.instance.getPage(filename); + var items = page.getItems(); + var elem; + if (docObj.getElementsByName) { + for (var i in items) { + var o = docObj.getElementsByName(i); + for (var oid = 0; oid < o.length; ++oid) { + elem = o[oid]; + if (items[i].prop === 'display') { + if (elem.style.display === 'none') { + elem.style.display = ''; + } else { + elem.style.display = 'none'; + } + } else if (items[i].prop === 'innerHTML') { + elem.innerHTML = items[i].value; + } + } + } + } + } +} + +function addToPage(docObj, obj, prop) { + var filename = docObj.location.href; + if (RTW_BOOK.instance) { + var page; + if (RTW_BOOK.instance.hasPage(filename)) { + page = RTW_BOOK.instance.getPage(filename); + } else { + page = RTW_BOOK.instance.addPage(filename); + } + if (page.hasItem(obj.id)) { + page.removeItem(obj.id); + } else { + var my_struct; + if (prop === "display") { + my_struct = new RTW_STRUCT(prop, obj.style.display); + } else { + my_struct = new RTW_STRUCT(prop, obj.innerHTML); + } + page.addItem(obj.id, my_struct); + } + } +} + +function rtwSwitchView(doc, obj1, obj2) { + if (doc.getElementsByName) { + var o = doc.getElementsByName(obj1); + for (var oid = 0; oid < o.length; ++oid) { + o[oid].style.display = "none"; + } + if (o.length >= 0 && addToPage) { + addToPage(doc, o[0], 'display'); + } + var o = doc.getElementsByName(obj2); + for (var oid = 0; oid < o.length; ++oid) { + o[oid].style.display = ""; + } + if (o.length >= 0 && addToPage) { + addToPage(doc, o[0], 'display'); + } + } +} diff --git a/simulink_export/html/rtwtypes_h.html b/simulink_export/html/rtwtypes_h.html new file mode 100644 index 0000000..39350fe --- /dev/null +++ b/simulink_export/html/rtwtypes_h.html @@ -0,0 +1,100 @@ + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    1/*
    2 * rtwtypes.h
    3 *
    4 * Academic License - for use in teaching, academic research, and meeting
    5 * course requirements at degree granting institutions only. Not for
    6 * government, commercial, or other organizational use.
    7 *
    8 * Code generation for model "Arduino_skal".
    9 *
    10 * Model version : 1.1
    11 * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
    12 * C++ source code generated on : Thu Apr 15 15:56:50 2021
    13 *
    14 * Target selection: grt.tlc
    15 * Note: GRT includes extra infrastructure and instrumentation for prototyping
    16 * Embedded hardware selection: Intel->x86-64 (Windows64)
    17 * Code generation objective: Debugging
    18 * Validation result: Not run
    19 */
    20
    21#ifndef RTWTYPES_H
    22#define RTWTYPES_H
    23#include "tmwtypes.h"
    24#ifndef POINTER_T
    25#define POINTER_T
    26
    27typedef void * pointer_T;
    28
    29#endif
    30
    31/* Logical type definitions */
    32#if (!defined(__cplusplus))
    33#ifndef false
    34#define false (0U)
    35#endif
    36
    37#ifndef true
    38#define true (1U)
    39#endif
    40#endif
    41#endif /* RTWTYPES_H */
    42
    +
    + + diff --git a/simulink_export/html/search.js b/simulink_export/html/search.js new file mode 100644 index 0000000..816380f --- /dev/null +++ b/simulink_export/html/search.js @@ -0,0 +1,559 @@ +// Copyright 2007-2012 The MathWorks, Inc. + +function createHighlightSpanStart(num) +{ + return ""; +} + +var str2pos; // This is a map between a tag stripped string and the original string. +function getTagStrippedStringAndMap(aString) +{ + var tagStrippedString = new String(); + + str2pos = new Array(); + + var inTag = false; + var inScript = false; + + for (var strPos = 0; strPos < aString.length; strPos++) { + if (inTag && aString.charAt(strPos) == '>') { + inTag = false; + if (inScript && (strPos > 8) && (aString.slice(strPos, strPos - 8) == '/script>')) { + inScript = false; + } + continue; + } else if (!inTag && aString.charAt(strPos) == '<') { + inTag = true; + if (!inScript && aString.slice(strPos, strPos + 7) == ' str2posprev+1) // we have jumped some text, so there must be a tag + { + // insert end tag + newText += highlightEndTag; + + // insert intermediate body text tags + newText += bodyText.slice(str2posprev+1, str2pos[cnt]); + + // insert start tag + newText += highlightStartTag; + } + newText += bodyText.charAt(str2pos[cnt]); + str2posprev=str2pos[cnt]; + } + + // insert end + newText += highlightEndTag; + return newText; + +} + +// check to see if the sequence at position 'i' in taglessString is actually in +// the middle of an escape sequence. We assume escape sequences follow the pattern +// &;. We check for  , <, > and & +function isInEscapedSequence(i, taglessString, searchTerm) +{ + var escapeSeq = / |<|>|&/gi; + var maxEscapeSeqLength = 6; + var startPos = 0; + var endPos = 0; + + // exit if the search term has an escape sequence inside it + if (escapeSeq.test(searchTerm)) { + return false; + } + + // reset the escape sequence + escapeSeq = / |<|>|&/gi; + + // go back in the string until we find an ampersand or we hit maxEscapeSeqLength characters + tempI = i; + var bFound = false; + while (tempI >= 0 && tempI > (i-maxEscapeSeqLength)) { + if (taglessString.charAt(tempI) == "&") { + startPos = tempI; + bFound = true; + break; + } + tempI = tempI-1; + + // if we hit a ';' in any position other than the first while searching + // for an ampersand, then we cannot be inside an escape sequence + if (tempI >= 0 && taglessString.charAt(tempI) == ";") { + return false; + } + } + if (!bFound) { + return false; + } + // reset the escape sequence + escapeSeq = / |<|>|&/gi; + + var subString = taglessString.substring(startPos, startPos + maxEscapeSeqLength); + return escapeSeq.test(subString); +} + +// Adds highlighting to bodyText around searchTerm. Case sensitivity is optional. +// hitCount is used to a) count the number of search matches and b) Generate unique +// name strings for each highlighting SPAN element. +function addHighlight(bodyText, searchTerm, caseSensitive, hitCount) +{ + var highlightStartTag = ""; + var highlightEndTag = ""; + + var newText = ""; + var i = 0; + var previ = 0; + var bodyTextUC = bodyText.toUpperCase(); + + if (caseSensitive) { + var taglessString = getTagStrippedStringAndMap(bodyText); + } else { + var taglessString = getTagStrippedStringAndMap(bodyTextUC); + } + + // escape the search term in case the user input '<' or '>' etc + searchTerm = escapeSpecialChars(searchTerm); + + if (!caseSensitive) { + var searchTermUC = searchTerm.toUpperCase(); + } + + // search for subsequent matches + while (true) { + if (caseSensitive) { + i = taglessString.indexOf(searchTerm, i); + } else { + i = taglessString.indexOf(searchTermUC, i); + } + if (i < 0) break; + + // we have a match! + + // make sure that the match is not inside an escaped sequence of text + // such as   + if (isInEscapedSequence(i, taglessString, searchTerm)) { + i=i+1; + continue; + } + + // insert highlight tags that cross tag boundaries + highlightStartTag = createHighlightSpanStart(hitCount); + hitCount = hitCount+1; + newText += insertHighlighting(bodyText, previ, i, searchTerm.length, highlightStartTag, highlightEndTag); + previ = str2pos[i+searchTerm.length-1]+1; + + i = i + searchTerm.length; + } + + newText += bodyText.slice(previ, bodyText.length); + return [newText, hitCount]; +} + +function removeHighlight(bodyText) +{ + // We use regular expressions here rather than a straight text search because + // some browsers actually insert double quotes and capitalize. Also, each highlight + // name is uniquely numbered in order of discovery + var highlightStartTag = //i; + var highlightEndTag = /<\/span>/i; + + var newText = ""; + + var startPatternFirstIndex = -1; + var startPatternLastIndex = -1; + + var endPatternFirstIndex = -1; + var endPatternLastIndex = -1; + + while (highlightStartTag.test(bodyText) === true) { + startPatternFirstIndex = bodyText.search(highlightStartTag); + newText += bodyText.substring(0, startPatternFirstIndex); + startPatternLastIndex = bodyText.indexOf('>', startPatternFirstIndex+1); + + bodyText = bodyText.substr(startPatternLastIndex+1); + endPatternFirstIndex = bodyText.search(highlightEndTag); + newText += bodyText.substring(0, endPatternFirstIndex); + endPatternLastIndex = endPatternFirstIndex+7; + + bodyText = bodyText.substr(endPatternLastIndex); + } + if (startPatternFirstIndex < 0) { + return bodyText; + } else { + return newText+bodyText; + } +} + +function removeHighlightInAllDocs() +{ + if (top) { + for (var i = 0; i < top.frames.length; i++) { + if (top.frames[i].name === "rtwreport_contents_frame" || top.frames[i].name === "rtwreport_document_frame") { + var currentDoc = top.frames[i].document; + if (typeof currentDoc.body !== "undefined" && currentDoc.body !== null) + currentDoc.body.innerHTML=removeHighlight(currentDoc.body.innerHTML); + } + } + } +} + +function findInDoc(searchStringFromSubmitBox, doc, caseSensitive, hitCount) +{ + var searchBody = doc.body.innerHTML; + // if the document is empty, or the documents is invalid, return + if (!doc.body || typeof(searchBody) === "undefined") { + return [false, hitCount]; + } + + // inject highlighting code into html + var result = addHighlight(searchBody, searchStringFromSubmitBox, caseSensitive, hitCount); + doc.body.innerHTML = result[0]; + + return [true, result[1]]; +} + +var currentlyHighlightedHit; + +function getSpansByName(name) +{ + var allSpans = []; + for (i = 0; i < top.frames.length; i++) { + if (top.frames[i].name === "rtwreport_contents_frame" || top.frames[i].name === "rtwreport_document_frame") { + var currentDoc = top.frames[i].document; + var highlightedSpans = currentDoc.getElementsByName(name); + if (highlightedSpans && highlightedSpans.length && highlightedSpans.length > 0) { + for (j = 0; j < highlightedSpans.length; j++) { + allSpans = allSpans.concat(highlightedSpans[j]); + } + } + } + } + return allSpans; +} + +function isVisibleElement(elementID) +{ + if (elementID) + return elementID.offsetWidth > 0 || elementID.offsetHeight > 0; + else + return false; +} + +function areAllSpansVisible(spans) +{ + isVisible = true; + for (i = 0; i < highlightedSpans.length; i++) { + isVisible = isVisible && isVisibleElement(highlightedSpans[i]); + } + return isVisible; +} + +function getNextVisible() +{ + var isVisible = false; + var foundVisible = false; + while (!isVisible) { + currentlyHighlightedHit = currentlyHighlightedHit + 1; + highlightedSpans = setCurrentSearchMatchIfVisible(currentlyHighlightedHit); + if (highlightedSpans && highlightedSpans.length > 0) { + isVisible = true; + } else if (currentlyHighlightedHit < totalHits) { + continue; + } else { + // we have reached the end + isVisible = false; + currentlyHighlightedHit = 0; + highlightedSpans = null; + break; + } + } + + return highlightedSpans; +} + +function clearCurrentSearchMatch() +{ + // clear prior highlighting + spanName = "highlight" + currentlyHighlightedHit; + highlightedSpans = getSpansByName(spanName); + if (highlightedSpans && highlightedSpans.length) { + for (i = 0; i < highlightedSpans.length; i++) { + if (highlightedSpans[i]) { + highlightedSpans[i].setAttribute("class", "highlighted"); + } + } + } +} + +function setCurrentSearchMatchIfVisible(hitNum){ + currentlyHighlightedHit = hitNum; + var spanName = "highlight" + currentlyHighlightedHit; + var highlightedSpans = getSpansByName(spanName); + if (highlightedSpans && highlightedSpans.length) { + for (i = 0; i < highlightedSpans.length; i++) { + if (!isVisibleElement(highlightedSpans[i])) { + highlightedSpans = null; + break; + } + } + } + return highlightedSpans; +} + +// this takes in an option integer 'hitNum'. If not specified, it scrolls +// to the next hit +function scrollToNextHit(hitNum) +{ + var i = 0; + var found = false; + var spanName = ""; + var highlightedSpans; + var searchBox = findElement('searchTxtBox'); + + clearCurrentSearchMatch(); + + if (hitNum) { + // if a number is provided, use it + highlightedSpans = setCurrentSearchMatchIfVisible(hitNum); + } else { + // start working on next element to highlight + highlightedSpans = getNextVisible(); + } + + // we found the current + if (highlightedSpans && highlightedSpans.length > 0) { + highlightedSpans[0].scrollIntoView(); + for (i = 0; i < highlightedSpans.length; i++) { + highlightedSpans[i].setAttribute("class", "highlightedCurrent"); + } + searchBox.setAttribute("class", "search"); + + // if highlightedSpans is invalid, then we did not find any valid, visible subsequent matches + // wrap to beginning or indicate no matches + } else { + // Element not found. Scroll to first visible element + currentlyHighlightedHit = 0; + var highlightedSpans = getNextVisible(currentlyHighlightedHit); + if (highlightedSpans && highlightedSpans.length > 0) { + highlightedSpans[0].scrollIntoView(); + for (i = 0; i < highlightedSpans.length; i++) { + highlightedSpans[i].setAttribute("class", "highlightedCurrent"); + } + searchBox.setAttribute("class", "search"); + } else { + // there aren't any matches + searchBox.setAttribute("class", "failedSearch"); + } + } +} + +// find search box +function findElement(element) +{ + var i = 0; + for (i = 0; i < top.frames.length; i++) { + if (top.frames[i].name === "rtwreport_contents_frame" || top.frames[i].name === "rtwreport_document_frame") { + var elem = top.frames[i].document.getElementById(element); + if (elem) { + return elem; + } + } + } +} + +// Restore search term once form is submitted +function initSearchBox(strInitValue) +{ + var txtBox = findElement('searchTxtBox'); + if (txtBox) { + txtBox.value = strInitValue; + } +} + +// Sets focus back on to the text box +function setFocusOnTxtBox() +{ + var txtBox = findElement('searchTxtBox'); + if (txtBox) { + txtBox.focus(); + txtBox.select(); + } + return txtBox; +} + +var previousSearchString; +var totalHits; +function findInAllDocs(searchStringFromSubmitBox, caseSensitive) +{ + if (previousSearchString != searchStringFromSubmitBox) { + // If the search string has changed or a new page has been loaded, do a new search + var hitCount = 1; + var i = 0; + var success = false; + previousSearchString = searchStringFromSubmitBox; + + // start by removing traceinfo highlighting + rtwRemoveHighlighting(); + + // remove all previous search highlighting + removeHighlightInAllDocs(); + + // 1. Iterate through all frames in window and search + for (i = 0; i < top.frames.length; i++) { + var currentDoc = top.frames[i].document; + + // if we have no search term, restore + if (searchStringFromSubmitBox !== "") { + // search and highlight in all frames + var srchResult = findInDoc(searchStringFromSubmitBox, currentDoc, caseSensitive, hitCount); + hitCount = srchResult[1]; + totalHits = srchResult[1]; + } + } + + // 2. Restore search term once form is submitted and text highlighted + if (searchStringFromSubmitBox != "") { + strInitValue = searchStringFromSubmitBox; + } + initSearchBox(strInitValue); + + // 3. Scroll to the first hit encountered + scrollToNextHit(1); + + // 4. Set focus back to text box and select text + var txtBox = setFocusOnTxtBox(); + if (txtBox) { + txtBox.select(); + } + + } else { + // If the search string is the same, then scroll to the next + // hit if the hit is valid. Else wrap back. + scrollToNextHit(); + } + return false; +} + +// if the search box is empty, clear highlighting +function clearIfEmpty() +{ + txtBox = findElement('searchTxtBox'); + if (txtBox.value == "") { + txtBox.setAttribute("class", "search"); + removeHighlightInAllDocs(); + previousSearchString=""; + setFocusOnTxtBox(); + } +} + +function keyPressSwitchyard(keyPressEvent) +{ + var kc; + keyPressEvent = (keyPressEvent == null ? window.keyPressEvent : keyPressEvent); + + // typically IE does not support this + if (!keyPressEvent || (typeof keyPressEvent == "undefined")) { + return; + } + + if (keyPressEvent.keyCode) { + kc=keyPressEvent.keyCode; + } else if (keyPressEvent.which) { + kc=keyPressEvent.which; + } else { + return; + } + + // we do not care about the browser find appearing. If it does appear, then + // we are running an external browser and that is okay. + + // handle Ctrl-Key combinations + if (keyPressEvent.ctrlKey) { + switch (kc) { + case 70: // Ctrl-F + { + setFocusOnTxtBox(); + break; + } + + default: break; + } + } +} + +function installDocumentKeyPressHandler() +{ + var i = 0; + for (i = 0; i < top.frames.length; i++) { + var currentDoc = top.frames[i].document; + currentDoc.onkeydown = keyPressSwitchyard; + } + top.document.onkeydown = keyPressSwitchyard; + + // This also clears search related highlighting + removeHighlightInAllDocs(); + currentlyHighlightedHit = 0; + if (previousSearchString) initSearchBox(previousSearchString); + previousSearchString = ""; +} + +// This function is a onresize callback for the rtwreport_contents_frame +// It is used to dynamically resize the searchbox based on the size of the frame. +function setWidthDynamic(frameID, elementID, extraSpace, minSize) +{ + var frame = document.getElementById(frameID); + + // sanity check input args + if (frame && extraSpace > 0 && minSize > 0) { + var frameWidth = frame.scrollWidth; + var newSize = extraSpace + minSize + 40; // 40 is the extra whitespace + var element = findElement(elementID); + if (element) + { + if (frameWidth < newSize) { + element.style.width = minSize; + } else { + element.style.width = frameWidth - extraSpace - 40; + } + } + } +} diff --git a/simulink_export/html/spinner.gif b/simulink_export/html/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4ab78302c5d6ff92def7688c291999a4fcbd70d GIT binary patch literal 4178 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 QLNDhtpXU?v`E~b90i>{@D*ylh literal 0 HcmV?d00001 diff --git a/simulink_export/modelsources.txt b/simulink_export/modelsources.txt new file mode 100644 index 0000000..eb88989 --- /dev/null +++ b/simulink_export/modelsources.txt @@ -0,0 +1,2 @@ + Arduino_skal.cpp + diff --git a/simulink_export/multiword_types.h b/simulink_export/multiword_types.h new file mode 100644 index 0000000..470d421 --- /dev/null +++ b/simulink_export/multiword_types.h @@ -0,0 +1,1173 @@ +/* + * multiword_types.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef MULTIWORD_TYPES_H +#define MULTIWORD_TYPES_H +#include "rtwtypes.h" + +/* + * Definitions supporting external data access + */ +typedef int32_T chunk_T; +typedef uint32_T uchunk_T; + +/* + * MultiWord supporting definitions + */ +typedef long int long_T; + +/* + * MultiWord types + */ +typedef struct { + uint32_T chunks[2]; +} int64m_T; + +typedef struct { + int64m_T re; + int64m_T im; +} cint64m_T; + +typedef struct { + uint32_T chunks[2]; +} uint64m_T; + +typedef struct { + uint64m_T re; + uint64m_T im; +} cuint64m_T; + +typedef struct { + uint32_T chunks[3]; +} int96m_T; + +typedef struct { + int96m_T re; + int96m_T im; +} cint96m_T; + +typedef struct { + uint32_T chunks[3]; +} uint96m_T; + +typedef struct { + uint96m_T re; + uint96m_T im; +} cuint96m_T; + +typedef struct { + uint32_T chunks[4]; +} int128m_T; + +typedef struct { + int128m_T re; + int128m_T im; +} cint128m_T; + +typedef struct { + uint32_T chunks[4]; +} uint128m_T; + +typedef struct { + uint128m_T re; + uint128m_T im; +} cuint128m_T; + +typedef struct { + uint32_T chunks[5]; +} int160m_T; + +typedef struct { + int160m_T re; + int160m_T im; +} cint160m_T; + +typedef struct { + uint32_T chunks[5]; +} uint160m_T; + +typedef struct { + uint160m_T re; + uint160m_T im; +} cuint160m_T; + +typedef struct { + uint32_T chunks[6]; +} int192m_T; + +typedef struct { + int192m_T re; + int192m_T im; +} cint192m_T; + +typedef struct { + uint32_T chunks[6]; +} uint192m_T; + +typedef struct { + uint192m_T re; + uint192m_T im; +} cuint192m_T; + +typedef struct { + uint32_T chunks[7]; +} int224m_T; + +typedef struct { + int224m_T re; + int224m_T im; +} cint224m_T; + +typedef struct { + uint32_T chunks[7]; +} uint224m_T; + +typedef struct { + uint224m_T re; + uint224m_T im; +} cuint224m_T; + +typedef struct { + uint32_T chunks[8]; +} int256m_T; + +typedef struct { + int256m_T re; + int256m_T im; +} cint256m_T; + +typedef struct { + uint32_T chunks[8]; +} uint256m_T; + +typedef struct { + uint256m_T re; + uint256m_T im; +} cuint256m_T; + +typedef struct { + uint32_T chunks[9]; +} int288m_T; + +typedef struct { + int288m_T re; + int288m_T im; +} cint288m_T; + +typedef struct { + uint32_T chunks[9]; +} uint288m_T; + +typedef struct { + uint288m_T re; + uint288m_T im; +} cuint288m_T; + +typedef struct { + uint32_T chunks[10]; +} int320m_T; + +typedef struct { + int320m_T re; + int320m_T im; +} cint320m_T; + +typedef struct { + uint32_T chunks[10]; +} uint320m_T; + +typedef struct { + uint320m_T re; + uint320m_T im; +} cuint320m_T; + +typedef struct { + uint32_T chunks[11]; +} int352m_T; + +typedef struct { + int352m_T re; + int352m_T im; +} cint352m_T; + +typedef struct { + uint32_T chunks[11]; +} uint352m_T; + +typedef struct { + uint352m_T re; + uint352m_T im; +} cuint352m_T; + +typedef struct { + uint32_T chunks[12]; +} int384m_T; + +typedef struct { + int384m_T re; + int384m_T im; +} cint384m_T; + +typedef struct { + uint32_T chunks[12]; +} uint384m_T; + +typedef struct { + uint384m_T re; + uint384m_T im; +} cuint384m_T; + +typedef struct { + uint32_T chunks[13]; +} int416m_T; + +typedef struct { + int416m_T re; + int416m_T im; +} cint416m_T; + +typedef struct { + uint32_T chunks[13]; +} uint416m_T; + +typedef struct { + uint416m_T re; + uint416m_T im; +} cuint416m_T; + +typedef struct { + uint32_T chunks[14]; +} int448m_T; + +typedef struct { + int448m_T re; + int448m_T im; +} cint448m_T; + +typedef struct { + uint32_T chunks[14]; +} uint448m_T; + +typedef struct { + uint448m_T re; + uint448m_T im; +} cuint448m_T; + +typedef struct { + uint32_T chunks[15]; +} int480m_T; + +typedef struct { + int480m_T re; + int480m_T im; +} cint480m_T; + +typedef struct { + uint32_T chunks[15]; +} uint480m_T; + +typedef struct { + uint480m_T re; + uint480m_T im; +} cuint480m_T; + +typedef struct { + uint32_T chunks[16]; +} int512m_T; + +typedef struct { + int512m_T re; + int512m_T im; +} cint512m_T; + +typedef struct { + uint32_T chunks[16]; +} uint512m_T; + +typedef struct { + uint512m_T re; + uint512m_T im; +} cuint512m_T; + +typedef struct { + uint32_T chunks[17]; +} int544m_T; + +typedef struct { + int544m_T re; + int544m_T im; +} cint544m_T; + +typedef struct { + uint32_T chunks[17]; +} uint544m_T; + +typedef struct { + uint544m_T re; + uint544m_T im; +} cuint544m_T; + +typedef struct { + uint32_T chunks[18]; +} int576m_T; + +typedef struct { + int576m_T re; + int576m_T im; +} cint576m_T; + +typedef struct { + uint32_T chunks[18]; +} uint576m_T; + +typedef struct { + uint576m_T re; + uint576m_T im; +} cuint576m_T; + +typedef struct { + uint32_T chunks[19]; +} int608m_T; + +typedef struct { + int608m_T re; + int608m_T im; +} cint608m_T; + +typedef struct { + uint32_T chunks[19]; +} uint608m_T; + +typedef struct { + uint608m_T re; + uint608m_T im; +} cuint608m_T; + +typedef struct { + uint32_T chunks[20]; +} int640m_T; + +typedef struct { + int640m_T re; + int640m_T im; +} cint640m_T; + +typedef struct { + uint32_T chunks[20]; +} uint640m_T; + +typedef struct { + uint640m_T re; + uint640m_T im; +} cuint640m_T; + +typedef struct { + uint32_T chunks[21]; +} int672m_T; + +typedef struct { + int672m_T re; + int672m_T im; +} cint672m_T; + +typedef struct { + uint32_T chunks[21]; +} uint672m_T; + +typedef struct { + uint672m_T re; + uint672m_T im; +} cuint672m_T; + +typedef struct { + uint32_T chunks[22]; +} int704m_T; + +typedef struct { + int704m_T re; + int704m_T im; +} cint704m_T; + +typedef struct { + uint32_T chunks[22]; +} uint704m_T; + +typedef struct { + uint704m_T re; + uint704m_T im; +} cuint704m_T; + +typedef struct { + uint32_T chunks[23]; +} int736m_T; + +typedef struct { + int736m_T re; + int736m_T im; +} cint736m_T; + +typedef struct { + uint32_T chunks[23]; +} uint736m_T; + +typedef struct { + uint736m_T re; + uint736m_T im; +} cuint736m_T; + +typedef struct { + uint32_T chunks[24]; +} int768m_T; + +typedef struct { + int768m_T re; + int768m_T im; +} cint768m_T; + +typedef struct { + uint32_T chunks[24]; +} uint768m_T; + +typedef struct { + uint768m_T re; + uint768m_T im; +} cuint768m_T; + +typedef struct { + uint32_T chunks[25]; +} int800m_T; + +typedef struct { + int800m_T re; + int800m_T im; +} cint800m_T; + +typedef struct { + uint32_T chunks[25]; +} uint800m_T; + +typedef struct { + uint800m_T re; + uint800m_T im; +} cuint800m_T; + +typedef struct { + uint32_T chunks[26]; +} int832m_T; + +typedef struct { + int832m_T re; + int832m_T im; +} cint832m_T; + +typedef struct { + uint32_T chunks[26]; +} uint832m_T; + +typedef struct { + uint832m_T re; + uint832m_T im; +} cuint832m_T; + +typedef struct { + uint32_T chunks[27]; +} int864m_T; + +typedef struct { + int864m_T re; + int864m_T im; +} cint864m_T; + +typedef struct { + uint32_T chunks[27]; +} uint864m_T; + +typedef struct { + uint864m_T re; + uint864m_T im; +} cuint864m_T; + +typedef struct { + uint32_T chunks[28]; +} int896m_T; + +typedef struct { + int896m_T re; + int896m_T im; +} cint896m_T; + +typedef struct { + uint32_T chunks[28]; +} uint896m_T; + +typedef struct { + uint896m_T re; + uint896m_T im; +} cuint896m_T; + +typedef struct { + uint32_T chunks[29]; +} int928m_T; + +typedef struct { + int928m_T re; + int928m_T im; +} cint928m_T; + +typedef struct { + uint32_T chunks[29]; +} uint928m_T; + +typedef struct { + uint928m_T re; + uint928m_T im; +} cuint928m_T; + +typedef struct { + uint32_T chunks[30]; +} int960m_T; + +typedef struct { + int960m_T re; + int960m_T im; +} cint960m_T; + +typedef struct { + uint32_T chunks[30]; +} uint960m_T; + +typedef struct { + uint960m_T re; + uint960m_T im; +} cuint960m_T; + +typedef struct { + uint32_T chunks[31]; +} int992m_T; + +typedef struct { + int992m_T re; + int992m_T im; +} cint992m_T; + +typedef struct { + uint32_T chunks[31]; +} uint992m_T; + +typedef struct { + uint992m_T re; + uint992m_T im; +} cuint992m_T; + +typedef struct { + uint32_T chunks[32]; +} int1024m_T; + +typedef struct { + int1024m_T re; + int1024m_T im; +} cint1024m_T; + +typedef struct { + uint32_T chunks[32]; +} uint1024m_T; + +typedef struct { + uint1024m_T re; + uint1024m_T im; +} cuint1024m_T; + +typedef struct { + uint32_T chunks[33]; +} int1056m_T; + +typedef struct { + int1056m_T re; + int1056m_T im; +} cint1056m_T; + +typedef struct { + uint32_T chunks[33]; +} uint1056m_T; + +typedef struct { + uint1056m_T re; + uint1056m_T im; +} cuint1056m_T; + +typedef struct { + uint32_T chunks[34]; +} int1088m_T; + +typedef struct { + int1088m_T re; + int1088m_T im; +} cint1088m_T; + +typedef struct { + uint32_T chunks[34]; +} uint1088m_T; + +typedef struct { + uint1088m_T re; + uint1088m_T im; +} cuint1088m_T; + +typedef struct { + uint32_T chunks[35]; +} int1120m_T; + +typedef struct { + int1120m_T re; + int1120m_T im; +} cint1120m_T; + +typedef struct { + uint32_T chunks[35]; +} uint1120m_T; + +typedef struct { + uint1120m_T re; + uint1120m_T im; +} cuint1120m_T; + +typedef struct { + uint32_T chunks[36]; +} int1152m_T; + +typedef struct { + int1152m_T re; + int1152m_T im; +} cint1152m_T; + +typedef struct { + uint32_T chunks[36]; +} uint1152m_T; + +typedef struct { + uint1152m_T re; + uint1152m_T im; +} cuint1152m_T; + +typedef struct { + uint32_T chunks[37]; +} int1184m_T; + +typedef struct { + int1184m_T re; + int1184m_T im; +} cint1184m_T; + +typedef struct { + uint32_T chunks[37]; +} uint1184m_T; + +typedef struct { + uint1184m_T re; + uint1184m_T im; +} cuint1184m_T; + +typedef struct { + uint32_T chunks[38]; +} int1216m_T; + +typedef struct { + int1216m_T re; + int1216m_T im; +} cint1216m_T; + +typedef struct { + uint32_T chunks[38]; +} uint1216m_T; + +typedef struct { + uint1216m_T re; + uint1216m_T im; +} cuint1216m_T; + +typedef struct { + uint32_T chunks[39]; +} int1248m_T; + +typedef struct { + int1248m_T re; + int1248m_T im; +} cint1248m_T; + +typedef struct { + uint32_T chunks[39]; +} uint1248m_T; + +typedef struct { + uint1248m_T re; + uint1248m_T im; +} cuint1248m_T; + +typedef struct { + uint32_T chunks[40]; +} int1280m_T; + +typedef struct { + int1280m_T re; + int1280m_T im; +} cint1280m_T; + +typedef struct { + uint32_T chunks[40]; +} uint1280m_T; + +typedef struct { + uint1280m_T re; + uint1280m_T im; +} cuint1280m_T; + +typedef struct { + uint32_T chunks[41]; +} int1312m_T; + +typedef struct { + int1312m_T re; + int1312m_T im; +} cint1312m_T; + +typedef struct { + uint32_T chunks[41]; +} uint1312m_T; + +typedef struct { + uint1312m_T re; + uint1312m_T im; +} cuint1312m_T; + +typedef struct { + uint32_T chunks[42]; +} int1344m_T; + +typedef struct { + int1344m_T re; + int1344m_T im; +} cint1344m_T; + +typedef struct { + uint32_T chunks[42]; +} uint1344m_T; + +typedef struct { + uint1344m_T re; + uint1344m_T im; +} cuint1344m_T; + +typedef struct { + uint32_T chunks[43]; +} int1376m_T; + +typedef struct { + int1376m_T re; + int1376m_T im; +} cint1376m_T; + +typedef struct { + uint32_T chunks[43]; +} uint1376m_T; + +typedef struct { + uint1376m_T re; + uint1376m_T im; +} cuint1376m_T; + +typedef struct { + uint32_T chunks[44]; +} int1408m_T; + +typedef struct { + int1408m_T re; + int1408m_T im; +} cint1408m_T; + +typedef struct { + uint32_T chunks[44]; +} uint1408m_T; + +typedef struct { + uint1408m_T re; + uint1408m_T im; +} cuint1408m_T; + +typedef struct { + uint32_T chunks[45]; +} int1440m_T; + +typedef struct { + int1440m_T re; + int1440m_T im; +} cint1440m_T; + +typedef struct { + uint32_T chunks[45]; +} uint1440m_T; + +typedef struct { + uint1440m_T re; + uint1440m_T im; +} cuint1440m_T; + +typedef struct { + uint32_T chunks[46]; +} int1472m_T; + +typedef struct { + int1472m_T re; + int1472m_T im; +} cint1472m_T; + +typedef struct { + uint32_T chunks[46]; +} uint1472m_T; + +typedef struct { + uint1472m_T re; + uint1472m_T im; +} cuint1472m_T; + +typedef struct { + uint32_T chunks[47]; +} int1504m_T; + +typedef struct { + int1504m_T re; + int1504m_T im; +} cint1504m_T; + +typedef struct { + uint32_T chunks[47]; +} uint1504m_T; + +typedef struct { + uint1504m_T re; + uint1504m_T im; +} cuint1504m_T; + +typedef struct { + uint32_T chunks[48]; +} int1536m_T; + +typedef struct { + int1536m_T re; + int1536m_T im; +} cint1536m_T; + +typedef struct { + uint32_T chunks[48]; +} uint1536m_T; + +typedef struct { + uint1536m_T re; + uint1536m_T im; +} cuint1536m_T; + +typedef struct { + uint32_T chunks[49]; +} int1568m_T; + +typedef struct { + int1568m_T re; + int1568m_T im; +} cint1568m_T; + +typedef struct { + uint32_T chunks[49]; +} uint1568m_T; + +typedef struct { + uint1568m_T re; + uint1568m_T im; +} cuint1568m_T; + +typedef struct { + uint32_T chunks[50]; +} int1600m_T; + +typedef struct { + int1600m_T re; + int1600m_T im; +} cint1600m_T; + +typedef struct { + uint32_T chunks[50]; +} uint1600m_T; + +typedef struct { + uint1600m_T re; + uint1600m_T im; +} cuint1600m_T; + +typedef struct { + uint32_T chunks[51]; +} int1632m_T; + +typedef struct { + int1632m_T re; + int1632m_T im; +} cint1632m_T; + +typedef struct { + uint32_T chunks[51]; +} uint1632m_T; + +typedef struct { + uint1632m_T re; + uint1632m_T im; +} cuint1632m_T; + +typedef struct { + uint32_T chunks[52]; +} int1664m_T; + +typedef struct { + int1664m_T re; + int1664m_T im; +} cint1664m_T; + +typedef struct { + uint32_T chunks[52]; +} uint1664m_T; + +typedef struct { + uint1664m_T re; + uint1664m_T im; +} cuint1664m_T; + +typedef struct { + uint32_T chunks[53]; +} int1696m_T; + +typedef struct { + int1696m_T re; + int1696m_T im; +} cint1696m_T; + +typedef struct { + uint32_T chunks[53]; +} uint1696m_T; + +typedef struct { + uint1696m_T re; + uint1696m_T im; +} cuint1696m_T; + +typedef struct { + uint32_T chunks[54]; +} int1728m_T; + +typedef struct { + int1728m_T re; + int1728m_T im; +} cint1728m_T; + +typedef struct { + uint32_T chunks[54]; +} uint1728m_T; + +typedef struct { + uint1728m_T re; + uint1728m_T im; +} cuint1728m_T; + +typedef struct { + uint32_T chunks[55]; +} int1760m_T; + +typedef struct { + int1760m_T re; + int1760m_T im; +} cint1760m_T; + +typedef struct { + uint32_T chunks[55]; +} uint1760m_T; + +typedef struct { + uint1760m_T re; + uint1760m_T im; +} cuint1760m_T; + +typedef struct { + uint32_T chunks[56]; +} int1792m_T; + +typedef struct { + int1792m_T re; + int1792m_T im; +} cint1792m_T; + +typedef struct { + uint32_T chunks[56]; +} uint1792m_T; + +typedef struct { + uint1792m_T re; + uint1792m_T im; +} cuint1792m_T; + +typedef struct { + uint32_T chunks[57]; +} int1824m_T; + +typedef struct { + int1824m_T re; + int1824m_T im; +} cint1824m_T; + +typedef struct { + uint32_T chunks[57]; +} uint1824m_T; + +typedef struct { + uint1824m_T re; + uint1824m_T im; +} cuint1824m_T; + +typedef struct { + uint32_T chunks[58]; +} int1856m_T; + +typedef struct { + int1856m_T re; + int1856m_T im; +} cint1856m_T; + +typedef struct { + uint32_T chunks[58]; +} uint1856m_T; + +typedef struct { + uint1856m_T re; + uint1856m_T im; +} cuint1856m_T; + +typedef struct { + uint32_T chunks[59]; +} int1888m_T; + +typedef struct { + int1888m_T re; + int1888m_T im; +} cint1888m_T; + +typedef struct { + uint32_T chunks[59]; +} uint1888m_T; + +typedef struct { + uint1888m_T re; + uint1888m_T im; +} cuint1888m_T; + +typedef struct { + uint32_T chunks[60]; +} int1920m_T; + +typedef struct { + int1920m_T re; + int1920m_T im; +} cint1920m_T; + +typedef struct { + uint32_T chunks[60]; +} uint1920m_T; + +typedef struct { + uint1920m_T re; + uint1920m_T im; +} cuint1920m_T; + +typedef struct { + uint32_T chunks[61]; +} int1952m_T; + +typedef struct { + int1952m_T re; + int1952m_T im; +} cint1952m_T; + +typedef struct { + uint32_T chunks[61]; +} uint1952m_T; + +typedef struct { + uint1952m_T re; + uint1952m_T im; +} cuint1952m_T; + +typedef struct { + uint32_T chunks[62]; +} int1984m_T; + +typedef struct { + int1984m_T re; + int1984m_T im; +} cint1984m_T; + +typedef struct { + uint32_T chunks[62]; +} uint1984m_T; + +typedef struct { + uint1984m_T re; + uint1984m_T im; +} cuint1984m_T; + +typedef struct { + uint32_T chunks[63]; +} int2016m_T; + +typedef struct { + int2016m_T re; + int2016m_T im; +} cint2016m_T; + +typedef struct { + uint32_T chunks[63]; +} uint2016m_T; + +typedef struct { + uint2016m_T re; + uint2016m_T im; +} cuint2016m_T; + +typedef struct { + uint32_T chunks[64]; +} int2048m_T; + +typedef struct { + int2048m_T re; + int2048m_T im; +} cint2048m_T; + +typedef struct { + uint32_T chunks[64]; +} uint2048m_T; + +typedef struct { + uint2048m_T re; + uint2048m_T im; +} cuint2048m_T; + +#endif /* MULTIWORD_TYPES_H */ diff --git a/simulink_export/rtGetInf.cpp b/simulink_export/rtGetInf.cpp new file mode 100644 index 0000000..5f6fa64 --- /dev/null +++ b/simulink_export/rtGetInf.cpp @@ -0,0 +1,146 @@ +/* + * rtGetInf.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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +/* + * Abstract: + * Function to initialize non-finite, Inf + */ +#include "rtGetInf.h" +#define NumBitsPerChar 8U + +extern "C" { + /* + * Initialize rtInf needed by the generated code. + * Inf is initialized as non-signaling. Assumes IEEE. + */ + real_T rtGetInf(void) + { + size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar); + real_T inf = 0.0; + if (bitsPerReal == 32U) { + inf = rtGetInfF(); + } else { + uint16_T one = 1U; + enum { + LittleEndian, + BigEndian + } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian; + switch (machByteOrder) { + case LittleEndian: + { + union { + LittleEndianIEEEDouble bitVal; + real_T fltVal; + } tmpVal; + + tmpVal.bitVal.words.wordH = 0x7FF00000U; + tmpVal.bitVal.words.wordL = 0x00000000U; + inf = tmpVal.fltVal; + break; + } + + case BigEndian: + { + union { + BigEndianIEEEDouble bitVal; + real_T fltVal; + } tmpVal; + + tmpVal.bitVal.words.wordH = 0x7FF00000U; + tmpVal.bitVal.words.wordL = 0x00000000U; + inf = tmpVal.fltVal; + break; + } + } + } + + return inf; + } + + /* + * Initialize rtInfF needed by the generated code. + * Inf is initialized as non-signaling. Assumes IEEE. + */ + real32_T rtGetInfF(void) + { + IEEESingle infF; + infF.wordL.wordLuint = 0x7F800000U; + return infF.wordL.wordLreal; + } + + /* + * Initialize rtMinusInf needed by the generated code. + * Inf is initialized as non-signaling. Assumes IEEE. + */ + real_T rtGetMinusInf(void) + { + size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar); + real_T minf = 0.0; + if (bitsPerReal == 32U) { + minf = rtGetMinusInfF(); + } else { + uint16_T one = 1U; + enum { + LittleEndian, + BigEndian + } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian; + switch (machByteOrder) { + case LittleEndian: + { + union { + LittleEndianIEEEDouble bitVal; + real_T fltVal; + } tmpVal; + + tmpVal.bitVal.words.wordH = 0xFFF00000U; + tmpVal.bitVal.words.wordL = 0x00000000U; + minf = tmpVal.fltVal; + break; + } + + case BigEndian: + { + union { + BigEndianIEEEDouble bitVal; + real_T fltVal; + } tmpVal; + + tmpVal.bitVal.words.wordH = 0xFFF00000U; + tmpVal.bitVal.words.wordL = 0x00000000U; + minf = tmpVal.fltVal; + break; + } + } + } + + return minf; + } + + /* + * Initialize rtMinusInfF needed by the generated code. + * Inf is initialized as non-signaling. Assumes IEEE. + */ + real32_T rtGetMinusInfF(void) + { + IEEESingle minfF; + minfF.wordL.wordLuint = 0xFF800000U; + return minfF.wordL.wordLreal; + } +} diff --git a/simulink_export/rtGetInf.h b/simulink_export/rtGetInf.h new file mode 100644 index 0000000..b576359 --- /dev/null +++ b/simulink_export/rtGetInf.h @@ -0,0 +1,41 @@ +/* + * rtGetInf.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTW_HEADER_rtGetInf_h_ +#define RTW_HEADER_rtGetInf_h_ +#include +#include "rtwtypes.h" +#include "rt_nonfinite.h" +#ifdef __cplusplus + +extern "C" { + +#endif + + extern real_T rtGetInf(void); + extern real32_T rtGetInfF(void); + extern real_T rtGetMinusInf(void); + extern real32_T rtGetMinusInfF(void); + +#ifdef __cplusplus + +} /* extern "C" */ +#endif +#endif /* RTW_HEADER_rtGetInf_h_ */ diff --git a/simulink_export/rtGetNaN.cpp b/simulink_export/rtGetNaN.cpp new file mode 100644 index 0000000..6a6133e --- /dev/null +++ b/simulink_export/rtGetNaN.cpp @@ -0,0 +1,106 @@ +/* + * rtGetNaN.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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +/* + * Abstract: + * Function to initialize non-finite, NaN + */ +#include "rtGetNaN.h" +#define NumBitsPerChar 8U + +extern "C" { + /* + * Initialize rtNaN needed by the generated code. + * NaN is initialized as non-signaling. Assumes IEEE. + */ + real_T rtGetNaN(void) + { + size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar); + real_T nan = 0.0; + if (bitsPerReal == 32U) { + nan = rtGetNaNF(); + } else { + uint16_T one = 1U; + enum { + LittleEndian, + BigEndian + } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian; + switch (machByteOrder) { + case LittleEndian: + { + union { + LittleEndianIEEEDouble bitVal; + real_T fltVal; + } tmpVal; + + tmpVal.bitVal.words.wordH = 0xFFF80000U; + tmpVal.bitVal.words.wordL = 0x00000000U; + nan = tmpVal.fltVal; + break; + } + + case BigEndian: + { + union { + BigEndianIEEEDouble bitVal; + real_T fltVal; + } tmpVal; + + tmpVal.bitVal.words.wordH = 0x7FFFFFFFU; + tmpVal.bitVal.words.wordL = 0xFFFFFFFFU; + nan = tmpVal.fltVal; + break; + } + } + } + + return nan; + } + + /* + * Initialize rtNaNF needed by the generated code. + * NaN is initialized as non-signaling. Assumes IEEE. + */ + real32_T rtGetNaNF(void) + { + IEEESingle nanF = { { 0.0F } }; + + uint16_T one = 1U; + enum { + LittleEndian, + BigEndian + } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian; + switch (machByteOrder) { + case LittleEndian: + { + nanF.wordL.wordLuint = 0xFFC00000U; + break; + } + + case BigEndian: + { + nanF.wordL.wordLuint = 0x7FFFFFFFU; + break; + } + } + + return nanF.wordL.wordLreal; + } +} diff --git a/simulink_export/rtGetNaN.h b/simulink_export/rtGetNaN.h new file mode 100644 index 0000000..d8c30f2 --- /dev/null +++ b/simulink_export/rtGetNaN.h @@ -0,0 +1,39 @@ +/* + * rtGetNaN.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTW_HEADER_rtGetNaN_h_ +#define RTW_HEADER_rtGetNaN_h_ +#include +#include "rtwtypes.h" +#include "rt_nonfinite.h" +#ifdef __cplusplus + +extern "C" { + +#endif + + extern real_T rtGetNaN(void); + extern real32_T rtGetNaNF(void); + +#ifdef __cplusplus + +} /* extern "C" */ +#endif +#endif /* RTW_HEADER_rtGetNaN_h_ */ diff --git a/simulink_export/rt_nonfinite.cpp b/simulink_export/rt_nonfinite.cpp new file mode 100644 index 0000000..2b8d081 --- /dev/null +++ b/simulink_export/rt_nonfinite.cpp @@ -0,0 +1,99 @@ +/* + * rt_nonfinite.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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +/* + * Abstract: + * Function to initialize non-finites, + * (Inf, NaN and -Inf). + */ +#include "rt_nonfinite.h" +#include "rtGetNaN.h" +#include "rtGetInf.h" +#define NumBitsPerChar 8U + +extern "C" { + real_T rtInf; + real_T rtMinusInf; + real_T rtNaN; + real32_T rtInfF; + real32_T rtMinusInfF; + real32_T rtNaNF; +} + extern "C" +{ + /* + * Initialize the rtInf, rtMinusInf, and rtNaN needed by the + * generated code. NaN is initialized as non-signaling. Assumes IEEE. + */ + void rt_InitInfAndNaN(size_t realSize) + { + (void) (realSize); + rtNaN = rtGetNaN(); + rtNaNF = rtGetNaNF(); + rtInf = rtGetInf(); + rtInfF = rtGetInfF(); + rtMinusInf = rtGetMinusInf(); + rtMinusInfF = rtGetMinusInfF(); + } + + /* Test if value is infinite */ + boolean_T rtIsInf(real_T value) + { + return (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U); + } + + /* Test if single-precision value is infinite */ + boolean_T rtIsInfF(real32_T value) + { + return (boolean_T)(((value)==rtInfF || (value)==rtMinusInfF) ? 1U : 0U); + } + + /* Test if value is not a number */ + boolean_T rtIsNaN(real_T value) + { + boolean_T result = (boolean_T) 0; + size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar); + if (bitsPerReal == 32U) { + result = rtIsNaNF((real32_T)value); + } else { + union { + LittleEndianIEEEDouble bitVal; + real_T fltVal; + } tmpVal; + + tmpVal.fltVal = value; + result = (boolean_T)((tmpVal.bitVal.words.wordH & 0x7FF00000) == + 0x7FF00000 && + ( (tmpVal.bitVal.words.wordH & 0x000FFFFF) != 0 || + (tmpVal.bitVal.words.wordL != 0) )); + } + + return result; + } + + /* Test if single-precision value is not a number */ + boolean_T rtIsNaNF(real32_T value) + { + IEEESingle tmp; + tmp.wordL.wordLreal = value; + return (boolean_T)( (tmp.wordL.wordLuint & 0x7F800000) == 0x7F800000 && + (tmp.wordL.wordLuint & 0x007FFFFF) != 0 ); + } +} diff --git a/simulink_export/rt_nonfinite.h b/simulink_export/rt_nonfinite.h new file mode 100644 index 0000000..d11aee4 --- /dev/null +++ b/simulink_export/rt_nonfinite.h @@ -0,0 +1,67 @@ +/* + * rt_nonfinite.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTW_HEADER_rt_nonfinite_h_ +#define RTW_HEADER_rt_nonfinite_h_ +#include +#include "rtwtypes.h" +#ifdef __cplusplus + +extern "C" { + +#endif + + extern real_T rtInf; + extern real_T rtMinusInf; + extern real_T rtNaN; + extern real32_T rtInfF; + extern real32_T rtMinusInfF; + extern real32_T rtNaNF; + extern void rt_InitInfAndNaN(size_t realSize); + extern boolean_T rtIsInf(real_T value); + extern boolean_T rtIsInfF(real32_T value); + extern boolean_T rtIsNaN(real_T value); + extern boolean_T rtIsNaNF(real32_T value); + struct BigEndianIEEEDouble { + struct { + uint32_T wordH; + uint32_T wordL; + } words; + }; + + struct LittleEndianIEEEDouble { + struct { + uint32_T wordL; + uint32_T wordH; + } words; + }; + + struct IEEESingle { + union { + real32_T wordLreal; + uint32_T wordLuint; + } wordL; + }; + +#ifdef __cplusplus + +} /* extern "C" */ +#endif +#endif /* RTW_HEADER_rt_nonfinite_h_ */ diff --git a/simulink_export/rtmodel.h b/simulink_export/rtmodel.h new file mode 100644 index 0000000..27bbeb4 --- /dev/null +++ b/simulink_export/rtmodel.h @@ -0,0 +1,38 @@ +/* + * rtmodel.h: + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTW_HEADER_rtmodel_h_ +#define RTW_HEADER_rtmodel_h_ + +/* + * Includes the appropriate headers when we are using rtModel + */ +#include "Arduino_skal.h" +#define MODEL_CLASSNAME Arduino_skalModelClass +#define MODEL_STEPNAME step +#define GRTINTERFACE 0 + +/* + * ROOT_IO_FORMAT: 0 (Individual arguments) + * ROOT_IO_FORMAT: 1 (Structure reference) + * ROOT_IO_FORMAT: 2 (Part of model data structure) + */ +#define ROOT_IO_FORMAT 2 +#endif /* RTW_HEADER_rtmodel_h_ */ diff --git a/simulink_export/rtw_proj.tmw b/simulink_export/rtw_proj.tmw new file mode 100644 index 0000000..dea505a --- /dev/null +++ b/simulink_export/rtw_proj.tmw @@ -0,0 +1,4 @@ +Simulink Coder project for Arduino_skal using . MATLAB root = C:\Program Files\MATLAB\R2021a. SimStruct date: 15-Nov-2020 02:10:14 +This file is generated by Simulink Coder for use by the make utility +to determine when to rebuild objects when the name of the current Simulink Coder project changes. +The rtwinfomat located at: ..\slprj\grt\Arduino_skal\tmwinternal\binfo.mat diff --git a/simulink_export/rtwtypes.h b/simulink_export/rtwtypes.h new file mode 100644 index 0000000..b83c205 --- /dev/null +++ b/simulink_export/rtwtypes.h @@ -0,0 +1,41 @@ +/* + * rtwtypes.h + * + * 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 "Arduino_skal". + * + * Model version : 1.1 + * Simulink Coder version : 9.5 (R2021a) 14-Nov-2020 + * C++ source code generated on : Thu Apr 15 15:56:50 2021 + * + * Target selection: grt.tlc + * Note: GRT includes extra infrastructure and instrumentation for prototyping + * Embedded hardware selection: Intel->x86-64 (Windows64) + * Code generation objective: Debugging + * Validation result: Not run + */ + +#ifndef RTWTYPES_H +#define RTWTYPES_H +#include "tmwtypes.h" +#ifndef POINTER_T +#define POINTER_T + +typedef void * pointer_T; + +#endif + +/* Logical type definitions */ +#if (!defined(__cplusplus)) +#ifndef false +#define false (0U) +#endif + +#ifndef true +#define true (1U) +#endif +#endif +#endif /* RTWTYPES_H */ diff --git a/simulink_export/rtwtypeschksum.mat b/simulink_export/rtwtypeschksum.mat new file mode 100644 index 0000000000000000000000000000000000000000..1b1dbeca36a13b674446fca74da39ba024a08d35 GIT binary patch literal 1511 zcmV_4ZaN@TXmub#aB?6qH6SrHIyE*rH8CJEFfuV9ARr(hARr(hARr(hARr(hARr(h zARr(hARr(hARr(hARr(hARr(B00000000000ZB~{0000h0RRAaoV}CJYr-%T$DgGW z$3%pkcI$CF2s=pGX}HaSf)25c!fwT6_JJlPjX$=3eAgv3oi-E;4lF#{_wDzSeEVox z05EU?>gwK5xo zE}i3?qn>IdoLjP=d%(3-_dx~MT(5#_7Pzb*p_EIS{eoq=>lNRtb9?{fCKb7FtlYX+ z=ZG#lkGluI<9EH=5EzDo0|tb9+3>iR0qh?}1_e6n6ChI`2buaDu;}9< zpbr#pAOHYZ&L%|<000030RRAaoTX7wOT#b_zK%LJk>R_)LGalpX9u!}iqy$o3N^IX zE|?`DN$L9LZ}FF!mbhioA;W`@yUXRv-F=w>z~=~HZ2iQ-hP_?5Jn(R7kqchZYROCS zb1#G&SO2njLcX91b0bs>$M#YyWbKk0tWZUwz(eV^mQpAaiLGR~J7UFT7uU?tMyTSE z8ts)5l#JwMDbu(mTgrJC_#>@Wums`Mj|E@yY+@ zeE37ht6w^Hxi43D{tZ@eMG6l9005K%004NL-B-zO+b|HN4JYVgqy>8Esr`jE35*az~EiAdoEnrN_CPGmLmmukv^mBU5vFI0-ltf#S6M0EoR2hJlpJqnnn>QlFJpjPZ zHvsJF>oYy7Ahw+ZS5l*{haiEXgk3t!597ERc$fIkbaERDGG=WkVJ{p(NkRrv*10A^ z5;k@xkYm&e5l(xLF>5M9rNi1@hp9k-oVPVm?6QshtiyUcT)N#68+fPQ%@m8A*CTYSIb-e-yVJ3-B zFz;bDmXpN$E#wkjP<$G4s_9gd(zS7z?h=fQATwG+fm`4EQ0nSA0nE!V6k4BHB^UE6 zGRo9rPmd2^-lw(Xe!5R<$<^3vjV_?T%kr$v^X{JSd3ABVN-D3a|5g5R-lpp;bKWjk zp7;I{=Ub;=ZtJVho3C%v_w~Qx<(!nB*UKC)gN><2< zZHd>q=S6)CUN|qV!{c^KJdT#|*a2C64ED`e_ycv>#(B-!JP)jtx9WVW=AFD2# Nu5;CT{sqh;e@2X^zaRhr literal 0 HcmV?d00001 diff --git a/simulink_export/tmwinternal/simulink_cache.xml b/simulink_export/tmwinternal/simulink_cache.xml new file mode 100644 index 0000000..85fc084 --- /dev/null +++ b/simulink_export/tmwinternal/simulink_cache.xml @@ -0,0 +1,6 @@ + + + + NHYGvrKIL3x9N9FasK5drmO/HHGvJHDPAa52dRgJB+/3PvNOTpeC5goiozX0WwLenYSrLEqjVul+DXF2dJorsA== + + \ No newline at end of file