summaryrefslogtreecommitdiff
path: root/src/main-master.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main-master.c')
-rw-r--r--src/main-master.c105
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;