197#include "SampleClock.h"
198#include "SensorFrame.h"
199#include "SensorNoise.h"
201#include <fhsim/simobject/SimObject.h>
206class EnvironmentProvider;
246 SensorCtd(std::string simObjectName, ISimObjectCreator* creator);
268 static double LagDerivative(
double fieldValue,
double lagState,
double timeConstant);
277 static double MeasuredValueOf(
double lagState,
double fieldValue,
double timeConstant);
285 static double Quantize(
double value,
double resolution);
304 void OdeFcn(
const double dT,
const double*
const adX,
double*
const adXDot)
const override;
321 double*
const adUpdatedIC, ISimObjectCreator*
const creator)
override;
329 void FinalSetup(
const double dT,
const double*
const adX, ISimObjectCreator*
const creator)
override;
331#ifdef FH_VISUALIZATION
332 void RenderInit(Ogre::Root*
const ogreRoot, ISimObjectCreator*
const creator)
override { }
333 void RenderUpdate(
const double dT,
const double*
const adX)
override { }
345 bool SampleIfDue(
double t,
double temperature,
double salinity,
double depth,
const double position[3]);
354 void Update(
double temperature,
double salinity,
double depth,
const double position[3]);
370 const double*
OutSalinity(
const double dT,
const double*
const adX);
373 const double*
OutDepth(
const double dT,
const double*
const adX);
376 const double*
OutPressure(
const double dT,
const double*
const adX);
382 const double*
OutPosition(
const double dT,
const double*
const adX);
388 double temperature = 0.0;
389 double salinity = 0.0;
396 void ResolveEnvironment(ISimObjectCreator*
const creator);
404 FieldValues FieldValuesAt(
double dT,
const double position[3])
const;
413 void StoreReading(
double temperature,
double salinity,
double depth,
const double position[3]);
420 void SeedHeldReading(
double dT,
const double*
const adX);
429 static void SetInitialConditionIfUnset(
const double*
const adCurrentIC,
double*
const adUpdatedIC,
430 int stateIndex,
double value);
438 std::string m_temperatureFieldName;
439 std::string m_salinityFieldName;
441 environment::EnvironmentProvider* m_environment =
nullptr;
442 int m_temperatureHandle = -1;
443 int m_salinityHandle = -1;
445 bool m_hasPorts =
false;
447 int m_IStateLagT = 0;
448 int m_IStateLagS = 0;
449 int m_IStateLagD = 0;
452 double m_measurement[3] = {0.0, 0.0, 0.0};
Definition SampleClock.h:40
double NextSampleTime() const
The time at which the next sample is due, s.
Definition SampleClock.h:76
Definition SensorCtd.h:210
const Settings & GetSettings() const
The settings the instrument was built with.
Definition SensorCtd.h:360
const double * OutDepth(const double dT, const double *const adX)
The measured depth of the sensor head, m.
static double Quantize(double value, double resolution)
const double * OutPressure(const double dT, const double *const adX)
The measured pressure, dbar.
void FinalSetup(const double dT, const double *const adX, ISimObjectCreator *const creator) override
double NextSampleTime() const
The time at which the next sample is due, s.
Definition SensorCtd.h:363
bool SampleIfDue(double t, double temperature, double salinity, double depth, const double position[3])
static double LagDerivative(double fieldValue, double lagState, double timeConstant)
const double * OutSalinity(const double dT, const double *const adX)
The measured salinity, PSU.
void InitialConditionSetup(const double dT, const double *const adCurrentIC, double *const adUpdatedIC, ISimObjectCreator *const creator) override
const double * OutTemperature(const double dT, const double *const adX)
The measured water temperature, degC.
const double * OutMeasurement(const double dT, const double *const adX)
The three measurements as [Salinity, Temperature, Depth].
void Update(double temperature, double salinity, double depth, const double position[3])
SensorCtd(std::string simObjectName, const Settings &settings)
static double Perturb(double trueValue, const Channel &channel, SensorNoise &noise)
const double * OutPosition(const double dT, const double *const adX)
The NED position the held sample was taken at, m.
static double MeasuredValueOf(double lagState, double fieldValue, double timeConstant)
static double PressureOf(double depth)
const Reading & HeldReading() const
The reading currently held on the output ports.
Definition SensorCtd.h:357
void AcceptedStep(const double dT, const double *const adX) override
void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
Writes the three lag derivatives and nothing else.
SensorCtd(std::string simObjectName, ISimObjectCreator *creator)
Definition SensorFrame.h:36
Definition SensorNoise.h:39
The instrument imperfections of one measured channel.
Definition SensorCtd.h:214
double noiseStd
The standard deviation of the Gaussian noise, in the channel's unit.
Definition SensorCtd.h:217
double resolution
The quantisation step, in the channel's unit. Zero means none.
Definition SensorCtd.h:218
double timeConstant
The first-order lag time constant, s. Zero means no lag.
Definition SensorCtd.h:215
double bias
The constant offset added at every sample, in the channel's unit.
Definition SensorCtd.h:216
One held instrument reading.
Definition SensorCtd.h:233
double pressure
The reported pressure, dbar.
Definition SensorCtd.h:237
double position[3]
The NED position the sample was taken at, m.
Definition SensorCtd.h:238
double salinity
The reported salinity, PSU.
Definition SensorCtd.h:235
double depth
The reported depth, m.
Definition SensorCtd.h:236
double temperature
The reported temperature, degC.
Definition SensorCtd.h:234
Everything that makes one instrument out of the shared sensor machinery.
Definition SensorCtd.h:223
Channel salinity
The salinity channel, PSU.
Definition SensorCtd.h:225
Channel depth
The depth channel, m.
Definition SensorCtd.h:226
unsigned int noiseSeed
The random seed; zero is deterministic and noise free.
Definition SensorCtd.h:228
double samplePeriod
The time between samples, s.
Definition SensorCtd.h:227
Channel temperature
The temperature channel, degC.
Definition SensorCtd.h:224