mirror of
https://github.com/halleysfifthinc/toyota-avc-lan-bluetooth.git
synced 2025-06-07 07:56:15 +00:00
Updated code changes and improvments
This commit is contained in:
parent
133cbce4d3
commit
3752709d6d
131
code/src/AVC.c
131
code/src/AVC.c
@ -63,16 +63,29 @@ static MESSAGE* message_rx_tail;//insert here
|
|||||||
|
|
||||||
static uint8_t usart_quiet = 0;
|
static uint8_t usart_quiet = 0;
|
||||||
|
|
||||||
static uint8_t IS_PLAYING = 0;
|
|
||||||
static uint8_t SECONDS = 0;
|
static uint8_t SECONDS = 0;
|
||||||
static uint8_t MINUTES = 0;
|
static uint8_t MINUTES = 0;
|
||||||
|
|
||||||
|
static uint8_t buttonSwitch = 0;
|
||||||
|
|
||||||
|
void status_push(void)
|
||||||
|
{
|
||||||
|
MESSAGE* msg = NULL;
|
||||||
|
while( (msg = AVC_add_tx_transaction_from_list(SELF_PLAYING_STATUS)) == NULL){
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
msg->data[8] = AVC_Toyota_digits(SECONDS);
|
||||||
|
msg->data[7] = AVC_Toyota_digits(MINUTES);
|
||||||
|
msg->data[5] = bluetooth_index() + 1;
|
||||||
|
sei();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void status_update(void){
|
void status_update(void){
|
||||||
if(IS_PLAYING){
|
|
||||||
MESSAGE* msg = AVC_add_tx_transaction_from_list(SELF_PLAYING_STATUS);
|
status_push();
|
||||||
msg->data[8] = AVC_Toyota_digits(SECONDS++);
|
if(bluetooth_is_playing()){
|
||||||
msg->data[7] = AVC_Toyota_digits(MINUTES);
|
SECONDS++;
|
||||||
sei();
|
|
||||||
if(SECONDS == 60){
|
if(SECONDS == 60){
|
||||||
SECONDS = 0;
|
SECONDS = 0;
|
||||||
MINUTES++;
|
MINUTES++;
|
||||||
@ -244,6 +257,15 @@ void handle_message(MSG_ID id){
|
|||||||
sei();//release once we have altered what we need to.
|
sei();//release once we have altered what we need to.
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case LAN_REGISTER:
|
||||||
|
{
|
||||||
|
MESSAGE* message;
|
||||||
|
while( (message = AVC_add_tx_transaction_from_list(SELF_REGISTER)) == NULL){
|
||||||
|
sei();//release while we don't have something.
|
||||||
|
}
|
||||||
|
sei();//release once we have altered what we need to.
|
||||||
|
}
|
||||||
|
break;
|
||||||
case CONSOLE_DISK_BUTTON_1:
|
case CONSOLE_DISK_BUTTON_1:
|
||||||
{
|
{
|
||||||
MESSAGE* message;
|
MESSAGE* message;
|
||||||
@ -268,20 +290,21 @@ void handle_message(MSG_ID id){
|
|||||||
break;
|
break;
|
||||||
case CONSOLE_DISK_PLAY:
|
case CONSOLE_DISK_PLAY:
|
||||||
{
|
{
|
||||||
if(!IS_PLAYING){
|
/*
|
||||||
MESSAGE* message;
|
MESSAGE* message;
|
||||||
while( (message = AVC_add_tx_transaction_from_list(RESP_CONSOLE_DISK_PLAY_0)) == NULL){
|
while( (message = AVC_add_tx_transaction_from_list(RESP_CONSOLE_DISK_PLAY_0)) == NULL){
|
||||||
sei();
|
|
||||||
}
|
|
||||||
sei();
|
|
||||||
while( (message = AVC_add_tx_transaction_from_list(RESP_CONSOLE_DISK_PLAY_1)) == NULL){
|
|
||||||
sei();
|
|
||||||
}
|
|
||||||
sei();
|
sei();
|
||||||
|
}
|
||||||
SECONDS = 0;
|
sei();
|
||||||
MINUTES = 0;
|
*/
|
||||||
IS_PLAYING = 1;
|
if(!bluetooth_connected())
|
||||||
|
{
|
||||||
|
bluetooth_enableSearch();
|
||||||
|
status_push();
|
||||||
|
}
|
||||||
|
if(!bluetooth_is_playing() && bluetooth_connected())
|
||||||
|
{
|
||||||
|
status_push();
|
||||||
bluetooth_play_song();
|
bluetooth_play_song();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,7 +312,6 @@ void handle_message(MSG_ID id){
|
|||||||
break;
|
break;
|
||||||
case CONSOLE_DISK_STOP:
|
case CONSOLE_DISK_STOP:
|
||||||
{
|
{
|
||||||
if(IS_PLAYING){
|
|
||||||
MESSAGE* message;
|
MESSAGE* message;
|
||||||
while( (message = AVC_add_tx_transaction_from_list(RESP_CONSOLE_DISK_STOP_0)) == NULL){
|
while( (message = AVC_add_tx_transaction_from_list(RESP_CONSOLE_DISK_STOP_0)) == NULL){
|
||||||
sei();
|
sei();
|
||||||
@ -299,25 +321,84 @@ void handle_message(MSG_ID id){
|
|||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
sei();
|
sei();
|
||||||
IS_PLAYING = 0;
|
|
||||||
bluetooth_pause_song();
|
bluetooth_pause_song();
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_SEEK_UP:
|
case CONSOLE_SEEK_UP:
|
||||||
{
|
{
|
||||||
if(IS_PLAYING){
|
if(bluetooth_is_playing()){
|
||||||
bluetooth_next_song();
|
bluetooth_next_song();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bluetooth_play_song();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_SEEK_DOWN:
|
case CONSOLE_SEEK_DOWN:
|
||||||
{
|
{
|
||||||
if(IS_PLAYING){
|
if(bluetooth_is_playing()){
|
||||||
bluetooth_previous_song();
|
bluetooth_previous_song();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case CONSOLE_BTN_1:
|
||||||
|
buttonSwitch = CONSOLE_BTN_1;
|
||||||
|
SECONDS = 0;
|
||||||
|
MINUTES = 0;
|
||||||
|
bluetooth_connectIndex(0);
|
||||||
|
break;
|
||||||
|
case CONSOLE_BTN_2:
|
||||||
|
if(buttonSwitch == CONSOLE_BTN_1)
|
||||||
|
{
|
||||||
|
buttonSwitch = CONSOLE_BTN_2;
|
||||||
|
}
|
||||||
|
SECONDS = 0;
|
||||||
|
MINUTES = 0;
|
||||||
|
bluetooth_connectIndex(1);
|
||||||
|
break;
|
||||||
|
case CONSOLE_BTN_3:
|
||||||
|
if(buttonSwitch == CONSOLE_BTN_2)
|
||||||
|
{
|
||||||
|
buttonSwitch = CONSOLE_BTN_3;
|
||||||
|
}
|
||||||
|
SECONDS = 0;
|
||||||
|
MINUTES = 0;
|
||||||
|
bluetooth_connectIndex(2);
|
||||||
|
break;
|
||||||
|
case CONSOLE_BTN_4:
|
||||||
|
if(buttonSwitch == CONSOLE_BTN_3)
|
||||||
|
{
|
||||||
|
buttonSwitch = CONSOLE_BTN_4;
|
||||||
|
}
|
||||||
|
SECONDS = 0;
|
||||||
|
MINUTES = 0;
|
||||||
|
bluetooth_connectIndex(3);
|
||||||
|
break;
|
||||||
|
case CONSOLE_BTN_5:
|
||||||
|
if(buttonSwitch == CONSOLE_BTN_4)
|
||||||
|
{
|
||||||
|
buttonSwitch = CONSOLE_BTN_5;
|
||||||
|
}
|
||||||
|
SECONDS = 0;
|
||||||
|
MINUTES = 0;
|
||||||
|
|
||||||
|
bluetooth_disableSearch();
|
||||||
|
bluetooth_disconnectAll();
|
||||||
|
|
||||||
|
break;
|
||||||
|
case CONSOLE_BTN_6:
|
||||||
|
if(buttonSwitch == CONSOLE_BTN_5)
|
||||||
|
{
|
||||||
|
buttonSwitch = 0;
|
||||||
|
reset_pairings();
|
||||||
|
}
|
||||||
|
SECONDS = 0;
|
||||||
|
MINUTES = 0;
|
||||||
|
bluetooth_disconnectAll();
|
||||||
|
bluetooth_enableSearch();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -82,10 +82,6 @@ typedef struct message{
|
|||||||
} MESSAGE;
|
} MESSAGE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AVC_init(uint8_t quiet);
|
void AVC_init(uint8_t quiet);
|
||||||
MESSAGE* AVC_add_tx_transaction(uint16_t address_arg, uint8_t broadcast_arg, uint8_t control_arg, uint8_t data_size_arg, uint8_t * data_arg, uint8_t print);
|
MESSAGE* AVC_add_tx_transaction(uint16_t address_arg, uint8_t broadcast_arg, uint8_t control_arg, uint8_t data_size_arg, uint8_t * data_arg, uint8_t print);
|
||||||
MESSAGE* AVC_add_tx_transaction_from_list(MSG_ID id);
|
MESSAGE* AVC_add_tx_transaction_from_list(MSG_ID id);
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
#define USART_CONTROL UCSR0B
|
#define USART_CONTROL UCSR0B
|
||||||
#define USART_DATA UDR0
|
#define USART_DATA UDR0
|
||||||
|
|
||||||
#define MAX_TX_BUFFER 355
|
#define MAX_TX_BUFFER 170
|
||||||
#define MAX_RX_BUFFER 50
|
#define MAX_RX_BUFFER 220
|
||||||
|
|
||||||
enum UART_ERROR_CODES {UART_GOOD, UART_BUFFER_FULL, UART_BUFFER_EMPTY, USART_COMP_SHORT, USART_COMP_LONG};
|
enum UART_ERROR_CODES {UART_GOOD, UART_BUFFER_FULL, UART_BUFFER_EMPTY, USART_COMP_SHORT, USART_COMP_LONG};
|
||||||
|
|
||||||
|
@ -26,121 +26,292 @@
|
|||||||
#include "bluetooth.h"
|
#include "bluetooth.h"
|
||||||
#include "USART.h"
|
#include "USART.h"
|
||||||
|
|
||||||
static MATCH_STATES match_state = NO_MATCH;
|
#define LINE_BUFFER 80
|
||||||
static uint8_t match_place = 0;
|
static void bluetooth_connect(void);
|
||||||
static char connected_mac_address[MAC_ADDRESS_LENGTH];
|
|
||||||
static void bluetooth_rec_callback(void);
|
static void bluetooth_rec_callback(void);
|
||||||
|
static uint8_t connected = 0;
|
||||||
|
static uint8_t is_playing = 0;
|
||||||
|
static uint8_t pair_search = 0;
|
||||||
|
static uint8_t pair_count = 0;
|
||||||
|
static uint8_t pair_index = 0;
|
||||||
|
static uint8_t tmp_pair_index = 0;
|
||||||
|
static char line[LINE_BUFFER];
|
||||||
|
static uint8_t line_index = 0;
|
||||||
|
static uint8_t callnumber = '0';
|
||||||
|
|
||||||
|
uint8_t bluetooth_index()
|
||||||
|
{
|
||||||
|
uint8_t index = pair_index;
|
||||||
|
if(index == 0)
|
||||||
|
{
|
||||||
|
index = pair_count;
|
||||||
|
}
|
||||||
|
index--;
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t bluetooth_is_playing()
|
||||||
|
{
|
||||||
|
return is_playing;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* mac_to_string(char* mac_addr)
|
||||||
|
{
|
||||||
|
static char mac_address[MAC_ADDRESS_STR_LENGTH];
|
||||||
|
for(int i = 0; i < MAC_ADDRESS_LENGTH; i++ )
|
||||||
|
{
|
||||||
|
char val = (mac_addr[i]&0xF0)>>4;
|
||||||
|
if(val <= 9)
|
||||||
|
{
|
||||||
|
mac_address[i*3] = '0' + val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mac_address[i*3] = val+('a'-0xA);
|
||||||
|
}
|
||||||
|
val = mac_addr[i]&0x0F;
|
||||||
|
if(val <= 9)
|
||||||
|
{
|
||||||
|
mac_address[(i*3)+1] = '0' + val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mac_address[(i*3)+1] = val+('a'-0xA);
|
||||||
|
}
|
||||||
|
mac_address[(i*3)+2] = ':';
|
||||||
|
}
|
||||||
|
mac_address[MAC_ADDRESS_STR_LENGTH-1] = '\0';
|
||||||
|
return mac_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t bluetooth_connected()
|
||||||
|
{
|
||||||
|
return connected;
|
||||||
|
}
|
||||||
|
|
||||||
void bluetooth_init(){
|
void bluetooth_init(){
|
||||||
|
|
||||||
|
add_task_no_arg(bluetooth_config, 0, SYSTEM_5_ms, 0);
|
||||||
add_task_no_arg(bluetooth_rec_callback, SYSTEM_20_ms, SYSTEM_5_ms, 0);
|
add_task_no_arg(bluetooth_rec_callback, SYSTEM_20_ms, SYSTEM_5_ms, 0);
|
||||||
|
add_task_no_arg(bluetooth_connect, 10*SYSTEM_1_S, SYSTEM_5_ms, 2*SYSTEM_1_S);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reset_pairings()
|
||||||
|
{
|
||||||
|
usart_put_c_str(PSTR("SET BT PAIR *\r\n"));
|
||||||
|
bluetooth_config();
|
||||||
|
pair_count = 0;
|
||||||
|
pair_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void bluetooth_config(){
|
void bluetooth_config(){
|
||||||
|
|
||||||
usart_put_c_str(PSTR("SET CONTROL ECHO 4\r\n"));
|
usart_put_c_str(PSTR("SET CONTROL ECHO 4\n"));
|
||||||
usart_put_c_str(PSTR("VOLUME 6\r\n"));
|
usart_put_c_str(PSTR("VOLUME 6\n"));
|
||||||
usart_put_c_str(PSTR("SET CONTROL MICBIAS 10 12\r\n"));
|
usart_put_c_str(PSTR("SET CONTROL CONFIG 100\n"));
|
||||||
usart_put_c_str(PSTR("SET CONTROL CONFIG 100\r\n"));
|
usart_put_c_str(PSTR("SET PROFILE A2DP SINK\n"));
|
||||||
usart_put_c_str(PSTR("SET PROFILE A2DP SINK\r\n"));
|
usart_put_c_str(PSTR("SET PROFILE AVRCP CONTROLLER\n"));
|
||||||
usart_put_c_str(PSTR("SET PROFILE AVRCP CONTROLLER\r\n"));
|
usart_put_c_str(PSTR("SET BT AUTH * 2323\n"));
|
||||||
usart_put_c_str(PSTR("SET PROFILE HFP ON\r\n"));
|
usart_put_c_str(PSTR("SET BT CLASS 200438\n"));
|
||||||
usart_put_c_str(PSTR("SET BT AUTH * 2323\r\n"));
|
usart_put_c_str(PSTR("SET BT NAME Matrix\n"));
|
||||||
usart_put_c_str(PSTR("SET BT CLASS 240428\r\n"));
|
// usart_put_c_str(PSTR("SET CONTROL CODEC SBC JOINT_STEREO 48000 0\n"));
|
||||||
usart_put_c_str(PSTR("SET BT NAME Bluetooth Matrix\r\n"));
|
// usart_put_c_str(PSTR("SET CONTROL CODEC SBC JOINT_STEREO 44100 1\n"));
|
||||||
|
usart_put_c_str(PSTR("RESET\n"));
|
||||||
usart_put_c_str(PSTR("SET CONTROL AUTOCALL 0017 5000 A2DP\r\n"));
|
|
||||||
|
|
||||||
usart_put_c_str(PSTR("SET CONTROL RINGTONE 6,gfgfgf__gfgfgf______gfgfgf__gfgfgf\r\n"));
|
|
||||||
|
|
||||||
usart_put_c_str(PSTR("RESET\r\n"));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bluetooth_next_song(){
|
void bluetooth_next_song(){
|
||||||
usart_put_c_str(PSTR("@0 AVRCP FORWARD\r\n"));
|
usart_put_c('@');usart_put_c(callnumber);
|
||||||
|
usart_put_c_str(PSTR(" AVRCP FORWARD\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void bluetooth_previous_song(){
|
void bluetooth_previous_song(){
|
||||||
usart_put_c_str(PSTR("@0 AVRCP BACKWARD\r\n"));
|
usart_put_c('@');usart_put_c(callnumber);
|
||||||
|
usart_put_c_str(PSTR(" AVRCP BACKWARD\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void bluetooth_pause_song(){
|
void bluetooth_pause_song(){
|
||||||
usart_put_c_str(PSTR("@0 AVRCP PAUSE\r\n"));
|
usart_put_c('@');usart_put_c(callnumber);
|
||||||
|
usart_put_c_str(PSTR(" AVRCP PAUSE\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void bluetooth_play_song(){
|
void bluetooth_play_song(){
|
||||||
usart_put_c_str(PSTR("@0 AVRCP PLAY\r\n"));
|
usart_put_c('@');usart_put_c(callnumber);
|
||||||
|
usart_put_c_str(PSTR(" AVRCP PLAY\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bluetooth_disableSearch()
|
||||||
|
{
|
||||||
|
pair_search = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_enableSearch()
|
||||||
|
{
|
||||||
|
pair_search = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_connect()
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!connected && pair_search)
|
||||||
|
{
|
||||||
|
pair_count = 0;
|
||||||
|
tmp_pair_index = 0;
|
||||||
|
usart_put_c_str(PSTR("SET BT PAIR\r\n"));
|
||||||
|
//usart_put_c_str(PSTR("SET\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_disconnectAll()
|
||||||
|
{
|
||||||
|
pair_search = 0;
|
||||||
|
usart_put_c_str(PSTR("CLOSE 0\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 1\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 2\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 3\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 4\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 5\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 6\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 7\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 8\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CLOSE 9\r\n"));
|
||||||
|
pair_count = 0;
|
||||||
|
tmp_pair_index = 0;
|
||||||
|
pair_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_connectIndex(uint8_t index)
|
||||||
|
{
|
||||||
|
bluetooth_disconnectAll();
|
||||||
|
pair_index = index;
|
||||||
|
usart_put_c_str(PSTR("SET BT PAIR\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct lineMatch
|
||||||
|
{
|
||||||
|
uint8_t match;
|
||||||
|
uint8_t partial;
|
||||||
|
char line[80];
|
||||||
|
} lineMatch;
|
||||||
|
|
||||||
|
lineMatch matchList [] PROGMEM = {
|
||||||
|
{MATCHING_PAIR_LIST, 1, "SET BT PAIR \b\b:\b\b:\b\b:\b\b:\b\b:\b\b "},
|
||||||
|
{MATCHING_CONNECT, 1, "CONNECT \b AVRCP 17"},
|
||||||
|
{MATCHING_CONNECT_ASYNC, 1, "RING \b \b\b:\b\b:\b\b:\b\b:\b\b:\b\b 17 AVRCP"},
|
||||||
|
{MATCHING_DISCONNECT, 1, "NO CARRIER \b ERROR 0 "},
|
||||||
|
{END_PAIR, 0, "SET"},
|
||||||
|
{START_PLAY, 1, "A2DP STREAMING START"},
|
||||||
|
{STOP_PLAY, 1, "A2DP STREAMING STOP"},
|
||||||
|
{SYNTAX_ERROR, 1, "SYNTAX ERROR"}
|
||||||
|
};
|
||||||
|
|
||||||
|
void parse_line()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
char matchEnum = 0xFF;
|
||||||
|
for(int l = 0; l < sizeof(matchList)/sizeof(lineMatch) && matchEnum == 0xFF; l++)
|
||||||
|
{
|
||||||
|
for(int c = 0; c < 80; c++)
|
||||||
|
{
|
||||||
|
char character = pgm_read_byte(&(matchList[l].line[c]));
|
||||||
|
if( (character == '\0') && (line[c] == character || pgm_read_byte(&(matchList[l].partial))))
|
||||||
|
{
|
||||||
|
matchEnum = pgm_read_byte(&(matchList[l].match));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if(character == '\b' || line[c] == character)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(matchEnum != 0xFF)
|
||||||
|
{
|
||||||
|
switch(matchEnum){
|
||||||
|
case MATCHING_PAIR_LIST:
|
||||||
|
if(pair_index == tmp_pair_index && !connected)
|
||||||
|
{
|
||||||
|
line[12+MAC_ADDRESS_STR_LENGTH] = '\0';
|
||||||
|
usart_put_c_str(PSTR("CALL "));
|
||||||
|
usart_put_str(&line[12]);
|
||||||
|
usart_put_c_str(PSTR("17 AVRCP\r\n"));
|
||||||
|
usart_put_c_str(PSTR("CALL "));
|
||||||
|
usart_put_str(&line[12]);
|
||||||
|
usart_put_c_str(PSTR("19 A2DP\r\n"));
|
||||||
|
pair_index++;
|
||||||
|
//send connect string
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp_pair_index++;
|
||||||
|
}
|
||||||
|
pair_count++;
|
||||||
|
break;
|
||||||
|
case MATCHING_CONNECT:
|
||||||
|
connected = 1;
|
||||||
|
callnumber = line[8];
|
||||||
|
break;
|
||||||
|
case MATCHING_CONNECT_ASYNC:
|
||||||
|
connected = 1;
|
||||||
|
callnumber = line[5];
|
||||||
|
break;
|
||||||
|
case MATCHING_DISCONNECT:
|
||||||
|
connected = 0;
|
||||||
|
is_playing = 0;
|
||||||
|
break;
|
||||||
|
case END_PAIR:
|
||||||
|
if(pair_index >= pair_count)
|
||||||
|
{
|
||||||
|
pair_index = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case START_PLAY:
|
||||||
|
is_playing = 1;
|
||||||
|
break;
|
||||||
|
case STOP_PLAY:
|
||||||
|
is_playing = 0;
|
||||||
|
break;
|
||||||
|
case SYNTAX_ERROR:
|
||||||
|
// usart_put_c_str(PSTR("SYNTAX_ERROR\r\n"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//usart_put_c('~');
|
||||||
|
//usart_put_str(line);
|
||||||
|
//usart_put_c_str(PSTR("\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void bluetooth_rec_callback(){
|
void bluetooth_rec_callback(){
|
||||||
|
|
||||||
uint8_t character;
|
uint8_t character;
|
||||||
const char* connect_str = PSTR("CONNECT 0 AVRCP 17\r\n");
|
|
||||||
const char* list_str = PSTR("LIST 0 CONNECTED L2CAP 48 0 0 0 0 0 ");
|
|
||||||
|
|
||||||
while((character = usart_get_c()) != UART_BUFFER_EMPTY){
|
while((character = usart_get_c()) != UART_BUFFER_EMPTY){
|
||||||
switch(match_state){
|
line[line_index] = character;
|
||||||
|
if(line_index < LINE_BUFFER-1)
|
||||||
case NO_MATCH:
|
{
|
||||||
match_place = 0;
|
line_index++;
|
||||||
if( character == pgm_read_byte_near(connect_str)){
|
}
|
||||||
match_state = MATCHING_CONNECT;
|
if( character == '\n')
|
||||||
match_place++;
|
{
|
||||||
}
|
line[line_index-2] = '\0';
|
||||||
else if( character == pgm_read_byte_near(list_str)){
|
parse_line();
|
||||||
match_state = MATCHING_LIST;
|
line_index = 0;
|
||||||
match_place++;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case MATCHING_CONNECT:
|
|
||||||
if( character == pgm_read_byte_near(connect_str + match_place)){
|
|
||||||
if(character == '\n'){
|
|
||||||
match_state = NO_MATCH;
|
|
||||||
usart_put_c_str(PSTR("LIST\r\n"));
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
match_place++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
match_state = NO_MATCH;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MATCHING_LIST:
|
|
||||||
{
|
|
||||||
uint8_t list_char = pgm_read_byte_near(list_str + match_place);
|
|
||||||
if( character == list_char){
|
|
||||||
match_place++;
|
|
||||||
}
|
|
||||||
else if(list_char == '\0'){
|
|
||||||
match_state = FETCHING_MAC;
|
|
||||||
connected_mac_address[0] = character;
|
|
||||||
match_place = 1;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
match_state = NO_MATCH;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case FETCHING_MAC:
|
|
||||||
if(match_place < MAC_ADDRESS_LENGTH-1){
|
|
||||||
connected_mac_address[match_place] = character;
|
|
||||||
match_place++;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
connected_mac_address[match_place] = '\0';
|
|
||||||
usart_put_c_str(PSTR("CALL "));
|
|
||||||
usart_put_str(connected_mac_address);
|
|
||||||
usart_put_c_str(PSTR(" 111F HFP\r\n"));
|
|
||||||
match_state = NO_MATCH;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,20 +18,35 @@
|
|||||||
#ifndef __BLUETOOTH_H
|
#ifndef __BLUETOOTH_H
|
||||||
#define __BLUETOOTH_H
|
#define __BLUETOOTH_H
|
||||||
|
|
||||||
#define MAC_ADDRESS_LENGTH 18
|
#define MAC_ADDRESS_LENGTH 6
|
||||||
|
#define MAC_ADDRESS_STR_LENGTH 18
|
||||||
|
#define PAIR_COUNT 3
|
||||||
|
|
||||||
|
uint8_t bluetooth_connected(void);
|
||||||
|
void reset_pairings(void);
|
||||||
void bluetooth_init(void);
|
void bluetooth_init(void);
|
||||||
void bluetooth_config(void);
|
void bluetooth_config(void);
|
||||||
|
void bluetooth_connectIndex(uint8_t index);
|
||||||
|
void bluetooth_enableSearch();
|
||||||
|
void bluetooth_disableSearch();
|
||||||
|
void bluetooth_disconnectAll();
|
||||||
|
uint8_t bluetooth_index(void);
|
||||||
|
uint8_t bluetooth_is_playing(void);
|
||||||
void bluetooth_next_song(void);
|
void bluetooth_next_song(void);
|
||||||
void bluetooth_previous_song(void);
|
void bluetooth_previous_song(void);
|
||||||
void bluetooth_pause_song(void);
|
void bluetooth_pause_song(void);
|
||||||
void bluetooth_play_song(void);
|
void bluetooth_play_song(void);
|
||||||
|
|
||||||
typedef enum MATCH_STATES {
|
typedef enum MATCH_STATES {
|
||||||
NO_MATCH,
|
NO_MATCH = 0,
|
||||||
MATCHING_CONNECT,
|
MATCHING_PAIR_LIST = 1,
|
||||||
MATCHING_LIST,
|
END_PAIR = 2,
|
||||||
FETCHING_MAC,
|
MATCHING_CONNECT = 3,
|
||||||
|
MATCHING_CONNECT_ASYNC = 4,
|
||||||
|
MATCHING_DISCONNECT = 5,
|
||||||
|
SYNTAX_ERROR = 6,
|
||||||
|
START_PLAY = 7,
|
||||||
|
STOP_PLAY = 8
|
||||||
} MATCH_STATES;
|
} MATCH_STATES;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -29,20 +29,19 @@
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
// wdt_disable();
|
|
||||||
_delay_ms(1000);
|
_delay_ms(50);
|
||||||
init_task_man();
|
init_task_man();
|
||||||
bluetooth_init();
|
|
||||||
USART_INIT_POLLING();
|
USART_INIT_POLLING();
|
||||||
|
bluetooth_init();
|
||||||
// USART_INIT_INTERRUPT();
|
// USART_INIT_INTERRUPT();
|
||||||
AVC_init(1);
|
AVC_init(1);
|
||||||
sei();
|
sei();
|
||||||
// usart_put_c('t');
|
// usart_put_c('t');
|
||||||
_delay_ms(500);
|
_delay_ms(200);
|
||||||
AVC_add_tx_transaction_from_list(SELF_REGISTER);
|
// AVC_add_tx_transaction_from_list(SELF_REGISTER);
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
add_task_no_arg(bluetooth_config, 0, SYSTEM_1_S, SYSTEM_1_S);
|
|
||||||
// wdt_enable( WDTO_2S );
|
// wdt_enable( WDTO_2S );
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user