Go to most recent revision |
Blame |
Last modification |
View Log
| RSS feed
/**
* source for the Bluetooth driver
* @file bluetooth.c
* @author Linus Lotz<lotz@in.tum.de>
* @author Salomon Sickert
*/
//2013 Cebra, Erweiterung um BT Local-ID Abfrage
#include <string.h>
#include "../cpu.h"
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include "bluetooth.h"
#include "../main.h"
#ifdef HWVERSION3_9
#include "../uart/uart1.h"
#include "../uart/usart.h"
#include "../timer/timer.h"
#include "fifo.h"
#include "error.h"
#include "../lcd/lcd.h"
#include "../eeprom/eeprom.h"
#include "../setup/setup.h"
#include "bluetooth.h"
#include "../tracking/tracking.h"
//#define SaveMem
//
// Baudrate for the UART-connection to the BTM-222 on SQUIRREL
//
#define SQUIRREL
#ifdef SQUIRREL
#define UART_BAUD_RATE 19200
#endif
#ifdef NUT
#define UART_BAUD_RATE 19200
#endif
typedef enum {
BT_RAW
,
BT_DATA
,
BT_CMD
,
BT_NOECHO
,
BT_NOANSWER
} communication_mode_t
;
#define BT_CMD_TIMEOUT_MS 2000
typedef enum {
BT_TEST
, // AT
BT_CONNECT
, // ATA
BT_DISCONNECT
, // ATH
BT_CLEAR_ADDRESS
, // ATD0
BT_SET_ADDRESS
, // ATD=_____
BT_GET_LOCALID
, // ATB? Inquire the Local BD address
BT_FIND_DEVICES
, // ATF?
BT_DISABLE_AUTOCONNECT
, // ATO1
BT_ENABLE_AUTOCONNECT
, // ATO0
BT_SET_MASTER
, // ATR0
BT_SET_SLAVE
, // ATR1
BT_SET_PIN
, // ATP=1234
BT_SET_2400
, // ATL* Baudrate 2400
BT_SET_4800
, // ATL0 Baudrate 4800
BT_SET_9600
, // ATL1 Baudrate 9600
BT_SET_19200
, // ATL2 Baudrate 19200
BT_SET_38400
, // ATL3 Baudrate 38400
BT_SET_57600
, // ATL4 Baudrate 57600
BT_SET_115200
, // ATL5 Baudrate 115200
BT_SET_NOANSWER
, // ATQ1 Rückmeldungen aus
BT_SET_NOECHO
, // ATE0 ECHO deaktivieren
BT_SET_ANSWER
, // ATQ0 Rückmeldungen
BT_SET_ECHO
, // ATE1 ECHO aktivieren
BT_SET_DEFAULT
, // Defaultwerte setzen
BT_SET_NAME
, // Devicename
BT_SET_DISPWRDOWN
// disable auto Powerdown
} bt_cmd_t
;
//TODO: FIFO Grösse
#define IN_FIFO_SIZE 512
char localID
[15]="12345678901234";
static uint8_t bt_buffer
[IN_FIFO_SIZE
];
static fifo_t in_fifo
;
char bt_rx_buffer
[RXD_BUFFER_SIZE
];
volatile uint8_t bt_rx_len
;
volatile uint8_t bt_rx_ready
= 0;
uint8_t rx_GPS
;
static char start
= '$';
static char end
= '\n';
char data_decode
[RXD_BUFFER_SIZE
];
volatile uint16_t rx_timeout
;
uint8_t EchoAnswerOn
; //Merkzelle
static bt_mode_t bt_mode
= BLUETOOTH_SLAVE
;
static communication_mode_t comm_mode
= BT_CMD
;
uint8_t i
= 0;
//uint8_t NoEcho = 0;
//uint8_t NoAnswer = 0;
uint8_t bt_devicecount
= 0;
uint8_t bt_rxerror
= 0;
device_info device_list
[NUTS_LIST
];
uint8_t BT_New_Baudrate
= 0; //Merkzelle für zu setzende Baudrate
// Set a timeout of Y ms and a Conditon X, which have to be true while timeout
#define while_timeout(X, Y) for(uint16_t __timeout = 0; __timeout++ <= Y && (X); Delay_MS(Y ? 1 : 0))
//--------------------------------------------------------------
void Delay_MS
(int count
)
{
for (int i
= 0; i
< count
; i
++)
_delay_ms
(1);
}
void bt_start
(void)
{
if (Config.
BTIsSlave == true) EchoAnswerOn
= false; else EchoAnswerOn
= true;
}
//--------------------------------------------------------------
void uart_receive
(void)
{
unsigned int uart_data
;
while (!fifo_is_full
(&in_fifo
))
{
uart_data
= uart1_getc
();
// USART_puts(".");
switch (uart_data
& 0xFF00) {
// Framing Error detected, i.e no stop bit detected
case UART_FRAME_ERROR
:
#ifdef DEBUG
warn_pgm
(PSTR
("FRM ERR"));
#endif
bt_rxerror
++;
return;
// Overrun, a character already presend in the UART UDR register was
// not read by the interrupt handler before the next character arrived,
// one or more received characters have been dropped
//
case UART_OVERRUN_ERROR
:
#ifdef DEBUG
warn_pgm
(PSTR
("OVR ERR"));
#endif
bt_rxerror
++;
return;
// We are not reading the receive buffer fast enough,
// one or more received character have been dropped
//
case UART_BUFFER_OVERFLOW
:
#ifdef DEBUG
warn_pgm
(PSTR
("BUF ERR"));
#endif
bt_rxerror
++;
return;
// UART Inputbuffer empty, nothing to do
case UART_NO_DATA
:
return;
default:
{
fifo_write
(&in_fifo
, uart_data
);
#ifdef DEBUG
USART_putc
(uart_data
);
#endif
}
}
}
#ifdef DEBUG
warn_pgm
(PSTR
("FIFO OVR ERR"));
#endif
}
//--------------------------------------------------------------
static void uart_send
(const char *data
, const uint8_t length
)
{
#ifdef SND_DEBUG
debug_pgm
(PSTR
("bt_uart_send"));
if (comm_mode
== BT_CMD
) debug_pgm
(PSTR
("bt_uart_send:BT_CMD")); else debug_pgm
(PSTR
("bt_uart_send:Wrong comm-mode"));
if (EchoAnswerOn
== true) debug_pgm
(PSTR
("bt_uart_send:EchoAnswer ON")); else debug_pgm
(PSTR
("bt_uart_send:EchoAnswer OFF"));
#endif
char echo
;
// lcd_printp_at (i++, 1, PSTR("."), 0);
for (uint8_t i
= 0; i
< length
; i
++)
{
#ifdef SND_DEBUG
USART_putc
((data
[i
])); //test
#endif
// debug_pgm(PSTR("bt_init_S"));
if (uart1_putc
(data
[i
]) == 0)
{
#ifdef SND_DEBUG
warn_pgm
(PSTR
("UART: Remote not ready"));
#endif
return;
}
if (comm_mode
== BT_RAW
)
_delay_ms
(50);
if (comm_mode
== BT_DATA
)
_delay_ms
(1);
if ((comm_mode
== BT_CMD
) && (EchoAnswerOn
== true))
{
#ifdef SND_DEBUG
warn_pgm
(PSTR
("UARTsend: get Echo"));
#endif
uint8_t x
= 0;
for (; x
< 3; x
++)
{
while_timeout
(fifo_is_empty
(&in_fifo
), 200)
// for(uint16_t __timeout = 0; __timeout++ <= 200 && (fifo_is_empty(&in_fifo)); _delay_ms(200 ? 1 : 0))
uart_receive
();
fifo_read
(&in_fifo
, &echo
);
if (echo
!= data
[i
]) {
if (uart1_putc
(data
[i
]) == 0)
{
#ifdef SND_DEBUG
warn_pgm
(PSTR
("UART: Remote not ready"));
#endif
return;
}
}
else
break;
}
if (x
== 3)
{
error_putc
(data
[i
]);
#ifdef DEBUG
error_pgm
(PSTR
("BT: WRONG ECHO"));
//_delay_ms(2000);
#endif
}
}
else
{
for(uint16_t __timeout
= 0; __timeout
++ <= 200 && (fifo_is_empty
(&in_fifo
)); _delay_ms
(200 ? 1 : 0))
{
uart_receive
();
}
fifo_read
(&in_fifo
, &echo
);
#ifdef SND_DEBUG
warn_pgm
(PSTR
("UARTsend: skip Echo"));
#endif
}
}
}
//--------------------------------------------------------------
static uint16_t send_cmd
(const bt_cmd_t command
, const char *data
)
{
uint16_t CommandDelay
=0; // nach BTM222 Kommandos verschiedene Verzögerungszeiten bevor es weitergehen kann
// _delay_ms(500); // org 500 300 zu wenig
char full_command
[20]; // Maximum command size
switch (command
)
{
case BT_SET_PIN
:
strcpy_P
(full_command
, PSTR
("ATP="));
for (uint8_t i
= 0; i
< bt_pin_length
; i
++)
{
full_command
[i
+4] = Config.
bt_pin[i
];
}
full_command
[(bt_pin_length
+4)] =0;
CommandDelay
= 100; //100ms
break;
case BT_SET_DEFAULT
:
strcpy_P
(full_command
, PSTR
("ATZ0"));
CommandDelay
= 1000;
break;
case BT_SET_2400
:
strcpy_P
(full_command
, PSTR
("ATL*"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATL*"));
#endif
break;
case BT_SET_4800
:
strcpy_P
(full_command
, PSTR
("ATL0"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATL0"));
#endif
break;
case BT_SET_9600
:
strcpy_P
(full_command
, PSTR
("ATL1"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATL1"));
#endif
break;
case BT_SET_19200
:
strcpy_P
(full_command
, PSTR
("ATL2"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATL2"));
#endif
break;
case BT_SET_38400
:
strcpy_P
(full_command
, PSTR
("ATL3"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATL3"));
#endif
break;
case BT_SET_57600
:
strcpy_P
(full_command
, PSTR
("ATL4"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATL4"));
#endif
break;
case BT_SET_115200
:
strcpy_P
(full_command
, PSTR
("ATL5"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATL5"));
#endif
break;
case BT_SET_NOANSWER
:
strcpy_P
(full_command
, PSTR
("ATQ1"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATQ1"));
#endif
break;
case BT_SET_NOECHO
:
strcpy_P
(full_command
, PSTR
("ATE0"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATE0"));
#endif
break;
case BT_SET_ANSWER
:
strcpy_P
(full_command
, PSTR
("ATQ0"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATQ0"));
#endif
break;
case BT_SET_ECHO
:
strcpy_P
(full_command
, PSTR
("ATE1"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATE1"));
#endif
break;
case BT_TEST
:
strcpy_P
(full_command
, PSTR
("AT"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("AT"));
#endif
break;
case BT_CONNECT
:
strcpy_P
(full_command
, PSTR
("ATA"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATA"));
#endif
break;
case BT_DISCONNECT
:
strcpy_P
(full_command
, PSTR
("ATH"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATH"));
#endif
break;
case BT_CLEAR_ADDRESS
:
strcpy_P
(full_command
, PSTR
("ATD0"));
CommandDelay
= 100;
break;
case BT_SET_ADDRESS
:
strcpy_P
(full_command
, PSTR
("ATD="));
memcpy((full_command
+ strlen(full_command
)), data
, 12);
full_command
[16] = 0;
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATLD="));
#endif
break;
case BT_FIND_DEVICES
:
strcpy_P
(full_command
, PSTR
("ATF?"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATF?"));
#endif
break;
case BT_DISABLE_AUTOCONNECT
:
strcpy_P
(full_command
, PSTR
("ATO1"));
CommandDelay
= 3500;
#ifdef DEBUG
debug_pgm
(PSTR
("ATO1"));
#endif
break;
case BT_ENABLE_AUTOCONNECT
:
strcpy_P
(full_command
, PSTR
("ATO0"));
CommandDelay
= 3500;
#ifdef DEBUG
debug_pgm
(PSTR
("ATO0"));
#endif
break;
case BT_SET_MASTER
:
strcpy_P
(full_command
, PSTR
("ATR0"));
CommandDelay
= 3000;
#ifdef DEBUG
debug_pgm
(PSTR
("ATR0"));
#endif
break;
case BT_SET_SLAVE
:
strcpy_P
(full_command
, PSTR
("ATR1"));
CommandDelay
= 3000;
#ifdef DEBUG
debug_pgm
(PSTR
("ATR1"));
#endif
break;
case BT_SET_NAME
:
strcpy_P
(full_command
, PSTR
("ATN="));
for (uint8_t i
= 0; i
< bt_name_len
; i
++)
{
full_command
[i
+ 4] = Config.
bt_name[i
];
}
full_command
[(bt_name_len
+ 4)] = 0;
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATN="));
#endif
break;
case BT_SET_DISPWRDOWN
:
strcpy_P
(full_command
, PSTR
("ATS1"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATS1"));
#endif
break;
case BT_GET_LOCALID
:
strcpy_P
(full_command
, PSTR
("ATB?"));
CommandDelay
= 100;
#ifdef DEBUG
debug_pgm
(PSTR
("ATB?"));
#endif
break;
default:
warn_pgm
(PSTR
("CMD UNK"));
return false;
}
strcat_P
(full_command
, PSTR
("\r"));
// throw away your television
uart_receive
();
fifo_clear
(&in_fifo
);
// debug_pgm(PSTR("bt_init3, send command"));
// send command
uart_send
(full_command
, strlen(full_command
));
//TODO: hier ist ein Fehler bei den Bedingungen
// if (command == (BT_SET_NOECHO||BT_SET_NOANSWER||BT_SET_ECHO||BT_SET_ANSWER))
// {
// uart_receive();
// fifo_clear(&in_fifo);
// _delay_ms(CommandDelay);
//#ifdef DEBUG
// debug_pgm(PSTR("send_cmd: Echo Answer no Response"));
//#endif
//// return true;
//
// }
// else
{
// get response
#ifdef DEBUG
debug_pgm
(PSTR
("send_cmd:get Response"));
#endif
while_timeout
(true, BT_CMD_TIMEOUT_MS
)
{
uart_receive
();
if (command
== BT_GET_LOCALID
)
{
_delay_ms
(CommandDelay
);
return bt_getID
();
}
if (fifo_strstr_pgm
(&in_fifo
, PSTR
("OK\r\n")))
{
info_pgm
(PSTR
("CMD SEND: OK"));
_delay_ms
(CommandDelay
);
return true;
}
if (fifo_strstr_pgm
(&in_fifo
, PSTR
("ERROR\r\n")))
{
#ifdef DEBUG
info_pgm
(PSTR
("CMD SEND: Error"));
_delay_ms
(2000);
#endif
return false;
}
}
}
//#ifdef DEBUG
// if (command != BT_TEST)
// warn_pgm(PSTR("CMD SEND: TIMEOUT"));
// _delay_ms(2000);
//#endif
return false;
}
//bt_init
//--------------------------------------------------------------
//void test(void)
//{
// comm_mode = BT_RAW;
// for (uint8_t i = 0; i < 2; i++)
// if (send_cmd(BT_TEST, NULL))
// break;
// comm_mode = BT_CMD;
//}
#ifndef SaveMem
//--------------------------------------------------------------
static void clean_line
(void)
{
while_timeout
(true, 50)
uart_receive
();
fifo_strstr_pgm
(&in_fifo
, PSTR
("\r\n"));
}
static communication_mode_t update_comm_mode
(uint16_t timeout_ms
)
{
while_timeout
(true, timeout_ms
)
// for(uint16_t __timeout = 0; __timeout++ <= true && (timeout_ms); _delay_ms(true ? 1 : 0))
{
uart_receive
();
if (fifo_strstr_pgm
(&in_fifo
, PSTR
("DISCONNECT")))
{
clean_line
();
// test();
comm_mode
= BT_CMD
;
send_cmd
(BT_TEST
, NULL
);
return comm_mode
;
}
if (fifo_strstr_pgm
(&in_fifo
, PSTR
("CONNECT")))
{
_delay_ms
(100); //don't delete this, else there will be no success!!!!!!!!!
comm_mode
= BT_DATA
;
return comm_mode
;
}
if (fifo_strstr_pgm
(&in_fifo
, PSTR
("Time out,Fail to connect!")))
{
clean_line
();
#ifdef DEBUG
debug_pgm
(PSTR
("CONNECT FAILED\n"));
#endif
// test();
send_cmd
(BT_TEST
, NULL
);
comm_mode
= BT_CMD
;
return comm_mode
;
}
}
return comm_mode
;
}
#endif
//--------------------------------------------------------------
uint16_t bt_setbaud
(uint8_t baudrate
)
{
uint8_t init_error
= false;
uint8_t BT_found
= 0;
i
= 0;
// set_BTOn();
lcd_cls
();
lcd_printp_at
(0, 0, PSTR
("BT set new Baudrate.."), 0);
SetBaudUart1
(Old_Baudrate
);
fifo_init
(&in_fifo
, bt_buffer
, IN_FIFO_SIZE
);
_delay_ms
(100);
fifo_clear
(&in_fifo
);
// send_cmd(BT_TEST, NULL);
// comm_mode = BT_NOECHO;
// send_cmd(BT_SET_ECHO, NULL);
// send_cmd(BT_SET_ANSWER, NULL);
bt_set_EchoAnswer
(true);
#ifdef DEBUG
debug_pgm
(PSTR
("Check with PKT Baudrate"));
#endif
if (send_cmd
(BT_TEST
, NULL
)) // Test mit PKT_Baudrate
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found with PKT Baudrate"));
#endif
BT_found
= 1;
}
if (BT_found
== 0)
{
lcd_printp_at
(0, 1, PSTR
("Error1 set Baudrate.."), 0);
_delay_ms
(2100);
set_BTOff
();
return false;
}
else
{
/* Set comm_mode to CMD */
comm_mode
= BT_CMD
;
switch (baudrate
)
{
// case Baud_2400 : { /* Set BTM Baudrate */
// if (!(send_cmd(BT_SET_2400, NULL))) init_error = true;
// SetBaudUart1(Baud_2400);
// _delay_ms(100);
// break;
// }
case Baud_4800
: { /* Set BTM Baudrate */
if (!(send_cmd
(BT_SET_4800
, NULL
))) init_error
= true;
SetBaudUart1
(Baud_4800
);
_delay_ms
(100);
break;
}
case Baud_9600
: { /* Set BTM Baudrate */
if (!(send_cmd
(BT_SET_9600
, NULL
))) init_error
= true;
SetBaudUart1
(Baud_9600
);
_delay_ms
(100);
break;
}
case Baud_19200
: { /* Set BTM Baudrate */
if (!(send_cmd
(BT_SET_19200
, NULL
))) init_error
= true;
SetBaudUart1
(Baud_19200
);
_delay_ms
(100);
break;
}
case Baud_38400
: { /* Set BTM Baudrate */
if (!(send_cmd
(BT_SET_38400
, NULL
))) init_error
= true;
SetBaudUart1
(Baud_38400
);
_delay_ms
(100);
break;
}
case Baud_57600
: { /* Set BTM Baudrate */
if (!(send_cmd
(BT_SET_57600
, NULL
))) init_error
= true;
SetBaudUart1
(Baud_57600
);
_delay_ms
(100);
break;
}
case Baud_115200
: { /* Set BTM Baudrate */
if (!(send_cmd
(BT_SET_115200
, NULL
))) init_error
= true;
SetBaudUart1
(Baud_115200
);
_delay_ms
(100);
break;
}
break;
}
// /* Set BTM Echo aus */
// send_cmd(BT_SET_NOECHO, NULL);
//// test();
// comm_mode = BT_NOECHO;
// /* Set BTM Answer aus */
// send_cmd(BT_SET_NOANSWER, NULL);
//// test();
bt_set_EchoAnswer
(false);
bt_mode
= BLUETOOTH_SLAVE
;
// set_BTOff();
if (!init_error
)
{
lcd_printp_at
(0, 2, PSTR
("set Baudrate ok"), 0);
_delay_ms
(2100);
return true;
}
else
{
lcd_printp_at
(0, 2, PSTR
("set Baudrate Error"), 0);
_delay_ms
(2100);
return true;
}
}
}
void bt_set_EchoAnswer
(uint8_t onoff
)
{
if (onoff
== true)
{
// if (EchoAnswerOn==false)
// {
/* Set comm_mode to CMD */
comm_mode
= BT_CMD
;
send_cmd
(BT_SET_ECHO
, NULL
);
send_cmd
(BT_SET_ANSWER
, NULL
);
EchoAnswerOn
= true;
send_cmd
(BT_TEST
, NULL
);
// fifo_clear(&in_fifo);
// }
#ifdef DEBUG
debug_pgm
(PSTR
("bt_set_EchoAnswer: on"));
#endif
}
else
{
// if (EchoAnswerOn==true)
// {
/* Set comm_mode to CMD */
comm_mode
= BT_CMD
;
EchoAnswerOn
= false;
send_cmd
(BT_SET_NOECHO
, NULL
);
send_cmd
(BT_SET_NOANSWER
, NULL
);
// fifo_clear(&in_fifo);
// }
#ifdef DEBUG
debug_pgm
(PSTR
("bt_set_EchoAnswer: off"));
#endif
}
}
//--------------------------------------------------------------
uint16_t bt_init
(void)
{
uint8_t init_error
= false;
uint8_t BT_found
= 0;
i
= 0;
set_BTOn
();
lcd_cls
();
lcd_printp_at
(0, 0, PSTR
("BT initialisieren.."), 0);
// _delay_ms(200);
for (uint8_t z
= (bt_name_length
); z
> 0; z
--)
{
if (Config.
bt_name[z
- 1] != ' ')
{
bt_name_len
= z
;
break;
}
}
// uart1_init(UART_BAUD_SELECT(57600, F_CPU));
SetBaudUart1
(Config.
PKT_Baudrate);
fifo_init
(&in_fifo
, bt_buffer
, IN_FIFO_SIZE
);
_delay_ms
(100);
// debug_pgm(PSTR("bt_init"));
uart_receive
();
// debug_pgm(PSTR("bt_init1"));
fifo_clear
(&in_fifo
);
bt_disconnect
();
bt_set_EchoAnswer
(true);
// debug_pgm(PSTR("bt_init2"));
#ifdef DEBUG
debug_pgm
(PSTR
("Check with PKT Baudrate"));
#endif
send_cmd
(BT_TEST
, NULL
); // Schrott löschen
send_cmd
(BT_TEST
, NULL
); // Schrott löschen
if (send_cmd
(BT_TEST
, NULL
)) // Test mit 57600
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found with PKT Baudrate"));
#endif
BT_found
= 1;
}
if (BT_found
== 0)
{
#ifdef DEBUG
debug_pgm
(PSTR
("Check with 19200"));
#endif
// uart1_init(UART_BAUD_SELECT(19200, F_CPU));// Test mit 19200
SetBaudUart1
(Baud_19200
);
// _delay_ms(100);
send_cmd
(BT_TEST
, NULL
); // Schrott löschen
send_cmd
(BT_TEST
, NULL
); // Schrott löschen
bt_set_EchoAnswer
(true);
if (send_cmd
(BT_TEST
, NULL
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("19200 OK"));
#endif
if (send_cmd
(BT_TEST
, NULL
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found 19200 Baud"));
#endif
Old_Baudrate
= Baud_19200
;
BT_found
= 2;
}
}
}
if (BT_found
== 0)
{
#ifdef DEBUG
debug_pgm
(PSTR
("Check with 38400"));
#endif
// uart1_init(UART_BAUD_SELECT(19200, F_CPU));// Test mit 19200
SetBaudUart1
(Baud_38400
);
// _delay_ms(100);
send_cmd
(BT_TEST
, NULL
); // Schrott löschen
// comm_mode = BT_NOECHO;
// send_cmd(BT_SET_ECHO, NULL);
// comm_mode = BT_NOANSWER;
// send_cmd(BT_SET_ANSWER, NULL);
// comm_mode = BT_CMD;
bt_set_EchoAnswer
(true);
if (send_cmd
(BT_TEST
, NULL
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("38400 OK"));
#endif
if (send_cmd
(BT_TEST
, NULL
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found 38400 Baud"));
#endif
Old_Baudrate
= Baud_38400
;
BT_found
= 2;
}
}
}
if (BT_found
== 0)
{
#ifdef DEBUG
debug_pgm
(PSTR
("Check with 9600"));
#endif
// uart1_init(UART_BAUD_SELECT(9600, F_CPU));//test mit 9600
SetBaudUart1
(Baud_9600
);
// _delay_ms(100);
send_cmd
(BT_TEST
, NULL
);
// comm_mode = BT_NOECHO;
// send_cmd(BT_SET_ECHO, NULL);
// comm_mode = BT_NOANSWER;
// send_cmd(BT_SET_ANSWER, NULL);
// comm_mode = BT_CMD;
bt_set_EchoAnswer
(true);
if (send_cmd
(BT_TEST
, NULL
));
{
#ifdef DEBUG
debug_pgm
(PSTR
("9600 OK"));
#endif
if (send_cmd
(BT_TEST
, NULL
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found 9600 Baud"));
#endif
Old_Baudrate
= Baud_9600
;
BT_found
= 3;
}
}
}
if (BT_found
== 0)
{
#ifdef DEBUG
debug_pgm
(PSTR
("Check with 57600"));
#endif
// uart1_init(UART_BAUD_SELECT(9600, F_CPU));//test mit 9600
SetBaudUart1
(Baud_57600
);
// _delay_ms(100);
send_cmd
(BT_TEST
, NULL
);
// comm_mode = BT_NOECHO;
// send_cmd(BT_SET_ECHO, NULL);
// comm_mode = BT_NOANSWER;
// send_cmd(BT_SET_ANSWER, NULL);
// comm_mode = BT_CMD;
bt_set_EchoAnswer
(true);
if (send_cmd
(BT_TEST
, NULL
));
{
#ifdef DEBUG
debug_pgm
(PSTR
("57600 OK"));
#endif
if (send_cmd
(BT_TEST
, NULL
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found 57600 Baud"));
#endif
Old_Baudrate
= Baud_57600
;
BT_found
= 4;
}
}
}
if (BT_found
== 0)
{
#ifdef DEBUG
debug_pgm
(PSTR
("Check with 4800"));
#endif
// uart1_init(UART_BAUD_SELECT(4800, F_CPU));//test mit 4800
SetBaudUart1
(Baud_4800
);
// _delay_ms(100);
send_cmd
(BT_TEST
, NULL
);
// comm_mode = BT_NOECHO;
// send_cmd(BT_SET_ECHO, NULL);
// comm_mode = BT_NOANSWER;
// send_cmd(BT_SET_ANSWER, NULL);
// comm_mode = BT_CMD;
bt_set_EchoAnswer
(true);
if (send_cmd
(BT_TEST
, NULL
));
{
#ifdef DEBUG
debug_pgm
(PSTR
("4800 OK"));
#endif
if (send_cmd
(BT_TEST
, NULL
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found 4800 Baud"));
#endif
Old_Baudrate
= Baud_4800
;
BT_found
= 5;
}
}
}
if (BT_found
> 0)
{
#ifdef DEBUG
debug_pgm
(PSTR
("BT found !"));
#endif
/* Set comm_mode to CMD */
comm_mode
= BT_CMD
;
// test();
// if (BTIsSlave==false)
// {
// fifo_init(&in_fifo, bt_buffer, IN_FIFO_SIZE);
_delay_ms
(100);
// test();
/* Clear remote address */
if(!(send_cmd
(BT_CLEAR_ADDRESS
, NULL
)))
init_error
= true;
// test();
/* Set BTM to SLAVE */
if (!(send_cmd
(BT_SET_SLAVE
, NULL
)))
init_error
= true;
// test();
/* Set BTM PIN */
if(!(send_cmd
(BT_SET_PIN
, NULL
)))
init_error
= true;
// test();
/* Set BTM Name */
if(!(send_cmd
(BT_SET_NAME
, NULL
)))
init_error
= true;
_delay_ms
(300);
// test();
if(!(send_cmd
(BT_SET_DISPWRDOWN
, NULL
)))
init_error
= true;
if(!(send_cmd
(BT_GET_LOCALID
, NULL
)))
init_error
= true;
// }
/* Set BTM Baudrate */
// if (!(send_cmd(BT_SET_57600, NULL)))
// init_error = true;
if (!bt_setbaud
(Config.
PKT_Baudrate)) init_error
= true;
// uart1_init(UART_BAUD_SELECT(57600, F_CPU));
SetBaudUart1
(Config.
PKT_Baudrate);
// /* Set BTM Echo aus */
// send_cmd(BT_SET_NOECHO, NULL);
//// test();
// comm_mode = BT_NOECHO;
// /* Set BTM Answer aus */
// send_cmd(BT_SET_NOANSWER, NULL);
//// test();
bt_set_EchoAnswer
(false);
bt_mode
= BLUETOOTH_SLAVE
;
set_BTOff
();
if (!init_error
)
{
WriteBTInitFlag
(); // Init merken
WriteBTSlaveFlag
();
bt_start
();
return true;
}
else
return false;
}
else
{
set_BTOff
();
return false;
}
}
#ifndef SaveMem
//--------------------------------------------------------------
uint8_t bt_set_mode
(const bt_mode_t mode
)
{
#ifdef DEBUG
debug_pgm
(PSTR
("bt_setmode: set Mode"));
#endif
// if (update_comm_mode(0) == BT_DATA) // 30.1.2012 CB
// return false;
if (mode
== bt_mode
)
return true;
if (mode
== BLUETOOTH_MASTER
)
{
comm_mode
= BT_CMD
;
bt_set_EchoAnswer
(true);
// _delay_ms(1000);
if (send_cmd
(BT_SET_MASTER
, NULL
))
{
bt_mode
= BLUETOOTH_MASTER
;
send_cmd
(BT_DISABLE_AUTOCONNECT
, NULL
);
WriteBTMasterFlag
();
#ifdef DEBUG
debug_pgm
(PSTR
("bt_setmode: Master is set"));
#endif
}
}
if (mode
== BLUETOOTH_SLAVE
)
{
comm_mode
= BT_CMD
;
bt_set_EchoAnswer
(true);
if (send_cmd
(BT_ENABLE_AUTOCONNECT
, NULL
))
{
bt_mode
= BLUETOOTH_SLAVE
;
send_cmd
(BT_SET_SLAVE
, NULL
);
WriteBTSlaveFlag
();
bt_set_EchoAnswer
(false);
comm_mode
= BT_CMD
;
#ifdef DEBUG
debug_pgm
(PSTR
("bt_setmode: Slave is set"));
#endif
}
}
// if (bt_mode == BLUETOOTH_MASTER) debug_pgm(PSTR("bt_mode:BLUETOOTH_MASTER "));
// if (bt_mode == BLUETOOTH_SLAVE) debug_pgm(PSTR("bt_mode:BLUETOOTH_SLAVE"));
// if (mode == BLUETOOTH_MASTER) debug_pgm(PSTR("mode:BLUETOOTH_MASTER "));
// if (mode == BLUETOOTH_SLAVE) debug_pgm(PSTR("mode:BLUETOOTH_SLAVE"));
return (mode
== bt_mode
);
}
//--------------------------------------------------------------
uint16_t bt_receive
(void *data
, uint8_t length
, uint16_t timeout_ms
)
{
uint8_t rec_length
= 0;
uint8_t i
= 0;
// while_timeout(true, timeout_ms);
for(uint16_t __timeout
= 0; __timeout
++ <= true && (timeout_ms
); _delay_ms
(true ? 1 : 0))
{
if (i
== length
)
return true;
uart_receive
();
if (fifo_is_empty
(&in_fifo
))
continue;
if (update_comm_mode
(0) != BT_DATA
)
{
#ifdef DEBUG
debug_pgm
(PSTR
("not connected"));
#endif
return false;
}
// We have a connection
if (timeout_ms
== 0)
timeout_ms
+= 2000;
if (fifo_is_empty
(&in_fifo
))
continue;
// Find starting point of packet
if (!rec_length
)
{
fifo_read
(&in_fifo
, (char *)&rec_length
);
if (rec_length
!= length
)
{
rec_length
= 0;
}
else
{
// You've got mail!
timeout_ms
+= 2000;
}
}
else
{
fifo_read
(&in_fifo
, (char *)data
+ i
);
i
++;
}
}
return false;
}
#endif
#ifndef SaveMem
//--------------------------------------------------------------
uint16_t bt_send
(void *data
, const uint8_t length
)
{
if (update_comm_mode
(0) == BT_CMD
)
return false;
uart_send
((const char *)&length
, 1);
uart_send
((char *)data
, length
);
return (update_comm_mode
(0) == BT_DATA
);
}
#ifdef SQUIRREL
//--------------------------------------------------------------
uint16_t bt_connect
(const char *address
)
{
fifo_init
(&in_fifo
, bt_buffer
, IN_FIFO_SIZE
);
uart_receive
();
fifo_clear
(&in_fifo
);
// Maybe we already disconnected???
if (BT_DATA
== update_comm_mode
(0))
{
#ifdef DEBUG
debug_pgm
(PSTR
("We are still connected..."));
#endif
return false;
}
// test();
send_cmd
(BT_TEST
, NULL
);
/*
if (!send_cmd(BT_DISABLE_AUTOCONNECT, address))
return false;
*/
// Test();
send_cmd
(BT_TEST
, NULL
);
#ifdef DEBUG
debug_pgm
(PSTR
("SET_ADD"));
#endif
if (!send_cmd
(BT_SET_ADDRESS
, address
))
return false;
// test();
send_cmd
(BT_TEST
, NULL
);
#ifdef DEBUG
debug_pgm
(PSTR
("CONNECT"));
#endif
if (!send_cmd
(BT_CONNECT
, NULL
))
return false;
#ifdef DEBUG
debug_pgm
(PSTR
("WAIT FOR COMM"));
#endif
return (BT_DATA
== update_comm_mode
(20000));
}
//--------------------------------------------------------------
uint16_t bt_disconnect
(void)
{
if (BT_CMD
== update_comm_mode
(0))
{
fifo_clear
(&in_fifo
);
return true;
}
// Switch to online cmd mode
for (uint8_t i
= 0; i
< 4; i
++)
{
const char plus
= '+';
uart_send
(&plus
, 1);
_delay_ms
(1000);
}
comm_mode
= BT_CMD
;
if (!send_cmd
(BT_DISCONNECT
, NULL
))
return false;
// test();
if (!send_cmd
(BT_CLEAR_ADDRESS
, NULL
))
return false;
// test();
if (BT_CMD
== update_comm_mode
(10000))
{
fifo_clear
(&in_fifo
);
return true;
}
#ifdef DEBUG
debug_pgm
(PSTR
("Still in DATA??"));
#endif
return false;
}
/*
BTM-222 Softwareversion 4.35
Inquiry Results:
111111111222222222233333333334
01234567890123456789012345678901234567890
1 LE091452 0024-2C-BEB0CA
2 E71 c 0024-7C-3EC9B9
BTM-222 Softwareversion 6.26
Inquiry Results:
1 E71 c 0024-7C-3EC9B9 N.A.
2 LE091452 0024-2C-BEB0CA N.A.
*/
//--------------------------------------------------------------
void copy_mac
(const char *src
, char *dst
)
{
uint8_t off
= 0;
for (uint8_t i
= 0; i
< 40; i
++)
{
if (src
[i
] == '-') if (src
[i
+3] == '-')// MAC Adresse suchen
{
off
= i
-4;
break;
}
}
for (uint8_t i
= 0; i
< 14; i
++)
{
if (src
[i
+ off
] == '-')
off
++;
dst
[i
] = src
[i
+ off
];
}
}
//--------------------------------------------------------------
void copy_localID
(const char *src
, char *dst
)
{
uint8_t off
= 0;
// for (uint8_t i = 0; i < 40; i++)
// {
// if (src[i] == '-') if (src[i+3] == '-')// MAC Adresse suchen
// {
// off = i-4;
// break;
// }
// }
for (uint8_t i
= 0; i
< 14; i
++)
{
if (src
[i
+ off
] == '-')
off
++;
dst
[i
] = src
[i
+ off
];
}
}
//--------------------------------------------------------------
void copy_DevName
(const char *src
, char *dst
)
{
uint8_t off
= 0;
for (uint8_t i
= 0; i
< 14; i
++)
{
if (src
[i
] == ' ') if (src
[i
+1] == ' ') break; // nach zwei Leerzeichen ist der Name zuende
dst
[i
] = src
[i
+ off
];
}
}
//--------------------------------------------------------------
uint16_t bt_discover
(char result
[8][12])
{
if (!bt_set_mode
(BLUETOOTH_MASTER
))
return false;
send_cmd
(BT_TEST
, NULL
);
if (!send_cmd
(BT_FIND_DEVICES
, NULL
))
{
return false;
}
char buffer
[255]; //oversized, but who cares?
char *bufferhead
= buffer
;
uint16_t pos
= 0;
uint16_t Timeout
= 40000;
uint16_t pos1
= 0;
uint16_t posC
= 0;
#ifdef DEBUG
debug_pgm
(PSTR
("discover2"));
#endif
do
{
uart_receive
();
Timeout
--;
pos1
++;
posC
++;
_delay_ms
(1);
write_ndigit_number_u
(0,5,fifo_getcount
(&in_fifo
),5,0,0);
if (posC
==1000)
{
lcd_printp_at
(i
++, 1, PSTR
("."), 0);
posC
= 0;
}
if (fifo_is_full
(&in_fifo
)) break;
#ifdef DEBUG
if (fifo_search
(&in_fifo
, PSTR
("Found."))) debug_pgm
(PSTR
("Suchen ende1"));
#endif
}
// while (((Timeout > 0) ||(!fifo_strstr_pgm(&in_fifo, PSTR("Inquiry Results:\r\n")))) && (!fifo_strstr_pgm(&in_fifo, PSTR("Found"))));
while ((Timeout
> 0)||(!fifo_strstr_pgm
(&in_fifo
, PSTR
("Inquiry Results:\r\n"))));
#ifdef DEBUG
debug_pgm
(PSTR
("Suchen ende2"));
if (Timeout
== 0) debug_pgm
(PSTR
("Timeout"));
if (fifo_is_full
(&in_fifo
)) debug_pgm
(PSTR
("Fifo Overrun, zuviele BT Devices"));
#endif
while (!fifo_is_empty
(&in_fifo
))
{
// Get next line
while (!fifo_cmp_pgm
(&in_fifo
, PSTR
("\r\n")))
{
fifo_read
(&in_fifo
, bufferhead
);
bufferhead
++;
}
// terminate string
*bufferhead
= 0;
//reset bufferhead
bufferhead
= buffer
;
if (strlen(buffer
) == 0)
continue; //the empty line before end of inquiry
if (strstr_P
(buffer
, PSTR
("Inquiry End")))
// if (searchend)
{
fifo_clear
(&in_fifo
);
// test();
return true;
}
copy_DevName
(&buffer
[3],device_list
[pos
].
DevName);
device_list
[pos
].
DevName[14] = 0; // Stringende
copy_mac
(&buffer
[3], device_list
[pos
].
mac);
// for (uint16_t i = 0; i < 15; i++)
// {
//
//// USART_putc((device_list[pos].DevName[i]));
// lcd_print_hex((device_list[pos].DevName[i]),0);
// }
// USART_putc('\n');
//
//
// for (uint16_t i = 0; i < 12; i++)
// {
//
// USART_putc((device_list[pos].mac[i]));
//
// }
//
// USART_putc('\n');
// USART_putc('\r');
pos
++;
}
return false;
}
//--------------------------------------------------------------
uint8_t bt_getID
(void)
{
char buffer
[255]; //oversized, but who cares?
char *bufferhead
= buffer
;
// uint16_t pos = 0;
#ifdef DEBUG
debug_pgm
(PSTR
("bt_getID1"));
#endif
while_timeout
(!fifo_strstr_pgm
(&in_fifo
, PSTR
("r\n")),
2000)
uart_receive
();
#ifdef DEBUG
debug_pgm
(PSTR
("bt_getID:Suchen ende2"));
// if (Timeout == 0) debug_pgm(PSTR("Timeout"));
if (fifo_is_full
(&in_fifo
)) debug_pgm
(PSTR
("bt_getID:Fifo Overrun"));
#endif
while (!fifo_is_empty
(&in_fifo
))
{
// Get next line
while (!fifo_cmp_pgm
(&in_fifo
, PSTR
("\r\n")))
{
fifo_read
(&in_fifo
, bufferhead
);
bufferhead
++;
// write_ndigit_number_u(10,4,fifo_getcount(&in_fifo),5,0,0);
}
// terminate string
*bufferhead
= 0;
//reset bufferhead
bufferhead
= buffer
;
if (strlen(buffer
) == 0)
continue; //the empty line before end of inquiry
copy_localID
(&buffer
[0], &localID
[0]);
for(uint8_t i
= 0; i
< 13; i
++)
{
lcd_putc
(i
, 6, localID
[i
],0);
Config.
bt_Mac[i
] = localID
[i
];
}
// lcd_printp_at (0, 7, PSTR("lokale ID hier"), 0);
//// write_ndigit_number_u(0,4,fifo_getcount(&in_fifo),5,0,0);
// while (!get_key_press (1 << KEY_ENTER));
#ifdef DEBUG
debug_pgm
(PSTR
("bt_getID:Copy ID"));
#endif
if ( fifo_strstr_pgm
(&in_fifo
, PSTR
("OK")))
{
fifo_clear
(&in_fifo
);
#ifdef DEBUG
debug_pgm
(PSTR
("bt_getID:OK found"));
#endif
return true;
}
else return false;
return true;
// pos++;
}
return false;
}
device_info device_list
[NUTS_LIST
];
void bt_downlink_init
(void)
{
fifo_init
(&in_fifo
, bt_buffer
, IN_FIFO_SIZE
);
_delay_ms
(100);
// debug_pgm(PSTR("bt_downlink_init"));
uart_receive
();
fifo_clear
(&in_fifo
);
// send_cmd(BT_TEST, NULL);
#ifdef DEBUG
debug_pgm
(PSTR
("downlink_init Start"));
#endif
if (Config.
BTIsSlave == true) // nur Init wenn BT ist Slave
{
#ifdef DEBUG
debug_pgm
(PSTR
("downlink_init:try to set Master"));
#endif
// comm_mode = BT_NOECHO;
//
// if (!send_cmd (BT_SET_ECHO,NULL)) {
//#ifdef DEBUG
// debug_pgm(PSTR("downlink_init:Couldn't set Echo!"));
//#endif
// }
//
// comm_mode = BT_NOANSWER;
// if (!send_cmd(BT_SET_ANSWER,NULL)) {
//#ifdef DEBUG
// debug_pgm(PSTR("downlink_init:Couldn't set Answer!"));
//#endif
//
// }
comm_mode
= BT_CMD
;
// send_cmd(BT_TEST, NULL);
bt_set_EchoAnswer
(true);
if (!bt_set_mode
(BLUETOOTH_MASTER
))
{
#ifdef DEBUG
debug_pgm
(PSTR
("downlink_init:Couldn't set master!"));
#endif
return;
}
#ifdef DEBUG
debug_pgm
(PSTR
("downlink_init:master is set "));
#endif
// WriteBTMasterFlag(); // Master merken
comm_mode
= BT_CMD
;
}
else
{
#ifdef DEBUG
debug_pgm
(PSTR
("downlink_init:Master was set"));
#endif
comm_mode
= BT_CMD
;
}
}
void bt_searchDevice
(void) //Bluetoothgeräte suchen
{
char result
[8][12];
for (uint8_t i
= 0; i
< 8; i
++) // alte Liste löschen
for (uint8_t j
= 0; j
< 12; j
++)
result
[i
][j
] = 0;
#ifdef DEBUG
debug_pgm
(PSTR
("Search Device:BT_discover"));
#endif
if (bt_discover
(result
))
{
bt_devicecount
= 0;
#ifdef DEBUG
debug_pgm
(PSTR
("Search Device:Search ok"));
#endif
for (uint8_t i
= 0; i
< 8; i
++)
{
if (valid
(i
))
bt_devicecount
++;
else break;
}
}
#ifdef DEBUG
else
debug_pgm
(PSTR
("Search Device:Search failed"));
#endif
// }
}
//
//--------------------------------------------------------------
volatile uint8_t bt_receiveNMEA
(void)
{
char received
;
static uint8_t line_flag
= 1;
static char* ptr_write
= bt_rx_buffer
;
uint32_t timeout
=400000;
while(!timeout
== 0){
if (bt_rx_ready
== 1)
return true;
uart_receive
();
if (fifo_is_empty
(&in_fifo
)) timeout
--;
if (fifo_is_empty
(&in_fifo
)) continue;
timeout
= 400000;
fifo_read
(&in_fifo
, &received
);
//#ifdef DEBUG
// USART_putc(received);
//#endif
// Find starting point of packet
if (bt_rx_ready
== 0)
{
if ((received
== start
) && (line_flag
==1))
{ // start '$'
line_flag
= 0; // New line has begun
ptr_write
= bt_rx_buffer
; // Begin at start of buffer
bt_rx_len
= 0;
//#ifdef DEBUG
// debug_pgm(PSTR("NMEA $"));
//#endif
}
if (line_flag
== 0)
{ // Are we receiving a line?
*ptr_write
= received
; // Add current byte
bt_rx_len
++;
// GPS Datensatzende
if (received
== end
)
{ // End of MK-GPS or NMEA-line?
line_flag
= 1; // Yes, start new line
bt_rx_ready
= 1; // Lock buffer until line has been processed
//#ifdef DEBUG
// debug_pgm(PSTR("NMEA End"));
//#endif
return true;
}
}
ptr_write
++;
if(bt_rx_len
== RXD_BUFFER_SIZE
) line_flag
= 1; // Line too long? Try again
}//if (bt_rx_ready == 0)
}
#ifdef DEBUG
debug_pgm
(PSTR
("bt_receiveNMEA: Timeout"));
#endif
return false;
}
//
////--------------------------------------------------------------
//uint16_t bt_receiveNMEA2(void)
//{
//
// char received;
// static uint8_t line_flag = 1;
// static char* ptr_write = bt_rx_buffer;
// uint16_t timeout_ms=2000;
//
//// while_timeout(true, timeout_ms) {
//while(1){
//
// uart_receive();
// if (fifo_is_empty(&in_fifo))
// continue;
// fifo_read(&in_fifo, &received);
// USART_putc(received);
//// _delay_ms(1);
// }
////
//return true;
//}
#endif
#endif
#endif