diff options
Diffstat (limited to 'src/main-master.c')
| -rw-r--r-- | src/main-master.c | 105 |
1 files changed, 36 insertions, 69 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; |
