amiro-os / components / bluetooth / bluetooth-serial.cpp @ bc91a128
History | View | Annotate | Download (2.49 KB)
1 | 58fe0e0b | Thomas Schöpping | #include <ch.hpp> |
---|---|---|---|
2 | #include <hal.h> |
||
3 | |||
4 | #include <amiro/bluetooth/bluetooth-serial.hpp> |
||
5 | |||
6 | using namespace chibios_rt; |
||
7 | using namespace amiro; |
||
8 | |||
9 | /*
|
||
10 | * Class constructor
|
||
11 | */
|
||
12 | BluetoothSerial::BluetoothSerial(BLUETOOTH *bluetooth, uint8_t rxtx) : |
||
13 | BaseStaticThread<128>(), serialConn(bluetooth, this, "SERIAL"), |
||
14 | mailbox(mailboxBuffer, BLUETOOTH_SERIAL_MAILBOX_SIZE) { |
||
15 | iwrap = &(bluetooth->iwrap); |
||
16 | rx_tx = rxtx; |
||
17 | linkId = 0xFF;
|
||
18 | stopflag = 0;
|
||
19 | } |
||
20 | |||
21 | //----------------------------------------------------------------
|
||
22 | |||
23 | msg_t BluetoothSerial::main(void) {
|
||
24 | setName("BluetoothSerial");
|
||
25 | |||
26 | while (!this->shouldTerminate()) { |
||
27 | if (serialReceive())
|
||
28 | this->requestTerminate();
|
||
29 | } |
||
30 | return RDY_OK;
|
||
31 | } |
||
32 | |||
33 | /*
|
||
34 | * Member functions
|
||
35 | */
|
||
36 | msg_t BluetoothSerial::serialReceive() { |
||
37 | BluetoothDescriptor* recv_descriptor = NULL;
|
||
38 | uint8_t *buffer; |
||
39 | size_t length; |
||
40 | msg_t msg; |
||
41 | |||
42 | msg = mailbox.fetch((msg_t*) &recv_descriptor, TIME_INFINITE); |
||
43 | if ((msg == RDY_RESET) || stopflag)
|
||
44 | return RDY_RESET;
|
||
45 | |||
46 | buffer = recv_descriptor->bluetoothDescriptorGetPayload(); |
||
47 | length = recv_descriptor->bluetoothDescriptorGetPayloadLength(); |
||
48 | |||
49 | for (size_t i = 0; i < length; i++) |
||
50 | chSequentialStreamPut((BaseSequentialStream*) &SD1, buffer[i]); |
||
51 | |||
52 | msg = iwrap->transport.bluetoothTransportGetStorageMailbox()->post((msg_t) recv_descriptor, TIME_INFINITE); |
||
53 | if ((msg == RDY_RESET) || stopflag)
|
||
54 | return RDY_RESET;
|
||
55 | |||
56 | return RDY_OK;
|
||
57 | } |
||
58 | |||
59 | msg_t BluetoothSerial::serialTransmit(const uint8_t* serialdata, size_t length) {
|
||
60 | msg_t msg; |
||
61 | |||
62 | if ((rx_tx & 0x01) && (linkId != 0xFF) && (!stopflag)) |
||
63 | msg = iwrap->iwrapTransmit(linkId, serialdata, length); |
||
64 | else
|
||
65 | msg = RDY_RESET; |
||
66 | |||
67 | return msg;
|
||
68 | } |
||
69 | |||
70 | void BluetoothSerial::bluetoothSerialStart(uint8_t linkid) {
|
||
71 | linkId = linkid; |
||
72 | iwrap->transport.bluetoothTransportSetReceiveMailbox(linkId, &this->mailbox);
|
||
73 | |||
74 | if ((rx_tx & 0x02)) { // && (!stopflag)) { |
||
75 | this->start(NORMALPRIO);
|
||
76 | } |
||
77 | stopflag = 0;
|
||
78 | } |
||
79 | |||
80 | void BluetoothSerial::bluetoothSerialStop() {
|
||
81 | linkId = 0xFF;
|
||
82 | stopflag = 1;
|
||
83 | mailbox.post(RDY_RESET, TIME_INFINITE); // TIME_IMMEDIATE TIME_INFINITE
|
||
84 | } |
||
85 | |||
86 | bool BluetoothSerial::bluetoothSerialIsConnected() {
|
||
87 | if (linkId == 0xFF) |
||
88 | return false; |
||
89 | |||
90 | return true; |
||
91 | } |
||
92 | |||
93 | void BluetoothSerial::bluetoothSerialListen(const char *addr) { |
||
94 | serialConn.bluetoothConnectorListen(addr); |
||
95 | } |
||
96 | |||
97 | void BluetoothSerial::bluetoothSerialConnect(const char *addr){ |
||
98 | serialConn.bluetoothConnectorConnect(addr); |
||
99 | } |
||
100 | |||
101 | void BluetoothSerial::bluetoothSerialDisconnect(const char *addr) { |
||
102 | serialConn.bluetoothConnectorDisconnect(addr); |
||
103 | } |