diff options
Diffstat (limited to 'Src/main-hs.c')
| -rw-r--r-- | Src/main-hs.c | 62 |
1 files changed, 55 insertions, 7 deletions
diff --git a/Src/main-hs.c b/Src/main-hs.c index d26674b..8645848 100644 --- a/Src/main-hs.c +++ b/Src/main-hs.c @@ -64,7 +64,7 @@ UART_HandleTypeDef huart1; device_info_t *device_info[BUS_DEVICE_LIMIT] = {NULL}; subscription_info_t* subs_info[BUS_DEVICE_LIMIT]; uint32_t allocated[4]={0}; -/* uint8_t dev_sts[128] = {OFFLINE}; */ +uint8_t dev_sts[BUS_DEVICE_LIMIT] = {OFFLINE}; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -72,10 +72,12 @@ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); static void MX_USART1_UART_Init(void); + /* USER CODE BEGIN PFP */ bool decode_subscriptions_callback(pb_istream_t *istream, const pb_field_t *field, void **args); -int handshake(uint32_t i2c_addr); - +hs_status_t handshake(uint32_t i2c_addr); +bool todo_hs_or_not_todo_hs(uint8_t i2c_addr); +state_t get_state_from_hs_status(uint16_t device_addr, hs_status_t hs_status); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ @@ -126,8 +128,13 @@ int main(void) #endif /* MASTER */ #endif /* TESTING_ENABLE */ - for (int i=0; i < 0x10; i++) - handshake(i); + hs_status_t hs_status; + for (int curr_addr=0; curr_addr < 10; 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); + } + } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ @@ -135,6 +142,7 @@ int main(void) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ + } /* USER CODE END 3 */ } @@ -272,7 +280,7 @@ static void MX_GPIO_Init(void) } /* USER CODE BEGIN 4 */ -int handshake(uint32_t i2c_addr) +hs_status_t handshake(uint32_t i2c_addr) { /* Handshake variables */ @@ -568,7 +576,7 @@ __DEBUG_BLOCK_END: __asm__("nop"); #endif - return 1; + return hs_sts; } bool decode_subscriptions_callback(pb_istream_t *istream, const pb_field_t *field, void **args) @@ -602,6 +610,46 @@ bool decode_subscriptions_callback(pb_istream_t *istream, const pb_field_t *fiel subs.i2c_address; return true; } + +bool todo_hs_or_not_todo_hs(uint8_t i2c_addr) +{ + uint8_t device_idx = GET_IDX_FROM_ADDR(i2c_addr); + state_t device_curr_state = dev_sts[device_idx]; + bool do_hs = false; + switch(device_curr_state) { + case NO_HS: + case CONNECTED: + case FAILED: + case OFFLINE: + do_hs = true; + break; + case REGISTERED: + case NO_DATA: + do_hs = false; + break; + } + return do_hs; +} + +state_t get_state_from_hs_status(uint16_t device_addr, hs_status_t hs_status) +{ + state_t device_state = OFFLINE; + switch(hs_status) { + case IDLE: + case HS_FAILED: + device_state = OFFLINE; + break; + case HS_MDR_ACK: + case HS_MDR_CTS: + case HS_MDR_MDR: + device_state = FAILED; + break; + case HS_REGISTERED: + device_state = REGISTERED; + break; + } + return device_state; +} /* USER CODE END 4 */ /** |
