ReduxLib C++ 2026.1.2
Loading...
Searching...
No Matches
DigoutSlot.h
1// Copyright (c) Bagholders of Redux Robotics and other contributors.
2// This is open source and can be modified and shared under the Mozilla Public License v2.0.
3
4#pragma once
5#include <cstdint>
6#include <algorithm>
7#include <cmath>
8#include "DigoutOperation.h"
9#include "DataSource.h"
10#include "NextSlotAction.h"
11
13
14/**
15 * One slot in a digital output logic chain.
16 *
17 * Slots are serialized to/from raw setting data via ToSettingData()/FromSettingData().
18 */
20 public:
21 /**
22 * Constructs a DigoutSlot.
23 * @param enabled slot enable
24 * @param nextSlotAction next slot action
25 * @param invertValue invert comparison result of slot
26 * @param opcode opcode
27 * @param additiveImmediate add value
28 * @param scalingImmediate scaling value
29 * @param lhsDataSource left-hand comparison datasource
30 * @param rhsDataSource right-hand comparison datasource
31 */
32 constexpr DigoutSlot(
33 const bool enabled = false,
34 const NextSlotAction nextSlotAction = NextSlotAction::kTerminateChain,
35 const bool invertValue = false,
36 const DigoutOperation opcode = DigoutOperation::kEquals,
37 const int32_t additiveImmediate = 0,
38 const uint8_t scalingImmediate = 0,
39 const DataSource lhsDataSource = DataSource::kZero,
40 const DataSource rhsDataSource = DataSource::kZero
41 ) :
50
51 /** Whether this slot is enabled. */
52 bool enabled{false};
53 /** How to combine this slot with the next slot. */
54 NextSlotAction nextSlotAction{NextSlotAction::kTerminateChain};
55 /** Whether to invert the computed slot boolean. */
56 bool invertValue{false};
57 /** Operation to perform for this slot. */
58 DigoutOperation opcode{DigoutOperation::kEquals};
59 /** Additive immediate value used by certain operations. */
61 /** Scaling immediate value used by certain operations. */
62 uint8_t scalingImmediate{0};
63 /** Left-hand-side data source. */
64 DataSource lhsDataSource{DataSource::kZero};
65 /** Right-hand-side data source. */
66 DataSource rhsDataSource{DataSource::kZero};
67
68 /**
69 * Converts a normalized floating-point value to the slot additive immediate encoding.
70 * @param value value clamped to [-1..1]
71 * @return encoded immediate
72 */
73 static int32_t ComputeAdditiveImmediate(double value);
74
75 /**
76 * Converts a normalized floating-point scaling factor to the slot multiplicative immediate encoding.
77 * @param value scaling factor clamped to [0..1]
78 * @return encoded scaling immediate
79 */
80 static uint8_t ComputeMultiplicativeImmediate(double value);
81
82 /**
83 * Converts a millisecond duration to the slot timing immediate encoding.
84 * @param value duration in milliseconds
85 * @return encoded timing immediate
86 */
87 static int32_t ComputeTimingImmediate(double value);
88
89 /**
90 * Serializes this slot into raw setting data expected by the device.
91 * @return raw setting data
92 */
93 uint64_t ToSettingData() const;
94
95 /**
96 * Deserializes a slot from raw setting data.
97 * @param data raw setting data
98 * @return DigoutSlot decoded
99 */
100 static DigoutSlot FromSettingData(uint64_t data);
101
102 /**
103 * Returns a disabled slot.
104 * @return disabled slot
105 */
107};
108
109} // namespace redux::sensors::canandcolor
Definition DigoutSlot.h:19
int32_t additiveImmediate
Definition DigoutSlot.h:60
static int32_t ComputeAdditiveImmediate(double value)
uint8_t scalingImmediate
Definition DigoutSlot.h:62
bool enabled
Definition DigoutSlot.h:52
NextSlotAction nextSlotAction
Definition DigoutSlot.h:54
DataSource lhsDataSource
Definition DigoutSlot.h:64
bool invertValue
Definition DigoutSlot.h:56
static uint8_t ComputeMultiplicativeImmediate(double value)
DigoutOperation opcode
Definition DigoutSlot.h:58
static DigoutSlot FromSettingData(uint64_t data)
static int32_t ComputeTimingImmediate(double value)
constexpr DigoutSlot(const bool enabled=false, const NextSlotAction nextSlotAction=NextSlotAction::kTerminateChain, const bool invertValue=false, const DigoutOperation opcode=DigoutOperation::kEquals, const int32_t additiveImmediate=0, const uint8_t scalingImmediate=0, const DataSource lhsDataSource=DataSource::kZero, const DataSource rhsDataSource=DataSource::kZero)
Definition DigoutSlot.h:32
DataSource rhsDataSource
Definition DigoutSlot.h:66
Definition Canandcolor.h:19
DataSource
Definition DataSource.h:15
DigoutOperation
Definition DigoutOperation.h:14
NextSlotAction
Definition NextSlotAction.h:12