1 /*
2  * Copyright 2018 Oticon A/S
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef BS_PCOM_BASE_H
7 #define BS_PCOM_BASE_H
8 
9 #include <stddef.h>
10 #include <stdbool.h>
11 #include <unistd.h>
12 #include "bs_types.h"
13 #include "bs_pc_base_types.h"
14 
15 #ifdef __cplusplus
16 extern "C"{
17 #endif
18 
19 int pb_create_fifo_if_not_there(const char* fifo_name);
20 int pb_create_com_folder(const char* s);
21 bool pb_check_sim_id(const char *s);
22 void pb_send_payload(int ff, void *buf, size_t size);
23 BSIM_INLINE void pb_send_msg(int ff, pc_header_t header,
24                              void *s, size_t s_size);
25 
26 typedef struct {
27   char **ff_path_dtp;
28   char **ff_path_ptd;
29   int *ff_dtp;
30   int *ff_ptd;
31   unsigned int n_devices;
32   bool *device_connected;
33   char *lock_path;
34 } pb_phy_state_t;
35 
36 int pb_phy_is_connected_to_device(pb_phy_state_t *state, uint d);
37 int pb_phy_initcom(pb_phy_state_t *state, const char* s, const char *p, uint n);
38 void pb_phy_disconnect_devices(pb_phy_state_t *state);
39 pc_header_t pb_phy_get_next_request(pb_phy_state_t *state, uint d);
40 void pb_phy_get_wait_s(pb_phy_state_t *state, uint d, pb_wait_t *wait_s);
41 void pb_phy_resp_wait(pb_phy_state_t *state, uint d);
42 void pb_phy_free_one_device(pb_phy_state_t *state, int d);
43 
44 typedef struct {
45   int ff_dtp;
46   int ff_ptd;
47   char *ff_path_dtp;
48   char *ff_path_ptd;
49   bool connected;
50   unsigned int this_dev_nbr;
51   char *lock_path;
52 } pb_dev_state_t;
53 
54 int pb_test_and_create_lock_file(const char *filename);
55 void pb_remove_lock_file(char** file_path);
56 int pb_device_test_and_create_lock_file(pb_dev_state_t *state, const char *phy_id, unsigned int dev_nbr);
57 
58 int pb_dev_init_com(pb_dev_state_t *state, uint d, const char* s, const char *p);
59 void pb_dev_disconnect(pb_dev_state_t *state);
60 void pb_dev_terminate(pb_dev_state_t *state);
61 void pb_dev_clean_up(pb_dev_state_t *state);
62 int pb_dev_read(pb_dev_state_t *state, void *buf, size_t n_bytes);
63 int pb_dev_request_wait_block(pb_dev_state_t *state, pb_wait_t *wait_s);
64 int pb_dev_request_wait_nonblock(pb_dev_state_t *state, pb_wait_t *wait_s);
65 int pb_dev_pick_wait_resp(pb_dev_state_t *state);
66 
pb_send_msg(int ff,pc_header_t header,void * s,size_t s_size)67 BSIM_INLINE void pb_send_msg(int ff, pc_header_t header,
68                              void *s, size_t s_size) {
69 #pragma GCC diagnostic push
70 #pragma GCC diagnostic ignored "-Wunused-result"
71     write(ff, &header, sizeof(header));
72     write(ff, s, s_size);
73 #pragma GCC diagnostic pop
74 }
75 
76 #define CHECK_CONNECTED(c) \
77   if (!c){ \
78     bs_trace_error_line("Programming error: Not connected\n"); \
79     return -1; \
80   }
81 
82 #define COM_FAILED_ERROR "Low level communication with phy failed"
83 
84 #define INVALID_RESP(header) \
85     bs_trace_error_line(COM_FAILED_ERROR \
86                         ": Received invalid response %i\n", header)
87 
88 #ifdef __cplusplus
89 }
90 #endif
91 
92 #endif
93