diff options
Diffstat (limited to 'Src')
| -rw-r--r-- | Src/main-hs.c | 58 | ||||
| -rw-r--r-- | Src/main.c | 2 |
2 files changed, 44 insertions, 16 deletions
diff --git a/Src/main-hs.c b/Src/main-hs.c index bb206aa..19c666f 100644 --- a/Src/main-hs.c +++ b/Src/main-hs.c @@ -48,7 +48,7 @@ #define SET_BIT_FROM_IDX(a, b) a[b>>5]|=(1<<(b%32)) #define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__))) -#define I2C_ADDRESS 0x30F +#define I2C_ADDRESS 0x05 /* Macro to toggle between master and slave firmware */ #define MASTER @@ -124,16 +124,18 @@ int main(void) /* Handshake variables */ uint8_t hs_sts = IDLE; uint8_t debug_buf[128], term[] = "\r\n"; - uint8_t MDR_req_buf[8]; + uint8_t *MDR_req_buf, *MDR_ACK_buf; size_t MDR_req_size; - + + m2s_MDR_request MDR_req_message; + s2m_MDR_req_ACK MDR_ACK; + uint32_t MDR_len; while (hs_sts != HS_FAILED && hs_sts != HS_REGISTERED) { switch (hs_sts) { case (IDLE): { - /* MDR_req_buf = malloc(8); */ - m2s_MDR_request MDR_req_message; + MDR_req_buf = malloc(8); pb_ostream_t MDR_req_stream = pb_ostream_from_buffer(MDR_req_buf, 2); MDR_req_message.record_type = 7; /* Placeholder for default record type */ if(!pb_encode(&MDR_req_stream, m2s_MDR_request_fields, &MDR_req_message)) { @@ -151,19 +153,44 @@ int main(void) if (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS, (uint8_t*)MDR_req_buf, MDR_req_buf_len, 10000) != HAL_OK) { // Error handling for transmit fail -#ifdef DEBUG_ENABLE - uint8_t err_buf[] = "I2C error\r\n"; - HAL_UART_Transmit(&huart1, err_buf, sizeof(err_buf), 100); -#endif /* DEBUG_ENABLE */ hs_sts = HS_FAILED; } else { -#ifdef DEBUG_ENABLE - uint8_t err_buf[] = "I2C success??\r\n"; - HAL_UART_Transmit(&huart1, err_buf, sizeof(err_buf), 100); -#endif /* DEBUG_ENABLE */ - hs_sts = HS_REGISTERED; // Placeholder for testing, change this to next step + hs_sts = HS_MDR_ACK; // Placeholder for testing, change this to next step + } + free(MDR_req_buf); + break; + } + case (HS_MDR_ACK): + { + MDR_ACK_buf = malloc(8); + uint32_t AF_error_counter = 0; + while (HAL_I2C_Master_Receive(&hi2c1, (uint8_t)I2C_ADDRESS, (uint8_t*)MDR_ACK_buf, + s2m_MDR_req_ACK_size, 100) != HAL_OK) { + if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF) { + hs_sts = HS_FAILED; + } + if (++AF_error_counter > 1500) { + hs_sts = HS_FAILED; + break; + } + } + if (hs_sts == HS_FAILED) { + // TODO Error handling on I2C receive fail + } + else { + pb_istream_t MDR_ACK_istream = pb_istream_from_buffer(MDR_ACK_buf, 2); + if (!pb_decode(&MDR_ACK_istream, s2m_MDR_req_ACK_fields, &MDR_ACK)) { + // TODO Error handling for decoding fail + hs_sts = HS_FAILED; + } + else { + MDR_len = MDR_ACK.MDR_res_length; + } + hs_sts = HS_MDR_CTS; + free(MDR_ACK_buf); } + break; } } } @@ -188,7 +215,8 @@ int main(void) __TESTING_BLOCK_END: __asm__("nop"); #endif - + + Error_Handler(); #else /* MASTER */ @@ -48,7 +48,7 @@ #define SET_BIT_FROM_IDX(a, b) a[b>>5]|=(1<<(b%32))
#define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
-#define I2C_ADDRESS 0x30F
+#define I2C_ADDRESS 0x05
/* Macro to toggle between master and slave firmware */
#define MASTER
|
