Skip to content

Commit e5e2724

Browse files
committed
🎨 WIP, analogio - Encode, publish voltage event
1 parent eb6bf12 commit e5e2724

File tree

6 files changed

+90
-25
lines changed

6 files changed

+90
-25
lines changed

src/components/analogIO/controller.cpp

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ bool AnalogIOController::Handle_AnalogIOAdd(pb_istream_t *stream) {
4040
}
4141

4242
// Get the pin name
43-
int pin_name = atoi(_analogio_model->GetAnalogIOAddMsg()->pin_name + 1);
43+
uint8_t pin_name = atoi(_analogio_model->GetAnalogIOAddMsg()->pin_name + 1);
4444

4545
// Create a new analogioPin object
4646
// TODO: Replicate this within the digitalio controller, much cleaner way to
@@ -85,7 +85,35 @@ bool AnalogIOController::Handle_AnalogIORemove(pb_istream_t *stream) {
8585
}
8686

8787
bool AnalogIOController::IsPinTimerExpired(analogioPin *pin, ulong cur_time) {
88-
return cur_time - pin->prv_pin_time > pin->pin_period;
88+
return cur_time - pin->prv_period > pin->period;
89+
}
90+
91+
bool AnalogIOController::EncodePublishPinValue(uint8_t pin, uint16_t value) {
92+
// TODO!
93+
return true;
94+
}
95+
96+
bool AnalogIOController::EncodePublishPinVoltage(uint8_t pin, float value) {
97+
char c_pin_name[12];
98+
sprintf(c_pin_name, "D%d", pin);
99+
100+
// Encode the DigitalIOEvent message
101+
if (!_analogio_model->EncodeAnalogIOVoltageEvent(c_pin_name, value)) {
102+
WS_DEBUG_PRINTLN("ERROR: Unable to encode DigitalIOEvent message!");
103+
return false;
104+
}
105+
106+
// Publish the DigitalIOEvent message to the broker
107+
if (!WsV2.PublishSignal(
108+
wippersnapper_signal_DeviceToBroker_digitalio_event_tag,
109+
_analogio_model->GetAnalogIOEvent())) {
110+
WS_DEBUG_PRINTLN("ERROR: Unable to publish analogio voltage event message, "
111+
"moving onto the next pin!");
112+
return false;
113+
}
114+
WS_DEBUG_PRINTLN("Published AnalogIOEvent message to broker!")
115+
116+
return true;
89117
}
90118

91119
void AnalogIOController::update() {
@@ -103,16 +131,17 @@ void AnalogIOController::update() {
103131
continue;
104132

105133
// Pins timer has expired, lets read the pin
106-
if (pin.read_mode == wippersnapper_sensor_SensorType_SENSOR_TYPE_VOLTAGE) {
107-
// TODO: Read and store the pin's voltage
134+
// Read the pin's raw value
135+
uint16_t value = _analogio_hardware->GetPinValue(pin.name);
136+
if (pin.read_mode == wippersnapper_sensor_SensorType_SENSOR_TYPE_RAW) {
137+
// Since we already read the raw value, encode and publish it to the
138+
// broker
139+
// TODO
108140
} else if (pin.read_mode ==
109-
wippersnapper_sensor_SensorType_SENSOR_TYPE_RAW) {
110-
// TODO: Read and store the pin's raw value
111-
uint16_t value = _analogio_hardware->GetPinValue(pin.name);
112-
} else {
113-
WS_DEBUG_PRINT("ERROR: Invalid read mode for analog pin: ");
114-
WS_DEBUG_PRINTLN(pin.name);
115-
continue;
141+
wippersnapper_sensor_SensorType_SENSOR_TYPE_VOLTAGE) {
142+
// Convert the raw value into voltage
143+
float pin_value = _analogio_hardware->CalculatePinVoltage(value);
144+
// Encode and publish the voltage value to the broker
116145
}
117146
}
118147
}

src/components/analogIO/controller.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@ class AnalogIOController {
4444
public:
4545
AnalogIOController();
4646
~AnalogIOController();
47-
// Routing functions
47+
// Routing
4848
bool Handle_AnalogIOAdd(pb_istream_t *stream);
4949
bool Handle_AnalogIORemove(pb_istream_t *stream);
50-
// Polling loop function
50+
// Polling loop
5151
void update();
52-
52+
// Encoder
53+
bool EncodePublishPinValue(uint8_t pin, uint16_t value);
54+
bool EncodePublishPinVoltage(uint8_t pin, float value);
55+
// Helpers
5356
void SetTotalAnalogPins(uint8_t total_pins);
5457
void SetRefVoltage(float voltage);
5558
bool IsPinTimerExpired(analogioPin *pin, ulong cur_time);

src/components/analogIO/hardware.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,14 @@ void AnalogIOHardware::SetResolution(uint8_t resolution) {
5555
CalculateScaleFactor();
5656
}
5757

58-
uint8_t AnalogIOHardware::GetResolution(void) { return _adc_resolution; }
59-
6058
void AnalogIOHardware::CalculateScaleFactor() {
6159
if (!_is_adc_resolution_scaled)
6260
return;
6361

64-
if (getADCresolution() > getNativeResolution()) {
65-
_scale_factor = getADCresolution() - getNativeResolution();
62+
if (_adc_resolution > _native_adc_resolution) {
63+
_scale_factor = _adc_resolution - _native_adc_resolution;
6664
} else {
67-
_scale_factor = getNativeResolution() - getADCresolution();
65+
_scale_factor = _native_adc_resolution - _adc_resolution;
6866
}
6967
}
7068

@@ -73,7 +71,7 @@ uint16_t AnalogIOHardware::GetPinValue(uint8_t pin) {
7371
uint16_t value = analogRead(pin);
7472
// Scale the pins value
7573
if (_is_adc_resolution_scaled) {
76-
if (getADCresolution() > getNativeResolution()) {
74+
if (_adc_resolution > _native_adc_resolution) {
7775
value = value << _scale_factor;
7876
} else {
7977
value = value >> _scale_factor;
@@ -82,8 +80,7 @@ uint16_t AnalogIOHardware::GetPinValue(uint8_t pin) {
8280
return value;
8381
}
8482

85-
float Wippersnapper_AnalogIO::GetPinVoltage(uint8_t pin) {
86-
uint16_t raw_value = GetPinValue(pin);
83+
float AnalogIOHardware::CalculatePinVoltage(uint16_t raw_value) {
8784
float voltage = raw_value * _voltage_scale_factor;
88-
return voltage
85+
return voltage;
8986
}

src/components/analogIO/hardware.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@ class AnalogIOHardware {
2727
~AnalogIOHardware();
2828
void SetNativeADCResolution();
2929
void SetResolution(uint8_t resolution);
30-
uint8_t GetResolution(void);
3130
void SetReferenceVoltage(float voltage);
3231
void CalculateScaleFactor();
3332

3433
// Arduino/Wiring API
3534
void InitPin(uint8_t pin);
3635
void DeinitPin(uint8_t pin);
3736
uint16_t GetPinValue(uint8_t pin);
38-
float GetPinVoltage(uint8_t pin);
37+
float CalculatePinVoltage(uint16_t raw_voltage);
3938

4039
private:
4140
uint8_t _native_adc_resolution;

src/components/analogIO/model.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,36 @@ bool AnalogIOModel::DecodeAnalogIORemove(pb_istream_t *stream) {
4848

4949
wippersnapper_analogio_AnalogIORemove *AnalogIOModel::GetAnalogIORemoveMsg() {
5050
return &_msg_AnalogioRemove;
51+
}
52+
53+
wippersnapper_analogio_AnalogIOEvent *AnalogIOModel::GetAnalogIOEvent() {
54+
return &_msg_AnalogioEvent;
55+
}
56+
57+
bool AnalogIOModel::EncodeAnalogIOVoltageEvent(char *pin_name,
58+
float pin_value) {
59+
// Initialize the AnalogIOEvent message to default values
60+
_msg_AnalogioEvent = wippersnapper_analogio_AnalogIOEvent_init_zero;
61+
// Fill the AnalogIOEvent message's fields
62+
strncpy(_msg_AnalogioEvent.pin_name, pin_name,
63+
sizeof(_msg_AnalogioEvent.pin_name));
64+
_msg_AnalogioEvent.has_sensor_event = true;
65+
_msg_AnalogioEvent.sensor_event.type =
66+
wippersnapper_sensor_SensorType_SENSOR_TYPE_RAW;
67+
_msg_AnalogioEvent.sensor_event.which_value =
68+
wippersnapper_sensor_SensorEvent_float_value_tag;
69+
_msg_AnalogioEvent.sensor_event.value.float_value = pin_value;
70+
71+
// Obtain size of an encoded AnalogIOEvent message
72+
size_t sz_aio_event_msg;
73+
if (!pb_get_encoded_size(&sz_aio_event_msg,
74+
wippersnapper_analogio_AnalogIOEvent_fields,
75+
&_msg_AnalogioEvent))
76+
return false;
77+
78+
// Encode the AnalogIOEvent message
79+
uint8_t buf[sz_aio_event_msg];
80+
pb_ostream_t msg_stream = pb_ostream_from_buffer(buf, sizeof(buf));
81+
return pb_encode(&msg_stream, wippersnapper_analogio_AnalogIOEvent_fields,
82+
&_msg_AnalogioEvent);
5183
}

src/components/analogIO/model.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,14 @@ class AnalogIOModel {
3232
// AnalogIORemove
3333
bool DecodeAnalogIORemove(pb_istream_t *stream);
3434
wippersnapper_analogio_AnalogIORemove *GetAnalogIORemoveMsg();
35+
// AnalogIOEvent
36+
bool EncodeAnalogIOVoltageEvent(char *pin_name, float pin_value);
37+
// bool EncodeAnalogIORawEvent(char *pin_name, int16_t pin_value);
38+
wippersnapper_analogio_AnalogIOEvent *GetAnalogIOEvent();
3539

3640
private:
3741
wippersnapper_analogio_AnalogIOAdd _msg_AnalogioAdd;
3842
wippersnapper_analogio_AnalogIORemove _msg_AnalogioRemove;
43+
wippersnapper_analogio_AnalogIOEvent _msg_AnalogioEvent;
3944
};
4045
#endif // WS_DIGITALIO_MODEL_H

0 commit comments

Comments
 (0)