summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAditya Naik2020-04-22 16:30:15 -0400
committerAditya Naik2020-04-22 16:30:15 -0400
commit42a683033594289ddc520dffec652967e366e785 (patch)
treeb39c2746c5137ee65e021326e1d6ea3f7fe960e2
parent3bba7e2e56f3459f5d5d67c81b3fa4a41a8c9176 (diff)
Added dataflow protocol files
-rw-r--r--data.proto83
-rw-r--r--makefile1
-rw-r--r--src/data.pb.c38
-rw-r--r--src/data.pb.h181
-rw-r--r--src/dataflow.h5
-rw-r--r--src/main-data.c14
6 files changed, 319 insertions, 3 deletions
diff --git a/data.proto b/data.proto
new file mode 100644
index 0000000..1506fb0
--- /dev/null
+++ b/data.proto
@@ -0,0 +1,83 @@
+// Protocol for Dataflow
+
+syntax = "proto2";
+
+
+/*
+* SOR codes
+*
+* |------|----------------------|
+* | Code | Instruction |
+* | 1 | TX from slave |
+* | 2 | RX datapoint |
+* | 3 | RX command |
+* |------|----------------------|
+*
+*/
+
+message m2s_SOR {
+ required uint32 SOR_code = 1 [default=1];
+
+ /* If master wants slave to receive something, it also puts the rx length in the SOR */
+ optional uint32 rx_length = 2;
+}
+
+
+/* DOC Codes
+*
+* |------|----------------------|
+* | Code | Instruction |
+* | 1 | Unicast command |
+* | 2 | Multicast command |
+* | 3 | Broadcast command |
+* | 4 | Reserved |
+* | 5 | Data |
+* |------|----------------------|
+*
+*/
+
+message s2m_DOC {
+ /* If master wants to receive something from the slave, the slave specifies whether
+ it is sending a command or data */
+ required uint32 DOC_code = 1 [default=1];
+
+ /* Also encode the length of the next transmission */
+ required uint32 tx_length = 2 [default=0];
+
+}
+
+message m2s_CTS {
+ required uint32 timeout = 1;
+}
+
+/* Commands when SOR code is 3 */
+message m2s_command {
+ optional uint32 source_module_id = 1 [default=1];
+ optional uint32 source_i2c_address = 2 [default=1];
+
+ optional bytes cmd_bytes = 3;
+ optional string cmd_str = 4;
+}
+
+/* Commands from slave */
+message s2m_command {
+ optional uint32 dest_module_id = 1;
+ repeated uint32 dest_module_id_multicast = 2;
+
+ optional bytes cmd_bytes = 3;
+ optional string cmd_str = 4;
+}
+
+message _datapoint {
+ required uint32 entity_id = 1 [default=0];
+ required double data = 2 [default=0];
+
+ optional uint32 channel_id = 3 [default=1];
+ optional uint32 unit_id = 4 [default=1];
+ optional int32 timestamp = 5 [default=1];
+
+}
+
+message s2m_data {
+ repeated _datapoint datapoints = 1;
+} \ No newline at end of file
diff --git a/makefile b/makefile
index e9ccdce..9526108 100644
--- a/makefile
+++ b/makefile
@@ -44,6 +44,7 @@ src/pb_decode.c \
src/pb_encode.c \
src/pb_common.c \
src/handshake.pb.c \
+src/data.pb.c \
lib/f4/stm32f4xx_hal_i2c.c \
lib/f4/stm32f4xx_hal_i2c_ex.c \
lib/f4/stm32f4xx_hal_rcc.c \
diff --git a/src/data.pb.c b/src/data.pb.c
new file mode 100644
index 0000000..fb1e203
--- /dev/null
+++ b/src/data.pb.c
@@ -0,0 +1,38 @@
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.4.2-dev */
+
+#include "data.pb.h"
+#if PB_PROTO_HEADER_VERSION != 40
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+PB_BIND(m2s_SOR, m2s_SOR, AUTO)
+
+
+PB_BIND(s2m_DOC, s2m_DOC, AUTO)
+
+
+PB_BIND(m2s_CTS, m2s_CTS, AUTO)
+
+
+PB_BIND(m2s_command, m2s_command, AUTO)
+
+
+PB_BIND(s2m_command, s2m_command, AUTO)
+
+
+PB_BIND(_datapoint, _datapoint, AUTO)
+
+
+PB_BIND(s2m_data, s2m_data, AUTO)
+
+
+
+#ifndef PB_CONVERT_DOUBLE_FLOAT
+/* On some platforms (such as AVR), double is really float.
+ * To be able to encode/decode double on these platforms, you need.
+ * to define PB_CONVERT_DOUBLE_FLOAT in pb.h or compiler command line.
+ */
+PB_STATIC_ASSERT(sizeof(double) == 8, DOUBLE_MUST_BE_8_BYTES)
+#endif
+
diff --git a/src/data.pb.h b/src/data.pb.h
new file mode 100644
index 0000000..cc271a3
--- /dev/null
+++ b/src/data.pb.h
@@ -0,0 +1,181 @@
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.4.2-dev */
+
+#ifndef PB_DATA_PB_H_INCLUDED
+#define PB_DATA_PB_H_INCLUDED
+#include <pb.h>
+
+#if PB_PROTO_HEADER_VERSION != 40
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Struct definitions */
+typedef struct _s2m_data {
+ pb_callback_t datapoints;
+} s2m_data;
+
+typedef struct __datapoint {
+ uint32_t entity_id;
+ double data;
+ bool has_channel_id;
+ uint32_t channel_id;
+ bool has_unit_id;
+ uint32_t unit_id;
+ bool has_timestamp;
+ int32_t timestamp;
+} _datapoint;
+
+typedef struct _m2s_CTS {
+ uint32_t timeout;
+} m2s_CTS;
+
+typedef struct _m2s_SOR {
+ uint32_t SOR_code;
+ bool has_rx_length;
+ uint32_t rx_length;
+} m2s_SOR;
+
+typedef struct _m2s_command {
+ bool has_source_module_id;
+ uint32_t source_module_id;
+ bool has_source_i2c_address;
+ uint32_t source_i2c_address;
+ pb_callback_t cmd_bytes;
+ pb_callback_t cmd_str;
+} m2s_command;
+
+typedef struct _s2m_DOC {
+ uint32_t DOC_code;
+ uint32_t tx_length;
+} s2m_DOC;
+
+typedef struct _s2m_command {
+ bool has_dest_module_id;
+ uint32_t dest_module_id;
+ pb_callback_t dest_module_id_multicast;
+ pb_callback_t cmd_bytes;
+ pb_callback_t cmd_str;
+} s2m_command;
+
+
+/* Initializer values for message structs */
+#define m2s_SOR_init_default {1u, false, 0}
+#define s2m_DOC_init_default {1u, 0u}
+#define m2s_CTS_init_default {0}
+#define m2s_command_init_default {false, 1u, false, 1u, {{NULL}, NULL}, {{NULL}, NULL}}
+#define s2m_command_init_default {false, 0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}}
+#define _datapoint_init_default {0u, 0, false, 1u, false, 1u, false, 1}
+#define s2m_data_init_default {{{NULL}, NULL}}
+#define m2s_SOR_init_zero {0, false, 0}
+#define s2m_DOC_init_zero {0, 0}
+#define m2s_CTS_init_zero {0}
+#define m2s_command_init_zero {false, 0, false, 0, {{NULL}, NULL}, {{NULL}, NULL}}
+#define s2m_command_init_zero {false, 0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}}
+#define _datapoint_init_zero {0, 0, false, 0, false, 0, false, 0}
+#define s2m_data_init_zero {{{NULL}, NULL}}
+
+/* Field tags (for use in manual encoding/decoding) */
+#define s2m_data_datapoints_tag 1
+#define _datapoint_entity_id_tag 1
+#define _datapoint_data_tag 2
+#define _datapoint_channel_id_tag 3
+#define _datapoint_unit_id_tag 4
+#define _datapoint_timestamp_tag 5
+#define m2s_CTS_timeout_tag 1
+#define m2s_SOR_SOR_code_tag 1
+#define m2s_SOR_rx_length_tag 2
+#define m2s_command_source_module_id_tag 1
+#define m2s_command_source_i2c_address_tag 2
+#define m2s_command_cmd_bytes_tag 3
+#define m2s_command_cmd_str_tag 4
+#define s2m_DOC_DOC_code_tag 1
+#define s2m_DOC_tx_length_tag 2
+#define s2m_command_dest_module_id_tag 1
+#define s2m_command_dest_module_id_multicast_tag 2
+#define s2m_command_cmd_bytes_tag 3
+#define s2m_command_cmd_str_tag 4
+
+/* Struct field encoding specification for nanopb */
+#define m2s_SOR_FIELDLIST(X, a) \
+X(a, STATIC, REQUIRED, UINT32, SOR_code, 1) \
+X(a, STATIC, OPTIONAL, UINT32, rx_length, 2)
+#define m2s_SOR_CALLBACK NULL
+#define m2s_SOR_DEFAULT (const pb_byte_t*)"\x08\x01\x00"
+
+#define s2m_DOC_FIELDLIST(X, a) \
+X(a, STATIC, REQUIRED, UINT32, DOC_code, 1) \
+X(a, STATIC, REQUIRED, UINT32, tx_length, 2)
+#define s2m_DOC_CALLBACK NULL
+#define s2m_DOC_DEFAULT (const pb_byte_t*)"\x08\x01\x10\x00\x00"
+
+#define m2s_CTS_FIELDLIST(X, a) \
+X(a, STATIC, REQUIRED, UINT32, timeout, 1)
+#define m2s_CTS_CALLBACK NULL
+#define m2s_CTS_DEFAULT NULL
+
+#define m2s_command_FIELDLIST(X, a) \
+X(a, STATIC, OPTIONAL, UINT32, source_module_id, 1) \
+X(a, STATIC, OPTIONAL, UINT32, source_i2c_address, 2) \
+X(a, CALLBACK, OPTIONAL, BYTES, cmd_bytes, 3) \
+X(a, CALLBACK, OPTIONAL, STRING, cmd_str, 4)
+#define m2s_command_CALLBACK pb_default_field_callback
+#define m2s_command_DEFAULT (const pb_byte_t*)"\x08\x01\x10\x01\x00"
+
+#define s2m_command_FIELDLIST(X, a) \
+X(a, STATIC, OPTIONAL, UINT32, dest_module_id, 1) \
+X(a, CALLBACK, REPEATED, UINT32, dest_module_id_multicast, 2) \
+X(a, CALLBACK, OPTIONAL, BYTES, cmd_bytes, 3) \
+X(a, CALLBACK, OPTIONAL, STRING, cmd_str, 4)
+#define s2m_command_CALLBACK pb_default_field_callback
+#define s2m_command_DEFAULT NULL
+
+#define _datapoint_FIELDLIST(X, a) \
+X(a, STATIC, REQUIRED, UINT32, entity_id, 1) \
+X(a, STATIC, REQUIRED, DOUBLE, data, 2) \
+X(a, STATIC, OPTIONAL, UINT32, channel_id, 3) \
+X(a, STATIC, OPTIONAL, UINT32, unit_id, 4) \
+X(a, STATIC, OPTIONAL, INT32, timestamp, 5)
+#define _datapoint_CALLBACK NULL
+#define _datapoint_DEFAULT (const pb_byte_t*)"\x08\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x20\x01\x28\x01\x00"
+
+#define s2m_data_FIELDLIST(X, a) \
+X(a, CALLBACK, REPEATED, MESSAGE, datapoints, 1)
+#define s2m_data_CALLBACK pb_default_field_callback
+#define s2m_data_DEFAULT NULL
+#define s2m_data_datapoints_MSGTYPE _datapoint
+
+extern const pb_msgdesc_t m2s_SOR_msg;
+extern const pb_msgdesc_t s2m_DOC_msg;
+extern const pb_msgdesc_t m2s_CTS_msg;
+extern const pb_msgdesc_t m2s_command_msg;
+extern const pb_msgdesc_t s2m_command_msg;
+extern const pb_msgdesc_t _datapoint_msg;
+extern const pb_msgdesc_t s2m_data_msg;
+
+/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
+#define m2s_SOR_fields &m2s_SOR_msg
+#define s2m_DOC_fields &s2m_DOC_msg
+#define m2s_CTS_fields &m2s_CTS_msg
+#define m2s_command_fields &m2s_command_msg
+#define s2m_command_fields &s2m_command_msg
+#define _datapoint_fields &_datapoint_msg
+#define s2m_data_fields &s2m_data_msg
+
+/* Maximum encoded size of messages (where known) */
+#define m2s_SOR_size 12
+#define s2m_DOC_size 12
+#define m2s_CTS_size 6
+/* m2s_command_size depends on runtime parameters */
+/* s2m_command_size depends on runtime parameters */
+#define _datapoint_size 38
+/* s2m_data_size depends on runtime parameters */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/src/dataflow.h b/src/dataflow.h
new file mode 100644
index 0000000..15d15cd
--- /dev/null
+++ b/src/dataflow.h
@@ -0,0 +1,5 @@
+
+typedef enum dataflow_status {
+ DATA_SUCCESS = 0,
+ DATA_FAIL = 1
+} dataflow_status_t;
diff --git a/src/main-data.c b/src/main-data.c
index f228235..4314e9e 100644
--- a/src/main-data.c
+++ b/src/main-data.c
@@ -16,12 +16,13 @@
/* Library includes */
#include <pb_encode.h>
#include <pb_decode.h>
-#include "handshake.pb.h"
/* Project includes */
+#include "main.h"
#include "devices.h"
#include "config.h"
-#include "main.h"
+#include "dataflow.h"
+#include "handshake.pb.h"
/* Private Macros */
#define device_MDR s2m_MDR_response
@@ -53,6 +54,7 @@ static void MX_USART1_UART_Init(void);
bool decode_subscriptions_callback(pb_istream_t *istream, const pb_field_t *field, void **args);
hs_status_t handshake(uint32_t i2c_addr);
+dataflow_status_t device_dataflow(uint8_t i2c_addr);
bool todo_hs_or_not_todo_hs(uint8_t i2c_addr);
state_t get_state_from_hs_status(uint16_t device_addr, hs_status_t hs_status);
bool encode_subscription_callback(pb_ostream_t *ostream, const pb_field_t *field, void * const *arg);
@@ -116,7 +118,6 @@ int main(void)
device_info[dev_idx]->MDR = module_MDR;
/* dataflow */
-
#else /* Slave code*/
{
@@ -429,6 +430,13 @@ __DEBUG_BLOCK_END:
return hs_sts;
}
+dataflow_status_t device_dataflow(uint8_t i2c_addr)
+{
+ uint8_t dev_idx = GET_IDX_FROM_ADDR(i2c_addr);
+ dataflow_status_t status;
+
+}
+
bool decode_subscriptions_callback(pb_istream_t *istream, const pb_field_t *field, void **args)
{
_subscriptions subs;