summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Inc/devices.h11
-rw-r--r--Src/main-hs.c62
2 files changed, 61 insertions, 12 deletions
diff --git a/Inc/devices.h b/Inc/devices.h
index 58bc5b7..ef4e65b 100644
--- a/Inc/devices.h
+++ b/Inc/devices.h
@@ -30,11 +30,12 @@ typedef enum hs_status {
} hs_status_t;
typedef enum state {
- OFFLINE = 0, /* Device not found on bus */
- CONNECTED = 1, /* Device found on bus but handshake not completed */
- REGISTERED = 2, /* Completed handshake; ready for action */
- FAILED = 3, /* Handshake failed */
- NO_DATA = 4 /* ??? */
+ NO_HS = 0, /* Initial state: handshake not attempted yet */
+ OFFLINE = 1, /* Device not found on bus */
+ CONNECTED = 2, /* Device found on bus but handshake not completed */
+ REGISTERED = 3, /* Completed handshake; ready for action */
+ FAILED = 4, /* Handshake failed */
+ NO_DATA = 5 /* ??? */
} state_t;
/* Handshake message size definitions */
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 */
/**