1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#include "baycom_modem.h"
#include "baycom_kernel.h"
#include "baycom_kiss.h"
#include <stdlib.h>
struct baycom_modem {
hybbx_baycom_backend_t backend;
baycom_kernel_modem_t *kernel;
baycom_kiss_modem_t *kiss;
};
hybbx_result_t baycom_modem_open(baycom_modem_t **out,
const hybbx_baycom_config_t *cfg,
baycom_modem_frame_cb cb, void *userdata)
{
baycom_modem_t *modem;
hybbx_result_t rc;
if (out == NULL || cfg == NULL) {
return HYBBX_ERR_INVALID;
}
*out = NULL;
modem = calloc(1, sizeof(*modem));
if (modem == NULL) {
return HYBBX_ERR_NOMEM;
}
modem->backend = cfg->backend;
if (cfg->backend == HYBBX_BAYCOM_BACKEND_KISS) {
rc = baycom_kiss_open(&modem->kiss, cfg, cb, userdata);
} else {
rc = baycom_kernel_open(&modem->kernel, cfg, cb, userdata);
}
if (rc != HYBBX_OK) {
baycom_modem_close(modem);
return rc;
}
*out = modem;
return HYBBX_OK;
}
void baycom_modem_close(baycom_modem_t *modem)
{
if (modem == NULL) {
return;
}
if (modem->kernel != NULL) {
baycom_kernel_close(modem->kernel);
}
if (modem->kiss != NULL) {
baycom_kiss_close(modem->kiss);
}
free(modem);
}
hybbx_result_t baycom_modem_poll(baycom_modem_t *modem)
{
if (modem == NULL) {
return HYBBX_ERR_INVALID;
}
if (modem->kiss != NULL) {
return baycom_kiss_poll(modem->kiss);
}
if (modem->kernel != NULL) {
return baycom_kernel_poll(modem->kernel);
}
return HYBBX_ERR_IO;
}
hybbx_result_t baycom_modem_send_frame(baycom_modem_t *modem,
const uint8_t *frame, size_t len)
{
if (modem == NULL) {
return HYBBX_ERR_INVALID;
}
if (modem->kiss != NULL) {
return baycom_kiss_send_frame(modem->kiss, frame, len);
}
if (modem->kernel != NULL) {
return baycom_kernel_send_frame(modem->kernel, frame, len);
}
return HYBBX_ERR_IO;
}
|