summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAditya Naik2020-08-10 14:12:34 -0400
committerAditya Naik2020-08-10 14:12:34 -0400
commit86d5f02b2a13462e13f61cd4c0ddc4600b9b0e26 (patch)
tree43b368d7e8d670dc8de0e4a603a35e51db06d19a
parent25bf912396cf6284b3998d295e3f7661ec73bd0a (diff)
Dataflow state machine function documentation
-rw-r--r--src/dataflow.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/dataflow.c b/src/dataflow.c
new file mode 100644
index 0000000..6944085
--- /dev/null
+++ b/src/dataflow.c
@@ -0,0 +1,165 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include "dataflow.h"
+
+/**
+ * Args table for all states
+ *
+ * |-------+-------------------|
+ * | Index | Variable |
+ * |-------+-------------------|
+ * | 0 | SOR_buf |
+ * | 1 | DOC_buf |
+ * | 2 | data_rbuf |
+ * | 3 | data_routing_ptr |
+ * | 4 | data_src_idx_rbuf |
+ * | 5 | data_len_buf |
+ * | 6 | cmd_routing_buf |
+ * | 7 | cmd_routing_ptr |
+ * | 8 | cmd_src_idx_rbuf |
+ * | 9 | cmd_dst_idx_rbuf |
+ *
+ *
+ *
+ */
+
+
+int DF_func_idle(p_stream_t stream, void **args)
+{
+ int df_state = DF_IDLE;
+ uint32_t SOR_code = *(uint32_t*)args[0];
+ uint8_t SOR_buf[2] = {SOR_code, 0x0};
+
+ if (stream.write(SOR_buf, 2, NULL, &stream) != 0) {
+ df_state = DF_STATE_FAIL;
+ }
+ else {
+ if (SOR_code == SLAVE_TX) {
+ df_state = DF_RX_DOC;
+ }
+ else if (SOR_code == SLAVE_RX_DATAPOINT) {
+ df_state = DF_TX_DATA;
+ }
+ else if (SOR_code == SLAVE_RX_COMMAND) {
+ df_state = DF_TX_CMD;
+ }
+ else {
+ df_state = DF_STATE_FAIL;
+ }
+ }
+ return df_state;
+}
+
+int DF_func_rx_doc(p_stream_t stream, void **args)
+{
+ uint8_t DOC_buf[4];
+ int df_state = DF_RX_DOC;
+ if (stream.read(DOC_buf, 4, NULL, &stream) != 0) {
+ df_state = DF_STATE_FAIL;
+ }
+ else {
+ if (DOC_buf[0] == 0x0) {
+ /* Do nothing DOC */
+ df_state = DF_SUCCESS;
+ }
+ else if (DOC_buf[1] == DATA) {
+ df_state = DF_RX_CTS;
+ args[1] = malloc(sizeof(uint8_t*));
+ args[1] = &DOC_buf; /* Put pointer to DOC buf in this arg */
+
+ }
+ else if (DOC_buf[1] == CMD_UNICAST) {
+ df_state = DF_RX_CTS;
+ args[1] = malloc(sizeof(uint8_t*));
+ args[1] = &DOC_buf; /* Put pointer to DOC buf in this arg */
+ }
+ else {
+ df_state = DF_STATE_FAIL;
+ }
+ }
+ return df_state;
+}
+
+int DF_func_rx_cts(p_stream_t stream, void **args)
+{
+ int df_state = DF_RX_CTS;
+ uint8_t CTS_buf[2] = {0x2, 0xFF};
+ uint8_t *DOC_buf = args[1];
+ if (stream.write(CTS_buf, 2, NULL, &stream) != 0) {
+ df_state = DF_FAIL;
+ }
+ else {
+ if (DOC_buf[1] == DATA) {
+ df_state = DF_RX_DATA;
+ }
+ else {
+ if (DOC_buf[1] == CMD_UNICAST) {
+ df_state = DF_RX_CMD;
+ }
+ }
+ }
+ return df_state;
+}
+
+int DF_func_rx_data(p_stream_t stream, void **args)
+{
+ int df_state = DF_RX_DATA;
+ uint8_t **data_rbuf = (uint8_t**)args[2];
+ uint8_t *data_routing_ptr = (uint8_t*)args[3];
+ uint8_t *DOC_buf = (uint8_t*)args[1];
+ uint8_t data_len = DOC_buf[3];
+
+ data_rbuf[*data_routing_ptr] = malloc(sizeof(uint8_t)*data_len);
+
+ if (stream.read(data_rbuf[*data_routing_ptr], data_len, NULL, &stream) != 0) {
+ df_state = DF_STATE_FAIL;
+ free(data_rbuf[*data_routing_ptr]);
+ }
+ else {
+ uint8_t* data_src_idx_rbuf = (uint8_t*)args[4];
+ uint8_t* data_len_buf = (uint8_t*)args[5];
+ data_src_idx_rbuf[*data_routing_ptr] = 0;
+ /* data_src_idx_rbuf[data_routing_ptr] = dev_idx; */
+ data_len_buf[*data_routing_ptr] = data_len;
+ data_routing_ptr++;
+ df_state = DF_STATE_SUCCESS;
+ }
+ return df_state;
+}
+
+int DF_func_rx_cmd(p_stream_t stream, void **args)
+{
+ int df_state = DF_RX_CMD;
+ uint8_t *DOC_buf = args[1];
+ uint8_t data_len = DOC_buf[3], cmd_dest = DOC_buf[0];
+
+ uint8_t **cmd_routing_buf = (uint8_t**)args[6];
+ uint8_t *cmd_routing_ptr = (uint8_t*)args[7];
+
+ uint8_t* cmd_src_idx_rbuf = (uint8_t*)args[8];
+ uint8_t* cmd_dst_idx_rbuf = (uint8_t*)args[9];
+
+ cmd_routing_buf[*cmd_routing_ptr] = (uint8_t*)malloc(sizeof(uint8_t)*data_len);
+
+ if (stream.read(cmd_routing_buf[*cmd_routing_ptr], data_len, NULL, &stream) != 0) {
+ free(cmd_routing_buf[*cmd_routing_ptr]);
+ df_state = DF_STATE_FAIL;
+ }
+ else {
+ cmd_src_idx_rbuf[*cmd_routing_ptr] = 0;
+ cmd_dst_idx_rbuf[*cmd_routing_ptr] = cmd_dest;
+ cmd_routing_ptr++;
+ df_state = DF_SUCCESS;
+ }
+ return df_state;
+}
+
+int DF_func_tx_data(p_stream_t stream, void **args)
+{
+
+}
+
+int DF_func_tx_cmd(p_stream_t stream, void **args)
+{
+
+}