telemetry

Dependents:   Everything Sequential_Timing FixedPWM FixedPWMWill

Committer:
vsutardja
Date:
Fri Mar 18 22:33:32 2016 +0000
Revision:
0:aca5a32d2759
init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsutardja 0:aca5a32d2759 1 #ifndef _TELEMETRY_H_
vsutardja 0:aca5a32d2759 2 #define _TELEMETRY_H_
vsutardja 0:aca5a32d2759 3
vsutardja 0:aca5a32d2759 4 #include <stddef.h>
vsutardja 0:aca5a32d2759 5 #include <stdint.h>
vsutardja 0:aca5a32d2759 6
vsutardja 0:aca5a32d2759 7 // Maximum number of Data objects a Telemetry object can hold.
vsutardja 0:aca5a32d2759 8 // Default given here, but can be redefined with a compiler define.
vsutardja 0:aca5a32d2759 9 #ifndef TELEMETRY_DATA_LIMIT
vsutardja 0:aca5a32d2759 10 #define TELEMETRY_DATA_LIMIT 16
vsutardja 0:aca5a32d2759 11 #endif
vsutardja 0:aca5a32d2759 12
vsutardja 0:aca5a32d2759 13 #ifndef TELEMETRY_SERIAL_RX_BUFFER_SIZE
vsutardja 0:aca5a32d2759 14 #define TELEMETRY_SERIAL_RX_BUFFER_SIZE 256
vsutardja 0:aca5a32d2759 15 #endif
vsutardja 0:aca5a32d2759 16
vsutardja 0:aca5a32d2759 17 namespace telemetry {
vsutardja 0:aca5a32d2759 18 // Maximum number of Data objects a Telemetry object can hold.
vsutardja 0:aca5a32d2759 19 // Used for array sizing.
vsutardja 0:aca5a32d2759 20 const size_t MAX_DATA_PER_TELEMETRY = TELEMETRY_DATA_LIMIT;
vsutardja 0:aca5a32d2759 21
vsutardja 0:aca5a32d2759 22 // Maximum payload size for a received telemetry packet.
vsutardja 0:aca5a32d2759 23 const size_t MAX_RECEIVE_PACKET_LENGTH = 255;
vsutardja 0:aca5a32d2759 24
vsutardja 0:aca5a32d2759 25 // Time after which a partially received packet is discarded.
vsutardja 0:aca5a32d2759 26 const uint32_t DECODER_TIMEOUT_MS = 100;
vsutardja 0:aca5a32d2759 27
vsutardja 0:aca5a32d2759 28 // Buffer size for received non-telemetry data.
vsutardja 0:aca5a32d2759 29 const size_t SERIAL_RX_BUFFER_SIZE = TELEMETRY_SERIAL_RX_BUFFER_SIZE;
vsutardja 0:aca5a32d2759 30 }
vsutardja 0:aca5a32d2759 31
vsutardja 0:aca5a32d2759 32 #ifdef ARDUINO
vsutardja 0:aca5a32d2759 33 #ifdef TELEMETRY_HAL
vsutardja 0:aca5a32d2759 34 #error "Multiple telemetry HALs defined"
vsutardja 0:aca5a32d2759 35 #endif
vsutardja 0:aca5a32d2759 36 #include "telemetry-arduino-hal.h"
vsutardja 0:aca5a32d2759 37 #endif
vsutardja 0:aca5a32d2759 38
vsutardja 0:aca5a32d2759 39 #if defined(__MBED__)
vsutardja 0:aca5a32d2759 40 #ifdef TELEMETRY_HAL
vsutardja 0:aca5a32d2759 41 #error "Multiple telemetry HALs defined"
vsutardja 0:aca5a32d2759 42 #endif
vsutardja 0:aca5a32d2759 43 #include "telemetry-mbed-hal.h"
vsutardja 0:aca5a32d2759 44 #endif
vsutardja 0:aca5a32d2759 45
vsutardja 0:aca5a32d2759 46 #ifndef TELEMETRY_HAL
vsutardja 0:aca5a32d2759 47 #error "No telemetry HAL defined"
vsutardja 0:aca5a32d2759 48 #endif
vsutardja 0:aca5a32d2759 49
vsutardja 0:aca5a32d2759 50 #include "protocol.h"
vsutardja 0:aca5a32d2759 51 #include "packet.h"
vsutardja 0:aca5a32d2759 52 #include "queue.h"
vsutardja 0:aca5a32d2759 53
vsutardja 0:aca5a32d2759 54 namespace telemetry {
vsutardja 0:aca5a32d2759 55 // Abstract base class for telemetry data objects.
vsutardja 0:aca5a32d2759 56 class Data {
vsutardja 0:aca5a32d2759 57 public:
vsutardja 0:aca5a32d2759 58 Data(const char* internal_name, const char* display_name,
vsutardja 0:aca5a32d2759 59 const char* units):
vsutardja 0:aca5a32d2759 60 internal_name(internal_name),
vsutardja 0:aca5a32d2759 61 display_name(display_name),
vsutardja 0:aca5a32d2759 62 units(units) {};
vsutardja 0:aca5a32d2759 63
vsutardja 0:aca5a32d2759 64 virtual ~Data() {}
vsutardja 0:aca5a32d2759 65
vsutardja 0:aca5a32d2759 66 // Returns the data type code.
vsutardja 0:aca5a32d2759 67 virtual uint8_t get_data_type() = 0;
vsutardja 0:aca5a32d2759 68
vsutardja 0:aca5a32d2759 69 // Returns the length of the header KVRs, in bytes. Does not include the
vsutardja 0:aca5a32d2759 70 // terminator header.
vsutardja 0:aca5a32d2759 71 virtual size_t get_header_kvrs_length();
vsutardja 0:aca5a32d2759 72 // Writes the header KVRs to the transmit packet. Does not write the
vsutardja 0:aca5a32d2759 73 // terminiator header.
vsutardja 0:aca5a32d2759 74 virtual void write_header_kvrs(TransmitPacket& packet);
vsutardja 0:aca5a32d2759 75
vsutardja 0:aca5a32d2759 76 // Returns the length of the payload, in bytes. Should be "fast".
vsutardja 0:aca5a32d2759 77 virtual size_t get_payload_length() = 0;
vsutardja 0:aca5a32d2759 78 // Writes the payload to the transmit packet. Should be "fast".
vsutardja 0:aca5a32d2759 79 virtual void write_payload(TransmitPacket& packet) = 0;
vsutardja 0:aca5a32d2759 80
vsutardja 0:aca5a32d2759 81 // Sets my value from the received packet, interpreting the current packet
vsutardja 0:aca5a32d2759 82 // read position as my data type.
vsutardja 0:aca5a32d2759 83 virtual void set_from_packet(ReceivePacketBuffer& packet) = 0;
vsutardja 0:aca5a32d2759 84
vsutardja 0:aca5a32d2759 85 protected:
vsutardja 0:aca5a32d2759 86 const char* internal_name;
vsutardja 0:aca5a32d2759 87 const char* display_name;
vsutardja 0:aca5a32d2759 88 const char* units;
vsutardja 0:aca5a32d2759 89 };
vsutardja 0:aca5a32d2759 90
vsutardja 0:aca5a32d2759 91 // Telemetry Server object.
vsutardja 0:aca5a32d2759 92 class Telemetry {
vsutardja 0:aca5a32d2759 93 public:
vsutardja 0:aca5a32d2759 94 Telemetry(HalInterface& hal) :
vsutardja 0:aca5a32d2759 95 hal(hal),
vsutardja 0:aca5a32d2759 96 data_count(0),
vsutardja 0:aca5a32d2759 97 received_packet(ReceivePacketBuffer(hal)),
vsutardja 0:aca5a32d2759 98 decoder_state(SOF),
vsutardja 0:aca5a32d2759 99 decoder_pos(0),
vsutardja 0:aca5a32d2759 100 packet_length(0),
vsutardja 0:aca5a32d2759 101 decoder_last_received(false),
vsutardja 0:aca5a32d2759 102 decoder_last_receive_ms(0),
vsutardja 0:aca5a32d2759 103 header_transmitted(false),
vsutardja 0:aca5a32d2759 104 packet_tx_sequence(0),
vsutardja 0:aca5a32d2759 105 packet_rx_sequence(0) {};
vsutardja 0:aca5a32d2759 106
vsutardja 0:aca5a32d2759 107 // Associates a DataInterface with this object, returning the data ID.
vsutardja 0:aca5a32d2759 108 size_t add_data(Data& new_data);
vsutardja 0:aca5a32d2759 109
vsutardja 0:aca5a32d2759 110 // Marks a data ID as updated, to be transmitted in the next packet.
vsutardja 0:aca5a32d2759 111 void mark_data_updated(size_t data_id);
vsutardja 0:aca5a32d2759 112
vsutardja 0:aca5a32d2759 113 // Transmits header data. Must be called after all add_data calls are done
vsutardja 0:aca5a32d2759 114 // and before and IO is done.
vsutardja 0:aca5a32d2759 115 void transmit_header();
vsutardja 0:aca5a32d2759 116
vsutardja 0:aca5a32d2759 117 // Does IO, including transmitting telemetry packets. Should be called on
vsutardja 0:aca5a32d2759 118 // a regular basis. Since this does IO, this may block depending on the HAL
vsutardja 0:aca5a32d2759 119 // semantics.
vsutardja 0:aca5a32d2759 120 void do_io();
vsutardja 0:aca5a32d2759 121
vsutardja 0:aca5a32d2759 122 // TODO: better docs defining in-band receive.
vsutardja 0:aca5a32d2759 123 // Returns whether or not read_receive will return valid data.
vsutardja 0:aca5a32d2759 124 bool receive_available();
vsutardja 0:aca5a32d2759 125 // Returns the next byte in the receive stream.
vsutardja 0:aca5a32d2759 126 uint8_t read_receive();
vsutardja 0:aca5a32d2759 127
vsutardja 0:aca5a32d2759 128 // Calls the HAL's error function if some condition is false.
vsutardja 0:aca5a32d2759 129 void do_error(const char* message) {
vsutardja 0:aca5a32d2759 130 hal.do_error(message);
vsutardja 0:aca5a32d2759 131 }
vsutardja 0:aca5a32d2759 132
vsutardja 0:aca5a32d2759 133 protected:
vsutardja 0:aca5a32d2759 134 // Transmits any updated data.
vsutardja 0:aca5a32d2759 135 void transmit_data();
vsutardja 0:aca5a32d2759 136
vsutardja 0:aca5a32d2759 137 // Handles received data, splitting regular UART data from in-band packet
vsutardja 0:aca5a32d2759 138 // data and processing received telemetry packets.
vsutardja 0:aca5a32d2759 139 void process_received_data();
vsutardja 0:aca5a32d2759 140
vsutardja 0:aca5a32d2759 141 // Handles a received packet in received_packet.
vsutardja 0:aca5a32d2759 142 void process_received_packet();
vsutardja 0:aca5a32d2759 143
vsutardja 0:aca5a32d2759 144 HalInterface& hal;
vsutardja 0:aca5a32d2759 145
vsutardja 0:aca5a32d2759 146 // Array of associated DataInterface objects. The index+1 is the
vsutardja 0:aca5a32d2759 147 // DataInterface's data ID field.
vsutardja 0:aca5a32d2759 148 Data* data[MAX_DATA_PER_TELEMETRY];
vsutardja 0:aca5a32d2759 149 // Whether each data has been updated or not.
vsutardja 0:aca5a32d2759 150 bool data_updated[MAX_DATA_PER_TELEMETRY];
vsutardja 0:aca5a32d2759 151 // Count of associated DataInterface objects.
vsutardja 0:aca5a32d2759 152 size_t data_count;
vsutardja 0:aca5a32d2759 153
vsutardja 0:aca5a32d2759 154 // Buffer holding the receive packet being assembled / parsed.
vsutardja 0:aca5a32d2759 155 ReceivePacketBuffer received_packet;
vsutardja 0:aca5a32d2759 156
vsutardja 0:aca5a32d2759 157 enum DecoderState {
vsutardja 0:aca5a32d2759 158 SOF, // reading start-of-frame sequence (or just non-telemetry data)
vsutardja 0:aca5a32d2759 159 LENGTH, // reading packet length
vsutardja 0:aca5a32d2759 160 DATA, // reading telemetry packet data
vsutardja 0:aca5a32d2759 161 DATA_DESTUFF, // reading a stuffed byte
vsutardja 0:aca5a32d2759 162 DATA_DESTUFF_END // last stuffed byte in a packet
vsutardja 0:aca5a32d2759 163 } decoder_state;
vsutardja 0:aca5a32d2759 164
vsutardja 0:aca5a32d2759 165 size_t decoder_pos;
vsutardja 0:aca5a32d2759 166 size_t packet_length;
vsutardja 0:aca5a32d2759 167 bool decoder_last_received;
vsutardja 0:aca5a32d2759 168 uint32_t decoder_last_receive_ms;
vsutardja 0:aca5a32d2759 169
vsutardja 0:aca5a32d2759 170 Queue<uint8_t, SERIAL_RX_BUFFER_SIZE> rx_buffer;
vsutardja 0:aca5a32d2759 171
vsutardja 0:aca5a32d2759 172 bool header_transmitted;
vsutardja 0:aca5a32d2759 173
vsutardja 0:aca5a32d2759 174 // Sequence number of the next packet to be transmitted.
vsutardja 0:aca5a32d2759 175 uint8_t packet_tx_sequence;
vsutardja 0:aca5a32d2759 176 uint8_t packet_rx_sequence; // TODO use this somewhere
vsutardja 0:aca5a32d2759 177 };
vsutardja 0:aca5a32d2759 178
vsutardja 0:aca5a32d2759 179 template <typename T>
vsutardja 0:aca5a32d2759 180 class Numeric : public Data {
vsutardja 0:aca5a32d2759 181 public:
vsutardja 0:aca5a32d2759 182 Numeric(Telemetry& telemetry_container,
vsutardja 0:aca5a32d2759 183 const char* internal_name, const char* display_name,
vsutardja 0:aca5a32d2759 184 const char* units, T init_value):
vsutardja 0:aca5a32d2759 185 Data(internal_name, display_name, units),
vsutardja 0:aca5a32d2759 186 telemetry_container(telemetry_container),
vsutardja 0:aca5a32d2759 187 value(init_value), min_val(init_value), max_val(init_value) {
vsutardja 0:aca5a32d2759 188 data_id = telemetry_container.add_data(*this);
vsutardja 0:aca5a32d2759 189 }
vsutardja 0:aca5a32d2759 190
vsutardja 0:aca5a32d2759 191 T operator = (T b) {
vsutardja 0:aca5a32d2759 192 value = b;
vsutardja 0:aca5a32d2759 193 telemetry_container.mark_data_updated(data_id);
vsutardja 0:aca5a32d2759 194 return b;
vsutardja 0:aca5a32d2759 195 }
vsutardja 0:aca5a32d2759 196
vsutardja 0:aca5a32d2759 197 operator T() {
vsutardja 0:aca5a32d2759 198 return value;
vsutardja 0:aca5a32d2759 199 }
vsutardja 0:aca5a32d2759 200
vsutardja 0:aca5a32d2759 201 Numeric<T>& set_limits(T min, T max) {
vsutardja 0:aca5a32d2759 202 min_val = min;
vsutardja 0:aca5a32d2759 203 max_val = max;
vsutardja 0:aca5a32d2759 204 return *this;
vsutardja 0:aca5a32d2759 205 }
vsutardja 0:aca5a32d2759 206
vsutardja 0:aca5a32d2759 207 uint8_t get_data_type() { return protocol::DATATYPE_NUMERIC; }
vsutardja 0:aca5a32d2759 208
vsutardja 0:aca5a32d2759 209 size_t get_header_kvrs_length() {
vsutardja 0:aca5a32d2759 210 return Data::get_header_kvrs_length()
vsutardja 0:aca5a32d2759 211 + 1 + 1 // subtype
vsutardja 0:aca5a32d2759 212 + 1 + 1 // data length
vsutardja 0:aca5a32d2759 213 + 1 + sizeof(value) + sizeof(value); // limits
vsutardja 0:aca5a32d2759 214 }
vsutardja 0:aca5a32d2759 215
vsutardja 0:aca5a32d2759 216 void write_header_kvrs(TransmitPacket& packet) {
vsutardja 0:aca5a32d2759 217 Data::write_header_kvrs(packet);
vsutardja 0:aca5a32d2759 218 packet.write_uint8(protocol::RECORDID_NUMERIC_SUBTYPE);
vsutardja 0:aca5a32d2759 219 packet.write_uint8(protocol::numeric_subtype<T>());
vsutardja 0:aca5a32d2759 220 packet.write_uint8(protocol::RECORDID_NUMERIC_LENGTH);
vsutardja 0:aca5a32d2759 221 packet.write_uint8(sizeof(value));
vsutardja 0:aca5a32d2759 222 packet.write_uint8(protocol::RECORDID_NUMERIC_LIMITS);
vsutardja 0:aca5a32d2759 223 serialize_data(min_val, packet);
vsutardja 0:aca5a32d2759 224 serialize_data(max_val, packet);
vsutardja 0:aca5a32d2759 225 }
vsutardja 0:aca5a32d2759 226
vsutardja 0:aca5a32d2759 227 size_t get_payload_length() { return sizeof(value); }
vsutardja 0:aca5a32d2759 228 void write_payload(TransmitPacket& packet) { serialize_data(value, packet); }
vsutardja 0:aca5a32d2759 229 void set_from_packet(ReceivePacketBuffer& packet) {
vsutardja 0:aca5a32d2759 230 value = deserialize_data(packet);
vsutardja 0:aca5a32d2759 231 telemetry_container.mark_data_updated(data_id); }
vsutardja 0:aca5a32d2759 232
vsutardja 0:aca5a32d2759 233 void serialize_data(T value, TransmitPacket& packet) {
vsutardja 0:aca5a32d2759 234 packet.write<T>(value);
vsutardja 0:aca5a32d2759 235 }
vsutardja 0:aca5a32d2759 236 T deserialize_data(ReceivePacketBuffer& packet) {
vsutardja 0:aca5a32d2759 237 return packet.read<T>();
vsutardja 0:aca5a32d2759 238 }
vsutardja 0:aca5a32d2759 239
vsutardja 0:aca5a32d2759 240
vsutardja 0:aca5a32d2759 241 protected:
vsutardja 0:aca5a32d2759 242 Telemetry& telemetry_container;
vsutardja 0:aca5a32d2759 243 size_t data_id;
vsutardja 0:aca5a32d2759 244 T value;
vsutardja 0:aca5a32d2759 245 T min_val, max_val;
vsutardja 0:aca5a32d2759 246 };
vsutardja 0:aca5a32d2759 247
vsutardja 0:aca5a32d2759 248 template <typename T, uint32_t array_count>
vsutardja 0:aca5a32d2759 249 class NumericArrayAccessor;
vsutardja 0:aca5a32d2759 250
vsutardja 0:aca5a32d2759 251 template <typename T, uint32_t array_count>
vsutardja 0:aca5a32d2759 252 class NumericArray : public Data {
vsutardja 0:aca5a32d2759 253 friend class NumericArrayAccessor<T, array_count>;
vsutardja 0:aca5a32d2759 254 public:
vsutardja 0:aca5a32d2759 255 NumericArray(Telemetry& telemetry_container,
vsutardja 0:aca5a32d2759 256 const char* internal_name, const char* display_name,
vsutardja 0:aca5a32d2759 257 const char* units, T elem_init_value):
vsutardja 0:aca5a32d2759 258 Data(internal_name, display_name, units),
vsutardja 0:aca5a32d2759 259 telemetry_container(telemetry_container),
vsutardja 0:aca5a32d2759 260 min_val(elem_init_value), max_val(elem_init_value) {
vsutardja 0:aca5a32d2759 261 for (size_t i=0; i<array_count; i++) {
vsutardja 0:aca5a32d2759 262 value[i] = elem_init_value;
vsutardja 0:aca5a32d2759 263 }
vsutardja 0:aca5a32d2759 264 data_id = telemetry_container.add_data(*this);
vsutardja 0:aca5a32d2759 265 }
vsutardja 0:aca5a32d2759 266
vsutardja 0:aca5a32d2759 267 NumericArrayAccessor<T, array_count> operator[] (const int index) {
vsutardja 0:aca5a32d2759 268 // TODO: add bounds checking here?
vsutardja 0:aca5a32d2759 269 return NumericArrayAccessor<T, array_count>(*this, index);
vsutardja 0:aca5a32d2759 270 }
vsutardja 0:aca5a32d2759 271
vsutardja 0:aca5a32d2759 272 NumericArray<T, array_count>& set_limits(T min, T max) {
vsutardja 0:aca5a32d2759 273 min_val = min;
vsutardja 0:aca5a32d2759 274 max_val = max;
vsutardja 0:aca5a32d2759 275 return *this;
vsutardja 0:aca5a32d2759 276 }
vsutardja 0:aca5a32d2759 277
vsutardja 0:aca5a32d2759 278 uint8_t get_data_type() { return protocol::DATATYPE_NUMERIC_ARRAY; }
vsutardja 0:aca5a32d2759 279
vsutardja 0:aca5a32d2759 280 size_t get_header_kvrs_length() {
vsutardja 0:aca5a32d2759 281 return Data::get_header_kvrs_length()
vsutardja 0:aca5a32d2759 282 + 1 + 1 // subtype
vsutardja 0:aca5a32d2759 283 + 1 + 1 // data length
vsutardja 0:aca5a32d2759 284 + 1 + 4 // array length
vsutardja 0:aca5a32d2759 285 + 1 + sizeof(value[0]) + sizeof(value[0]); // limits
vsutardja 0:aca5a32d2759 286 }
vsutardja 0:aca5a32d2759 287
vsutardja 0:aca5a32d2759 288 void write_header_kvrs(TransmitPacket& packet) {
vsutardja 0:aca5a32d2759 289 Data::write_header_kvrs(packet);
vsutardja 0:aca5a32d2759 290 packet.write_uint8(protocol::RECORDID_NUMERIC_SUBTYPE);
vsutardja 0:aca5a32d2759 291 packet.write_uint8(protocol::numeric_subtype<T>());
vsutardja 0:aca5a32d2759 292 packet.write_uint8(protocol::RECORDID_NUMERIC_LENGTH);
vsutardja 0:aca5a32d2759 293 packet.write_uint8(sizeof(value[0]));
vsutardja 0:aca5a32d2759 294 packet.write_uint8(protocol::RECORDID_ARRAY_COUNT);
vsutardja 0:aca5a32d2759 295 packet.write_uint32(array_count);
vsutardja 0:aca5a32d2759 296 packet.write_uint8(protocol::RECORDID_NUMERIC_LIMITS);
vsutardja 0:aca5a32d2759 297 serialize_data(min_val, packet);
vsutardja 0:aca5a32d2759 298 serialize_data(max_val, packet);
vsutardja 0:aca5a32d2759 299 }
vsutardja 0:aca5a32d2759 300
vsutardja 0:aca5a32d2759 301 size_t get_payload_length() { return sizeof(value); }
vsutardja 0:aca5a32d2759 302 void write_payload(TransmitPacket& packet) {
vsutardja 0:aca5a32d2759 303 for (size_t i=0; i<array_count; i++) { serialize_data(this->value[i], packet); } }
vsutardja 0:aca5a32d2759 304 void set_from_packet(ReceivePacketBuffer& packet) {
vsutardja 0:aca5a32d2759 305 for (size_t i=0; i<array_count; i++) { value[i] = deserialize_data(packet); }
vsutardja 0:aca5a32d2759 306 telemetry_container.mark_data_updated(data_id); }
vsutardja 0:aca5a32d2759 307
vsutardja 0:aca5a32d2759 308 void serialize_data(T data, TransmitPacket& packet) {
vsutardja 0:aca5a32d2759 309 packet.write<T>(data); }
vsutardja 0:aca5a32d2759 310 T deserialize_data(ReceivePacketBuffer& packet) {
vsutardja 0:aca5a32d2759 311 return packet.read<T>(); }
vsutardja 0:aca5a32d2759 312
vsutardja 0:aca5a32d2759 313 protected:
vsutardja 0:aca5a32d2759 314 Telemetry& telemetry_container;
vsutardja 0:aca5a32d2759 315 size_t data_id;
vsutardja 0:aca5a32d2759 316 T value[array_count];
vsutardja 0:aca5a32d2759 317 T min_val, max_val;
vsutardja 0:aca5a32d2759 318 };
vsutardja 0:aca5a32d2759 319
vsutardja 0:aca5a32d2759 320 template <typename T, uint32_t array_count>
vsutardja 0:aca5a32d2759 321 class NumericArrayAccessor {
vsutardja 0:aca5a32d2759 322 public:
vsutardja 0:aca5a32d2759 323 NumericArrayAccessor(NumericArray<T, array_count>& container, size_t index) :
vsutardja 0:aca5a32d2759 324 container(container), index(index) { }
vsutardja 0:aca5a32d2759 325
vsutardja 0:aca5a32d2759 326 T operator = (T b) {
vsutardja 0:aca5a32d2759 327 container.value[index] = b;
vsutardja 0:aca5a32d2759 328 container.telemetry_container.mark_data_updated(container.data_id);
vsutardja 0:aca5a32d2759 329 return b;
vsutardja 0:aca5a32d2759 330 }
vsutardja 0:aca5a32d2759 331
vsutardja 0:aca5a32d2759 332 operator T() {
vsutardja 0:aca5a32d2759 333 return container.value[index];
vsutardja 0:aca5a32d2759 334 }
vsutardja 0:aca5a32d2759 335
vsutardja 0:aca5a32d2759 336 protected:
vsutardja 0:aca5a32d2759 337 NumericArray<T, array_count>& container;
vsutardja 0:aca5a32d2759 338 size_t index;
vsutardja 0:aca5a32d2759 339 };
vsutardja 0:aca5a32d2759 340
vsutardja 0:aca5a32d2759 341 }
vsutardja 0:aca5a32d2759 342
vsutardja 0:aca5a32d2759 343 #endif