summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAditya Naik2020-06-05 13:26:13 -0400
committerAditya Naik2020-06-05 13:26:13 -0400
commit3f5f496bd809fa417dbaa7bbd33db0d903033155 (patch)
tree82ca37765edc6ad81c914c8d14c1eaca7ff3f22f
parent1cb59504671100dd41d3072821e31b3da931f723 (diff)
Dataflow errors, switching CTS to bytes TX
-rw-r--r--src/main-master.c105
-rw-r--r--src/main-slave.c39
2 files changed, 42 insertions, 102 deletions
diff --git a/src/main-master.c b/src/main-master.c
index 8242539..e4a8fd4 100644
--- a/src/main-master.c
+++ b/src/main-master.c
@@ -32,8 +32,8 @@
#define SET_BIT_FROM_IDX(a, b) a[b>>5]|=(1<<(b%32))
#define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
-#define I2C_ADDRESS 0x05
-#define BUS_DEVICE_LIMIT 5
+/* #define I2C_ADDRESS 0x05 */
+#define BUS_DEVICE_LIMIT 16
/* Macro to toggle between master and slave firmware */
#define MASTER
@@ -105,7 +105,7 @@ int main(void)
while (1) {
if (priority_counter == 0) {
hs_status_t hs_status;
- for (uint8_t curr_addr=1; curr_addr < BUS_DEVICE_LIMIT; curr_addr++) {
+ for (uint8_t curr_addr=1; curr_addr <= BUS_DEVICE_LIMIT; curr_addr++) {
if (todo_hs_or_not_todo_hs(curr_addr)) {
hs_status = handshake(curr_addr);
dev_sts[GET_IDX_FROM_ADDR(curr_addr)] = get_state_from_hs_status(curr_addr, hs_status);
@@ -117,7 +117,7 @@ int main(void)
routing();
}
else {
- for (int device_idx = 0; device_idx < BUS_DEVICE_LIMIT-1; device_idx++) {
+ for (int device_idx = 0; device_idx < BUS_DEVICE_LIMIT; device_idx++) {
if (dev_sts[device_idx] == REGISTERED) {
device_dataflow(GET_ADDR_FROM_IDX(device_idx), SLAVE_TX, 0);
}
@@ -340,12 +340,11 @@ dataflow_status_t device_dataflow(uint8_t i2c_addr, uint32_t SOR_code, uint8_t r
uint8_t dev_idx = GET_IDX_FROM_ADDR(i2c_addr);
dataflow_status_t df_status = DF_IDLE;
- uint8_t *SOR_buf, *DOC_buf, *CTS_buf, *data_buf;
+ uint8_t *CTS_buf, *data_buf;
uint32_t AF_error_counter = 0;
uint32_t data_len = 0;
_datapoint datapoints[16];
- m2s_SOR SOR_message = m2s_SOR_init_default;
s2m_DOC DOC_message = s2m_DOC_init_zero;
/* TODO Add default values to the CTS message in proto */
m2s_CTS CTS_message = m2s_CTS_init_default;
@@ -361,49 +360,39 @@ dataflow_status_t device_dataflow(uint8_t i2c_addr, uint32_t SOR_code, uint8_t r
switch (df_status) {
case (DF_IDLE):
{
- SOR_buf = malloc(sizeof(m2s_SOR));
- pb_ostream_t SOR_stream = pb_ostream_from_buffer(SOR_buf, sizeof(SOR_buf));
- SOR_message.SOR_code = SOR_code;
- if (!pb_encode(&SOR_stream, m2s_SOR_fields, &SOR_message)) {
+ /* HAL_Delay(MASTER_I2C_BUS_INTERVAL); */
+ uint8_t SOR_buf[2] = {SOR_code, 0x0};
+ if (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)i2c_addr, SOR_buf, 2, 10000) != HAL_OK) {
df_status = DF_FAIL;
#ifdef DEBUG_ENABLE
- goto __DF_SOR_ENC_FAIL;
- __DF_SOR_ENC_FAIL_END:
+ goto __DF_SOR_I2C_ERROR;
+ __DF_SOR_I2C_ERROR_END:
__asm__("nop");
#endif
}
else {
- if (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)i2c_addr, (uint8_t*)SOR_buf,
- m2s_SOR_size, 10000) != HAL_OK) {
- df_status = DF_FAIL;
-#ifdef DEBUG_ENABLE
- goto __DF_SOR_I2C_ERROR;
- __DF_SOR_I2C_ERROR_END:
- __asm__("nop");
-#endif
+ if (SOR_code == SLAVE_TX) {
+ df_status = DF_RX_DOC;
}
- else {
- if (SOR_code == SLAVE_TX) {
- df_status = DF_RX_DOC;
- }
- else if (SOR_code == SLAVE_RX_DATAPOINT) {
- /* TODO */
- df_status = DF_LEN_TX;
- }
- else if (SOR_code == SLAVE_RX_COMMAND) {
- /* TODO */
- }
+ else if (SOR_code == SLAVE_RX_DATAPOINT) {
+ /* TODO */
+ df_status = DF_LEN_TX;
+ }
+ else if (SOR_code == SLAVE_RX_COMMAND) {
+ /* TODO */
}
}
break;
}
+
+
case (DF_RX_DOC):
{
HAL_Delay(MASTER_I2C_BUS_INTERVAL);
- DOC_buf = (uint8_t*)malloc(4);
+ uint8_t DOC_buf[4];
AF_error_counter = 0;
while (HAL_I2C_Master_Receive(&hi2c1, (uint16_t)i2c_addr,
- (uint8_t*)DOC_buf, 4, 500) != HAL_OK) {
+ (uint8_t*)DOC_buf, 4, 1000) != HAL_OK) {
if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF) {
df_status = DF_FAIL;
#ifdef DEBUG_ENABLE
@@ -413,35 +402,24 @@ dataflow_status_t device_dataflow(uint8_t i2c_addr, uint32_t SOR_code, uint8_t r
#endif
break;
}
- else if (++AF_error_counter > 4000) {
+ else if (++AF_error_counter > 1500) {
df_status = DF_FAIL;
break;
}
}
- if (df_status != DF_FAIL) {
- pb_istream_t DOC_istream = pb_istream_from_buffer(DOC_buf, 4);
- if (!pb_decode(&DOC_istream, s2m_DOC_fields, &DOC_message)) {
- df_status = DF_FAIL;
-#ifdef DEBUG_ENABLE
- goto __DF_DOC_DECODE_ERROR;
- __DF_DOC_DECODE_ERROR_END:
- __asm__("nop");
-#endif
+ if (df_status != DF_FAIL) {
+ if (DOC_buf[1] == DATA) {
+ df_status = DF_CTS;
+ data_len = DOC_buf[3];
}
- else {
- if (DOC_message.DOC_code == DATA) {
- df_status = DF_CTS;
- data_len = DOC_message.tx_length;
- }
- else if (DOC_message.DOC_code == CMD_UNICAST) {
- /* TODO */
- }
- else if (DOC_message.DOC_code == CMD_MULTICAST) {
- /* TODO */
- }
- else if (DOC_message.DOC_code == CMD_BROADCAST) {
- /* TODO */
- }
+ else if (DOC_message.DOC_code == CMD_UNICAST) {
+ /* TODO */
+ }
+ else if (DOC_message.DOC_code == CMD_MULTICAST) {
+ /* TODO */
+ }
+ else if (DOC_message.DOC_code == CMD_BROADCAST) {
+ /* TODO */
}
}
break;
@@ -489,7 +467,7 @@ dataflow_status_t device_dataflow(uint8_t i2c_addr, uint32_t SOR_code, uint8_t r
data_buf = (uint8_t*)malloc(128);
AF_error_counter = 0;
while (HAL_I2C_Master_Receive(&hi2c1, (uint16_t)i2c_addr,
- (uint8_t*)data_buf, data_len, 10000) != HAL_OK) {
+ (uint8_t*)data_buf, data_len, 1000) != HAL_OK) {
if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF) {
df_status = DF_FAIL;
#ifdef DEBUG_ENABLE
@@ -647,11 +625,6 @@ dataflow_status_t device_dataflow(uint8_t i2c_addr, uint32_t SOR_code, uint8_t r
#ifdef DEBUG_ENABLE
{
goto __DF_DEBUG_BLOCK_END;
- __DF_SOR_ENC_FAIL:
- sprintf((char*)debug_buf, "SOR encoding error\r\n");
- HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
- memset(debug_buf, 0, 128);
- goto __DF_SOR_ENC_FAIL_END;
__DF_SOR_I2C_ERROR:
sprintf((char*)debug_buf, "Unable to send SOR request to %d. I2C error: %ld\r\n",
i2c_addr, HAL_I2C_GetError(&hi2c1));
@@ -663,11 +636,6 @@ dataflow_status_t device_dataflow(uint8_t i2c_addr, uint32_t SOR_code, uint8_t r
HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
memset(debug_buf, 0, 128);
goto __DF_DOC_I2C_ERROR_END;
- __DF_DOC_DECODE_ERROR:
- sprintf((char*)debug_buf, "DOC decoding error\r\n");
- HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
- memset(debug_buf, 0, 128);
- goto __DF_DOC_DECODE_ERROR_END;
__DF_CTS_ENC_FAIL:
sprintf((char*)debug_buf, "CTS encoding error\r\n");
HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
@@ -936,7 +904,6 @@ static void MX_I2C1_Init(void)
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
- hi2c1.Init.OwnAddress1 = I2C_ADDRESS;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0xFF;
diff --git a/src/main-slave.c b/src/main-slave.c
index 8218290..39d31bb 100644
--- a/src/main-slave.c
+++ b/src/main-slave.c
@@ -76,11 +76,11 @@ int main(void)
while (handshake() == false);
-
+ uint8_t SOR_buf[2] = {0}, debug_buf[128];
HAL_Delay(1000);
while (1) {
- uint8_t SOR_buf[m2s_SOR_size] = {0}, debug_buf[128];
- if (HAL_I2C_Slave_Receive(&hi2c1, (uint8_t*)SOR_buf, m2s_SOR_size, 100) != HAL_OK) {
+
+ if (HAL_I2C_Slave_Receive(&hi2c1, (uint8_t*)SOR_buf, 2, 500) != HAL_OK) {
sprintf((char*)debug_buf, "Failed to get SOR\r\n");
HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
memset(debug_buf, 0, 128);
@@ -91,21 +91,8 @@ int main(void)
HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
memset(debug_buf, 0, 128);
}
- m2s_SOR SOR_message;
- pb_istream_t SOR_istream = pb_istream_from_buffer(SOR_buf, 2);
- if (!pb_decode(&SOR_istream, m2s_SOR_fields, &SOR_message)) {
- sprintf((char*)debug_buf, "SOR decode error\r\n");
- HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
- memset(debug_buf, 0, 128);
- continue;
- }
- else {
- sprintf((char*)debug_buf, "SOR decoded; code: %ld\r\n", SOR_message.SOR_code);
- HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
- memset(debug_buf, 0, 128);
- }
- if (SOR_message.SOR_code == 1) {
+ if (SOR_buf[0] == 1) {
uint8_t data_buf[128];
size_t data_enc_size;
s2m_data data;
@@ -120,21 +107,7 @@ int main(void)
data_enc_size = data_ostream.bytes_written;
s2m_DOC doc = s2m_DOC_init_zero;
- uint8_t doc_buf[s2m_DOC_size];
- doc.DOC_code = 5;
- doc.tx_length = data_enc_size;
- pb_ostream_t doc_ostream = pb_ostream_from_buffer(doc_buf, 4);
-
- if (!pb_encode(&doc_ostream, s2m_DOC_fields, &doc)) {
- sprintf((char*)debug_buf, "DOC encoding error\r\n");
- HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
- memset(debug_buf, 0, 128);
- continue;
- }
-
- sprintf((char*)debug_buf, "s2m_DOC encoded length: %d\r\n", doc_ostream.bytes_written);
- HAL_UART_Transmit(&huart1, debug_buf, sizeof(debug_buf), 100);
- memset(debug_buf, 0, 128);
+ uint8_t doc_buf[4] = {0x0, 0x5, 0x0, data_enc_size};
if (HAL_I2C_Slave_Transmit(&hi2c1, (uint8_t*)doc_buf, 4, 10000) != HAL_OK) {
sprintf((char*)debug_buf, "DOC I2C send error: %ld\r\n", HAL_I2C_GetError(&hi2c1));
@@ -174,7 +147,7 @@ int main(void)
memset(debug_buf, 0, 128);
}
}
- else if (SOR_message.SOR_code == 2) {
+ else if (SOR_buf[0] == 2) {
uint8_t CTS_buf[] = {0x0, 0x1};
uint8_t len_buf[4], *MDR_buf, *data_buf;
/* _datapoint datapoints[16]; */