19 #define DEBUG // Uncomment to print data for debugging
26 const uint8_t rfcomm_crc_table[256]
PROGMEM = {
27 0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
28 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
29 0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
30 0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
31 0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
32 0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
33 0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
34 0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
35 0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
36 0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
37 0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
38 0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
39 0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
40 0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
41 0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
42 0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
57 rfcomm_dcid[0] = 0x51;
58 rfcomm_dcid[1] = 0x00;
64 RFCOMMConnected =
false;
75 if(RFCOMMConnected && SDPConnected)
95 if (((l2capinbuf[0] | (l2capinbuf[1] << 8)) == (hci_handle | 0x2000))) {
96 if ((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001) {
99 Notify(PSTR(
"\r\nL2CAP Command Rejected - Reason: "));
100 PrintHex<uint8_t>(l2capinbuf[13]);
102 PrintHex<uint8_t>(l2capinbuf[12]);
104 PrintHex<uint8_t>(l2capinbuf[17]);
106 PrintHex<uint8_t>(l2capinbuf[16]);
108 PrintHex<uint8_t>(l2capinbuf[15]);
110 PrintHex<uint8_t>(l2capinbuf[14]);
114 Notify(PSTR(
"\r\nL2CAP Connection Request - PSM: "));
115 PrintHex<uint8_t>(l2capinbuf[13]);
117 PrintHex<uint8_t>(l2capinbuf[12]);
119 PrintHex<uint8_t>(l2capinbuf[15]);
121 PrintHex<uint8_t>(l2capinbuf[14]);
122 Notify(PSTR(
" Identifier: "));
123 PrintHex<uint8_t>(l2capinbuf[9]);
125 if ((l2capinbuf[12] | (l2capinbuf[13] << 8)) ==
SDP_PSM) {
126 identifier = l2capinbuf[9];
127 sdp_scid[0] = l2capinbuf[14];
128 sdp_scid[1] = l2capinbuf[15];
130 }
else if ((l2capinbuf[12] | (l2capinbuf[13] << 8)) ==
RFCOMM_PSM) {
131 identifier = l2capinbuf[9];
132 rfcomm_scid[0] = l2capinbuf[14];
133 rfcomm_scid[1] = l2capinbuf[15];
137 if ((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) {
138 if (l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
142 else if (l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
148 if (l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
150 identifier = l2capinbuf[9];
153 else if (l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
155 identifier = l2capinbuf[9];
159 if (l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
161 identifier = l2capinbuf[9];
163 }
else if (l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
165 identifier = l2capinbuf[9];
169 if (l2capinbuf[12] == sdp_scid[0] && l2capinbuf[13] == sdp_scid[1]) {
171 identifier = l2capinbuf[9];
173 }
else if (l2capinbuf[12] == rfcomm_scid[0] && l2capinbuf[13] == rfcomm_scid[1]) {
175 identifier = l2capinbuf[9];
180 Notify(PSTR(
"\r\nInformation request"));
182 identifier = l2capinbuf[9];
187 Notify(PSTR(
"\r\nL2CAP Unknown Signaling Command: "));
188 PrintHex<uint8_t>(l2capinbuf[8]);
191 }
else if (l2capinbuf[6] == sdp_dcid[0] && l2capinbuf[7] == sdp_dcid[1]) {
201 serialPortResponse1(l2capinbuf[9],l2capinbuf[10]);
202 firstMessage =
false;
204 serialPortResponse2(l2capinbuf[9],l2capinbuf[10]);
207 }
else if ((l2capinbuf[16] << 8 | l2capinbuf[17]) ==
L2CAP_UUID) {
209 l2capResponse1(l2capinbuf[9],l2capinbuf[10]);
210 firstMessage =
false;
212 l2capResponse2(l2capinbuf[9],l2capinbuf[10]);
216 serviceNotSupported(l2capinbuf[9],l2capinbuf[10]);
218 }
else if (l2capinbuf[6] == rfcomm_dcid[0] && l2capinbuf[7] == rfcomm_dcid[1]) {
219 rfcommChannel = l2capinbuf[8] & 0xF8;
220 rfcommDirection = l2capinbuf[8] & 0x04;
221 rfcommCommandResponse = l2capinbuf[8] & 0x02;
222 rfcommChannelType = l2capinbuf[9] & 0xEF;
223 rfcommPfBit = l2capinbuf[9] & 0x10;
225 if(rfcommChannel>>3 != 0x00)
226 rfcommChannelConnection = rfcommChannel;
229 Notify(PSTR(
"\r\nRFCOMM Channel: "));
230 Serial.print(rfcommChannel>>3,HEX);
231 Notify(PSTR(
" Direction: "));
232 Serial.print(rfcommDirection>>2,HEX);
233 Notify(PSTR(
" CommandResponse: "));
234 Serial.print(rfcommCommandResponse>>1,HEX);
235 Notify(PSTR(
" ChannelType: "));
236 Serial.print(rfcommChannelType,HEX);
237 Notify(PSTR(
" PF_BIT: "));
238 Serial.print(rfcommPfBit,HEX);
242 Notify(PSTR(
"\r\nReceived Disconnect RFCOMM Command on channel: "));
243 Serial.print(rfcommChannel>>3,HEX);
246 sendRfcomm(rfcommChannel,rfcommDirection,rfcommCommandResponse,
RFCOMM_UA,rfcommPfBit,rfcommbuf,0x00);
250 if(rfcommChannelType ==
RFCOMM_UIH && rfcommChannel == rfcommChannelConnection) {
251 uint8_t length = l2capinbuf[10] >> 1;
252 uint8_t offset = l2capinbuf[4]-length-4;
253 if(rfcommAvailable + length <=
sizeof(rfcommDataBuffer)) {
254 for(uint8_t i = 0; i < length; i++)
255 rfcommDataBuffer[rfcommAvailable+i] = l2capinbuf[11+i+offset];
256 rfcommAvailable += length;
259 Notify(PSTR(
"\r\nRFCOMM Data Available: "));
260 Serial.print(rfcommAvailable);
262 Notify(PSTR(
" - Credit: 0x"));
263 Serial.print(l2capinbuf[11],HEX);
266 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send to the Arduino via Bluetooth
267 for(uint8_t i = 0; i < length; i++)
268 Serial.write(l2capinbuf[i+11+offset]);
274 Notify(PSTR(
"\r\nReceived SABM Command"));
276 sendRfcomm(rfcommChannel,rfcommDirection,rfcommCommandResponse,
RFCOMM_UA,rfcommPfBit,rfcommbuf,0x00);
279 Notify(PSTR(
"\r\nReceived UIH Parameter Negotiation Command"));
282 rfcommbuf[1] = l2capinbuf[12];
283 rfcommbuf[2] = l2capinbuf[13];
291 sendRfcomm(rfcommChannel,rfcommDirection,0,
RFCOMM_UIH,rfcommPfBit,rfcommbuf,0x0A);
294 Notify(PSTR(
"\r\nSend UIH Modem Status Response"));
297 rfcommbuf[1] = 2 << 1 | 1;
298 rfcommbuf[2] = l2capinbuf[13];
299 rfcommbuf[3] = l2capinbuf[14];
300 sendRfcomm(rfcommChannel,rfcommDirection,0,
RFCOMM_UIH,rfcommPfBit,rfcommbuf,0x04);
304 Notify(PSTR(
"\r\nSend UIH Modem Status Command"));
307 rfcommbuf[1] = 2 << 1 | 1;
308 rfcommbuf[2] = l2capinbuf[13];
311 sendRfcomm(rfcommChannel,rfcommDirection,0,
RFCOMM_UIH,rfcommPfBit,rfcommbuf,0x04);
315 Notify(PSTR(
"\r\nSend UIH Command with credit"));
317 sendRfcommCredit(rfcommChannelConnection,rfcommDirection,0,
RFCOMM_UIH,0x10,
sizeof(rfcommDataBuffer));
320 waitForLastCommand =
true;
322 }
else if(rfcommChannelType ==
RFCOMM_UIH && l2capinbuf[10] == 0x01) {
324 Notify(PSTR(
"\r\nReceived UIH Command with credit"));
328 Notify(PSTR(
"\r\nReceived UIH Remote Port Negotiation Command"));
331 rfcommbuf[1] = l2capinbuf[12];
332 rfcommbuf[2] = l2capinbuf[13];
333 rfcommbuf[3] = l2capinbuf[14];
334 rfcommbuf[4] = l2capinbuf[15];
335 rfcommbuf[5] = l2capinbuf[16];
336 rfcommbuf[6] = l2capinbuf[17];
337 rfcommbuf[7] = l2capinbuf[18];
338 rfcommbuf[8] = l2capinbuf[19];
339 rfcommbuf[9] = l2capinbuf[20];
340 sendRfcomm(rfcommChannel,rfcommDirection,0,
RFCOMM_UIH,rfcommPfBit,rfcommbuf,0x0A);
342 Notify(PSTR(
"\r\nRFCOMM Connection is now established\r\n"));
344 waitForLastCommand =
false;
350 Notify(PSTR(
"\r\nUnsupported RFCOMM Data - ChannelType: "));
351 PrintHex<uint8_t>(rfcommChannelType);
352 Notify(PSTR(
" Command: "));
353 PrintHex<uint8_t>(l2capinbuf[11]);
360 Notify(PSTR(
"\r\nUnsupported L2CAP Data - Channel ID: "));
361 PrintHex<uint8_t>(l2capinbuf[7]);
363 PrintHex<uint8_t>(l2capinbuf[6]);
371 if(waitForLastCommand && (millis() - timer) > 100) {
373 Notify(PSTR(
"\r\nRFCOMM Connection is now established - Automatic\r\n"));
376 waitForLastCommand =
false;
380 void SPP::SDP_task() {
381 switch (l2cap_sdp_state)
387 Notify(PSTR(
"\r\nSDP Incoming Connection Request"));
402 Notify(PSTR(
"\r\nSDP Configuration Request"));
412 Notify(PSTR(
"\r\nSDP Successfully Configured"));
422 SDPConnected =
false;
424 Notify(PSTR(
"\r\nDisconnected SDP Channel"));
434 Notify(PSTR(
"\r\nDisconnected L2CAP Connection"));
436 RFCOMMConnected =
false;
437 SDPConnected =
false;
440 l2cap_event_flag = 0;
447 void SPP::RFCOMM_task()
449 switch (l2cap_rfcomm_state)
455 Notify(PSTR(
"\r\nRFCOMM Incoming Connection Request"));
470 Notify(PSTR(
"\r\nRFCOMM Configuration Request"));
480 Notify(PSTR(
"\r\nRFCOMM Successfully Configured"));
484 RFCOMMConnected =
true;
491 RFCOMMConnected =
false;
494 Notify(PSTR(
"\r\nDisconnected RFCOMM Channel"));
506 void SPP::SDP_Command(uint8_t* data, uint8_t nbytes) {
507 pBtd->
L2CAP_Command(hci_handle,data,nbytes,sdp_scid[0],sdp_scid[1]);
509 void SPP::serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
511 l2capoutbuf[1] = transactionIDHigh;
512 l2capoutbuf[2] = transactionIDLow;
513 l2capoutbuf[3] = 0x00;
514 l2capoutbuf[4] = 0x05;
515 l2capoutbuf[5] = 0x00;
516 l2capoutbuf[6] = 0x02;
519 l2capoutbuf[7] = 0x35;
520 l2capoutbuf[8] = 0x00;
521 l2capoutbuf[9] = 0x00;
523 SDP_Command(l2capoutbuf,10);
525 void SPP::serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
527 l2capoutbuf[1] = transactionIDHigh;
528 l2capoutbuf[2] = transactionIDLow;
529 l2capoutbuf[3] = 0x00;
530 l2capoutbuf[4] = 0x2B;
531 l2capoutbuf[5] = 0x00;
532 l2capoutbuf[6] = 0x26;
535 l2capoutbuf[7] = 0x36;
536 l2capoutbuf[8] = 0x00;
537 l2capoutbuf[9] = 0x3C;
538 l2capoutbuf[10] = 0x36;
539 l2capoutbuf[11] = 0x00;
541 l2capoutbuf[12] = 0x39;
542 l2capoutbuf[13] = 0x09;
543 l2capoutbuf[14] = 0x00;
544 l2capoutbuf[15] = 0x00;
545 l2capoutbuf[16] = 0x0A;
546 l2capoutbuf[17] = 0x00;
547 l2capoutbuf[18] = 0x01;
548 l2capoutbuf[19] = 0x00;
549 l2capoutbuf[20] = 0x06;
550 l2capoutbuf[21] = 0x09;
551 l2capoutbuf[22] = 0x00;
552 l2capoutbuf[23] = 0x01;
553 l2capoutbuf[24] = 0x35;
554 l2capoutbuf[25] = 0x03;
555 l2capoutbuf[26] = 0x19;
556 l2capoutbuf[27] = 0x11;
558 l2capoutbuf[28] = 0x01;
559 l2capoutbuf[29] = 0x09;
560 l2capoutbuf[30] = 0x00;
561 l2capoutbuf[31] = 0x04;
562 l2capoutbuf[32] = 0x35;
563 l2capoutbuf[33] = 0x0C;
564 l2capoutbuf[34] = 0x35;
565 l2capoutbuf[35] = 0x03;
566 l2capoutbuf[36] = 0x19;
567 l2capoutbuf[37] = 0x01;
568 l2capoutbuf[38] = 0x00;
569 l2capoutbuf[39] = 0x35;
570 l2capoutbuf[40] = 0x05;
571 l2capoutbuf[41] = 0x19;
572 l2capoutbuf[42] = 0x00;
573 l2capoutbuf[43] = 0x03;
575 l2capoutbuf[44] = 0x08;
576 l2capoutbuf[45] = 0x02;
577 l2capoutbuf[46] = 0x00;
578 l2capoutbuf[47] = 0x19;
580 SDP_Command(l2capoutbuf,48);
582 void SPP::serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
584 l2capoutbuf[1] = transactionIDHigh;
585 l2capoutbuf[2] = transactionIDLow;
586 l2capoutbuf[3] = 0x00;
587 l2capoutbuf[4] = 0x1C;
588 l2capoutbuf[5] = 0x00;
589 l2capoutbuf[6] = 0x19;
592 l2capoutbuf[7] = 0x01;
593 l2capoutbuf[8] = 0x09;
594 l2capoutbuf[9] = 0x00;
595 l2capoutbuf[10] = 0x06;
596 l2capoutbuf[11] = 0x35;
598 l2capoutbuf[12] = 0x09;
599 l2capoutbuf[13] = 0x09;
600 l2capoutbuf[14] = 0x65;
601 l2capoutbuf[15] = 0x6E;
602 l2capoutbuf[16] = 0x09;
603 l2capoutbuf[17] = 0x00;
604 l2capoutbuf[18] = 0x6A;
605 l2capoutbuf[19] = 0x09;
606 l2capoutbuf[20] = 0x01;
607 l2capoutbuf[21] = 0x00;
608 l2capoutbuf[22] = 0x09;
609 l2capoutbuf[23] = 0x01;
610 l2capoutbuf[24] = 0x00;
611 l2capoutbuf[25] = 0x25;
613 l2capoutbuf[26] = 0x05;
614 l2capoutbuf[27] =
'T';
615 l2capoutbuf[28] =
'K';
616 l2capoutbuf[29] =
'J';
617 l2capoutbuf[30] =
'S';
618 l2capoutbuf[31] =
'P';
619 l2capoutbuf[32] = 0x00;
621 SDP_Command(l2capoutbuf,33);
623 void SPP::l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
624 serialPortResponse1(transactionIDHigh,transactionIDLow);
626 void SPP::l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
627 serialPortResponse2(transactionIDHigh,transactionIDLow);
632 void SPP::RFCOMM_Command(uint8_t* data, uint8_t nbytes) {
633 if ((millis() - printTimer) < 10)
634 delay((uint32_t)(10 - (millis() - printTimer)));
635 pBtd->
L2CAP_Command(hci_handle,data,nbytes,rfcomm_scid[0],rfcomm_scid[1]);
636 printTimer = millis();
639 void SPP::sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t* data, uint8_t length) {
641 l2capoutbuf[1] = channelType | pfBit;
642 l2capoutbuf[2] = length << 1 | 0x01;
644 for(; i < length; i++)
645 l2capoutbuf[i+3] = data[i];
646 l2capoutbuf[i+3] = calcFcs(l2capoutbuf);
648 Notify(PSTR(
" - RFCOMM Data: "));
649 for(i = 0; i < length+4; i++) {
650 Serial.print(l2capoutbuf[i],HEX);
654 RFCOMM_Command(l2capoutbuf,length+4);
657 void SPP::sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit) {
659 l2capoutbuf[1] = channelType | pfBit;
660 l2capoutbuf[2] = 0x01;
661 l2capoutbuf[3] = credit;
662 l2capoutbuf[4] = calcFcs(l2capoutbuf);
664 Notify(PSTR(
" - RFCOMM Credit Data: "));
665 for(uint8_t i = 0; i < 5; i++) {
666 Serial.print(l2capoutbuf[i],HEX);
670 RFCOMM_Command(l2capoutbuf,5);
674 uint8_t SPP::__crc(uint8_t* data) {
675 return(pgm_read_byte(&rfcomm_crc_table[pgm_read_byte(&rfcomm_crc_table[0xff ^ data[0]]) ^ data[1]]));
679 uint8_t SPP::calcFcs(uint8_t *data) {
681 return (0xff - __crc(data));
683 return (0xff - pgm_read_byte(&rfcomm_crc_table[__crc(data) ^ data[2]]));
690 uint8_t length = str.length();
691 if(length > (
sizeof(l2capoutbuf)-4))
692 length =
sizeof(l2capoutbuf)-4;
693 l2capoutbuf[0] = rfcommChannelConnection | 0 | 0 |
extendAddress;;
695 l2capoutbuf[2] = length << 1 | 1;
697 for(; i < length; i++)
698 l2capoutbuf[i+3] = str[i];
699 l2capoutbuf[i+3] = calcFcs(l2capoutbuf);
701 RFCOMM_Command(l2capoutbuf,length+4);
706 uint8_t length = strlen(str);
707 if(length > (
sizeof(l2capoutbuf)-4))
708 length =
sizeof(l2capoutbuf)-4;
709 l2capoutbuf[0] = rfcommChannelConnection | 0 | 0 |
extendAddress;;
711 l2capoutbuf[2] = length << 1 | 1;
713 for(; i < length; i++)
714 l2capoutbuf[i+3] = str[i];
715 l2capoutbuf[i+3] = calcFcs(l2capoutbuf);
717 RFCOMM_Command(l2capoutbuf,length+4);
725 if(length > (
sizeof(l2capoutbuf)-4))
726 length =
sizeof(l2capoutbuf)-4;
727 l2capoutbuf[0] = rfcommChannelConnection | 0 | 0 |
extendAddress;;
729 l2capoutbuf[2] = length << 1 | 1;
731 for(; i < length; i++)
732 l2capoutbuf[i+3] = array[i];
733 l2capoutbuf[i+3] = calcFcs(l2capoutbuf);
735 RFCOMM_Command(l2capoutbuf,length+4);
741 uint8_t c = pgm_read_byte(p+size);
748 for(uint8_t i = 0; i < size; i++)
749 buf[i] = pgm_read_byte(p++);
754 String output = str +
"\r\n";
758 char output[strlen(str)+3];
760 strcat(output,
"\r\n");
764 uint8_t buf[3] = {data,
'\r',
'\n'};
768 uint8_t buf[length+2];
769 memcpy(buf,array,length);
771 buf[length+1] =
'\n';
778 uint8_t c = pgm_read_byte(p+size);
785 for(uint8_t i = 0; i < size; i++)
786 buf[i] = pgm_read_byte(p++);
793 uint8_t buf[2] = {
'\r',
'\n'};
799 bool negative =
false;
813 uint8_t buf[digits+1];
814 for(uint8_t i = 1; i < digits+1; i++) {
816 buf[digits-i+1] = n%10 +
'0';
818 buf[digits-i] = n%10 +
'0';
829 bool negative =
false;
843 uint8_t buf[digits+3];
844 for(uint8_t i = 1; i < digits+1; i++) {
846 buf[digits-i+1] = n%10 +
'0';
848 buf[digits-i] = n%10 +
'0';
853 buf[digits+1] =
'\r';
854 buf[digits+2] =
'\n';
858 buf[digits+1] =
'\n';
873 strcat(output,
"\r\n");
886 double rounding = 0.5;
887 for (uint8_t i=0; i<digits; i++)
891 unsigned long intpart = (
unsigned long)input;
892 itoa(intpart,buffer,10);
893 strcat(output,buffer);
895 double fractpart = (input-(double)intpart);
896 fractpart *= pow(10,digits);
897 for(uint8_t i=1;i<digits;i++) {
898 if(fractpart < pow(10,digits-i)) {
902 itoa((
unsigned long)fractpart,buffer,10);
903 strcat(output,buffer);
907 if(rfcommAvailable == 0)
909 uint8_t output = rfcommDataBuffer[0];
910 for(uint8_t i = 1; i < rfcommAvailable; i++)
911 rfcommDataBuffer[i-1] = rfcommDataBuffer[i];
914 if(bytesRead > (
sizeof(rfcommDataBuffer)-5)) {
916 sendRfcommCredit(rfcommChannelConnection,rfcommDirection,0,
RFCOMM_UIH,0x10,
sizeof(rfcommDataBuffer));
918 Notify(PSTR(
"\r\nSent "));
919 Serial.print(
sizeof(rfcommDataBuffer));
920 Notify(PSTR(
" more credit"));