endSly
Joined: 27 Jun 2007 Posts: 6
|
Bluetooth Module Driver |
Posted: Wed Jun 27, 2007 5:46 am |
|
|
This driver suports all a7eng serial bluetooth modules and parallax Bluetooth Module.
This is a first beta.
Code: | /***************************************************\
* bt.c Bluetooth Controler Library
*
* Distribute freely with copyright notice intact.
* Library to control a7eng's Bluetooth Modules eb100
* and eb500 by serial port using the CCS compilers.
* www.a7eng.com
*
* (c) 2007 endSly
*
** Functions Reference **
*-------------------------
* bt_command_mode(EscapeChar)
* The bt_command_mode allow to use commands.
* When Bluetooth device started goes automaticaly to
* command Mode
* Parameters:
* EscapeChar Control Char to escape from EasyConnect
* Mode. Default '+'
*
* bt_connect(Address, Profile, Timeout)
* The bt_connect command establishes a connection
* to another Bluetooth device. Returns 1 if error
* Parameters:
* Address The Bluetooth address of the remote
* device.
* Profile The Bluetooth profile to connect with.
* Timeout An optional parameter used to abort
* the connection request after the
* specified number of seconds.
* 0 -> Not Used
*
* bt_delete_trusted(All, Address)
* The delete trusted device command removes the
* remote device from the trusted list and prevents
* it from being able to connect with the local Bluetooth
* device when security is turned on.
* Parameters:
* All This parameter is used to remove
* all devices from trusted status if 1.
* Address The Bluetooth address of the device that
* should be removed from trusted status if all 0.
*
* bt_diconnect()
* The bt_disconnect command closes the connection
* with the remote Bluetooth device.
*
* bt_EasyConnect_mode()
* The bt_EasyConnect_mode commandallow to send messages
* via Bluetooth;
*
* bt_get_address(Device)
* The bt_get_address command returns a globally unique
* address for either the local Bluetooth device
* or the remote Bluetooth device.
* Parameters:
* Device LOCAL or REMOTE
*
* bt_get_connectable()
* The bt_get_connectable command returns the current
* connectable setting of the local Bluetooth device.
* Returns 1 if on, 0 if off or error
*
* bt_get_encrypt()
* The bt_get_encryp command returns the current
* encryption setting of the local Bluetooth device.
* Returns 1 if on, 0 if off or error
*
* bt_get_escape_char()
* The get escape character command returns the current
* character used in the soft break command to instruct
* the local EmbeddedBlue device to break the flow of
* data and begin accepting commands.
* Returns char or 0 if error
*
* bt_get_flow_control()
* The bt_get_flow_control command returns the flow control
* setting of the local EmbeddedBlue device.
* Returns 0 if none or 1 if hardware
*
* bt_get_link_timeout()
* The bt_get_link_timeout command returns the amount of time,
* in seconds, it takes for the local Bluetooth device to
* notice that the connection has been broken if the remote
* device disappears.
*
* bt_get_name(*Name)
* The bt_get_name command returns the name of the local
* Bluetooth device in *Name.
* Name's lenght 16 chars
*
* bt_get_security()
* The get security command returns the current security
* setting of the local EmbeddedBlue device.
* Returns 1 if on, 0 if off or error
*
* bt_get_tx_power()
* The bt_get_tx_power command returns the transmit
* power setting of the Bluetooth radio.
* The transmit power is set to 10 (maximum) by default.
*
* bt_get_visible()
* The bt_get_visible command returns the current visibility
* setting of the local EmbeddedBlue device.
* Returns 1 if on, 0 if off or error
*
* bt_list_trusted_devices(*ListAddress)
* The bt_list_trusted_devices command returns a list of
* all the devices that are allowed to connect to the
* local Bluetooth device when security is turned on.
* Parameters:
* ListAddress Pointer to array of address
*
* bt_list_visible_devices(*ListAddress, *Name, Timeout)
* The bt_list_visible_devices command returns a
* listing of all the Bluetooth devices that are
* currently in range and visible.
* Parameters:
* ListAddress Pointer to array of address
* Name Pointer to array of chars (16 chars for each Name)
* 0xFF Not names listed
* Timeout An optional parameter used to abort the
* list visible devices command after the
* specified number of seconds.
* 0 Not used
*
* bt_reset(Factory)
* The bt_reset command will cause the local Bluetooth
* device to reboot.
* Parameters:
* Factory Restores all device settings to factory
* defaults. This includes the baud rate parameter
* which may cause serial communications to be lost after
* the command is issued. To reestablish communications
* with the device after resetting to factory defaults,
* simply adjust the baud rate on the microprocessor
* serial port to match the device default rate of 9600bps.
*
* bt_set_baud_rate(Rate)
* The bt_set_baud_rate command sets the baud rate for
* communications with the local Bluetooth device.
* Parameters:
* Rate The baud rate value. Valid baud rates are
* 1200, 2400, 4800, 9600 (default), 19200,
* 38400, 57600, 115200, 230400, and 460800.
*
* bt_set_connectable(State)
* The bt_set_connectable command provides control over whether the
* local Bluetooth device will accept connections from other
* Bluetooth devices.
* Parameters:
* State 1- On / 0- Off
*
* bt_set_encrypt(State)
* The set encryption command provides control over whether
* transmitted data is encrypted or sent in the clear.
* Parameters:
* State 1- On / 0- Off
*
* bt_set_escape_char(Char)
* The bt_set_escape_char command provides control over the
* character used in the soft break command to instruct the
* local Bluetooth device to break the flow of data and begin
* accepting commands.
* Parameters:
* Char Escape Character
*
* bt_set_flow_control(State)
* The bt_set_flow _control command provides control over the
* flow control setting of the local Bluetooth device.
* Parameters:
* State 1- Hardware / 0- None
*
* bt_set_link_timeout(Timeout)
* The bt_set_link_timeout command sets the amount of time it
* takes for the local Bluetooth device to notice if the remote
* device disappears. In Bluetooth terminology, this command
* controls the setting for link supervisor timeout.
* Parameters:
* Timeout The time, in seconds, it takes for the device
* to notice that a connection has been broken.
*
* bt_set_name(*Name, Lenght)
* The bt_set_name command sets the name of the local Buetooth device.
* Parameters:
* Name Pointer to array of chars with name
* Lenght Lenght of the Name (Max = 32)
*
* bt_set_passkey(*Passkey, Lenght)
* The bt_set_passkey command sets the passkey that is used when
* establishing a connection with a new device.
* The passkey is set to 0000 by default.
* Parameters:
* Name Pointer to array of chars with Passkey
* Lenght Lenght of the Name (Max = 16)
*
* bt_set_security(State)
* The bt_set_security command sets the current security
* setting of the local Bluetooth device.
* Parameters:
* State 1- On / 0- Off
*
* bt_set_tx_power(Power)
* The bt_set_tx_power command sets the transmit power
* setting of the Bluetooth radio.
* Parameters:
* Power The power setting which is an integer
* between 1-10.
*
* bt_set_visible(State)
* The bt_set_visible command provides control over
* whether the local Bluetooth device can be seen by
* other Bluetooth devices.
* Parameters:
* State 1- On / 0- Off
*
\***************************************************/
#define ser_out printf
//Profiles
#define SPP 0 //Serial Port Profile "spp"
#define DUN 1 //Dial-Up Networking Profile "dun"
#define LOCAL 0 //Local Bluetooth
#define REMOTE 1 //Remote Bluetooth
typedef struct address{
unsigned int8 add_byte[6];
}address;
//ascii_to_u8bit -> Copy and Paste from Gary Smithson work - theByteFactory.com
unsigned int8 ascii_to_u8bit (char *string) // Converts string "A1" to unsigned 8 bit A1 (basically atoi but more compact)
{ // NOTE: This function processes both uppercase and lowercase strings
unsigned int8 MSN; // Most Significant Nibble of the result
unsigned int8 LSN; // Least Significant Nibble of the result
MSN = (string[0] - '0'); // Assume numeric and subtract text 0 which is ASCII 30
if (string[0] >= 'A') { // The character is actually alphabetic,...
MSN = MSN - 7; // ...adjust for the 7 character gap in the ASCII table
}
LSN = (string[1] - '0'); // Assume numeric and subtract text 0 which is ASCII 30
if (string[1] >= 'A') { // The character is actually alphabetic,...
LSN = LSN - 7; // ...adjust for the 7 character gap in the ASCII table
}
// Shift the MSN into position (zero fill), strip lowercase bit and...
return ((MSN << 4) | (LSN & 0x0F)); // ...merge it with the LSN after the lowercase bit is stripped
}
unsigned int8 ascii_to_dec (char *string) // Converts string "11" to unsigned 8 bit 11 (basically atoi but more compact)
{
unsigned int8 MSN;
unsigned int8 LSN;
unsigned int8 CSN;
MSN = (string[0] - '0'); // Assume numeric and subtract text 0 which is ASCII 30
if(string[1]==0x00)
return MSN;
LSN = (string[1] - '0'); // Assume numeric and subtract text 0 which is ASCII 30
if(string[2]==0x00)
return LSN + MSN*10;
CSN = (string[2] - '0'); // Assume numeric and subtract text 0 which is ASCII 30
return CSN + LSN*10 + MSN*100;
}
void bt_command_mode(char esc_char){
int i;
delay_ms(1000);
for(i=0;i<3;i++)
ser_out(esc_char);
delay_ms(1000);
ser_out("\r");
}
int bt_connect(address address, int8 profile, unsigned int8 timeout){
char r[3];
// Example of connect command:
//>con 00:0C:84:00:05:29 dun 10<CR>
ser_out("con %2x:%2x:%2x:%2x:%2x:%2x ", address.add_byte[0],
address.add_byte[1],
address.add_byte[2],
address.add_byte[3],
address.add_byte[4],
address.add_byte[5]);
switch(profile) {
case SPP : ser_out("spp"); break;
case DUN : ser_out("dun"); break;
}
if(timeout){
ser_out(" %u", timeout);
}
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int bt_delete_trusted(int1 all, address address){
char r[3];
ser_out("del trusted ");
if(all)
ser_out("all");
else
ser_out("%2x:%2x:%2x:%2x:%2x:%2x", address.add_byte[0],
address.add_byte[1],
address.add_byte[2],
address.add_byte[3],
address.add_byte[4],
address.add_byte[5]);
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int bt_disconnect(){
char r[3];
ser_out("dis\r"); //Send disconnect command
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int bt_EasyConnect_mode(){
char r[3];
ser_out("ret\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
address bt_get_address(int8 device){
int i;
char r[3];
char addr_s[18];
char byte_s[2];
address addr;
ser_out("get address ");
switch(device){
case LOCAL : ser_out("local"); break;
case REMOTE : ser_out("remote"); break;
}
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(addr_s);
for(i=0; i<6; i++){
byte_s[0]=addr_s[3*i];
byte_s[1]=addr_s[3*i+1];
addr.add_byte[i] = ascii_to_u8bit(byte_s);
}
}
return addr;
}
int1 bt_get_connectable(){
char r[3];
char s[3];
ser_out("get connectable\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
if(s[0]=='o'&&s[1]=='n'){
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
int1 bt_get_encrypt(){
char r[3];
char s[3];
ser_out("get encrypt\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
if(s[0]=='o'&&s[1]=='n'){
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
char bt_get_escape_char(){
char r[3];
char s;
ser_out("get escchar\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
s=getc();
return s;
} else {
return 0;
}
}
int1 bt_get_flow_control(){
char r[3];
char s[8];
ser_out("get flow\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
if(s[0]=='n'&&s[1]=='o'&&s[2]=='n'&&s[3]=='e'){
return 0;
} else {
return 1;
}
} else {
return 0;
}
}
unsigned int8 bt_get_link_timeout(){
char r[3];
char s[3];
ser_out("get linktimeout\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
return ascii_to_dec(s);
} else {
return 0;
}
}
void bt_get_name(char *name){
char r[3];
char s[16];
int i;
ser_out("get name\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
for(i=0;i<16;i++)
*(name + i) = s[i];
}
}
int1 bt_get_security(){
char r[3];
char s[3];
ser_out("get security\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
if(s[0]=='o'&&s[1]=='n'){
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
unsigned int8 bt_get_tx_power(){
char r[3];
char s[3];
ser_out("get txpower\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
return ascii_to_dec(s);
} else {
return 0;
}
}
int1 bt_get_visible(){
char r[3];
char s[3];
ser_out("get visible\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
gets(s);
if(s[0]=='o'&&s[1]=='n'){
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
int bt_list_trusted_devices(address *list_address){
char r[3];
char s[18];
int1 cntrl=0;
unsigned int8 byte_s[2];
int i;
unsigned int8 count = 0;
ser_out("lst trusted\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
while(!cntrl){
for(i=0;i<17;i++){
s[i]=getchar();
if(s[i]=='>'){
cntrl=1;
return count;
break;
}
}
for(i=0; i<6; i++){
byte_s[0]=s[3*i];
byte_s[1]=s[3*i+1];
list_address[count].add_byte[i] = ascii_to_u8bit(byte_s);
}
gets(r);
count += 1;
}
}
return count;
}
int bt_list_visible_devices(address *list_address, char *name, unsigned int8 timeout){
char r[3];
char s[18];
int1 cntrl=0;
unsigned int8 byte_s[2];
int i;
unsigned int8 count = 0;
ser_out("lst visible");
if(name != 0xFF)
ser_out(" name");
if(timeout)
ser_out(" %u", timeout);
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
while(!cntrl){
for(i=0;i<18;i++){
s[i]=getchar();
if(s[i]=='>'){
cntrl=1;
return count;
break;
}
}
if(name != 0xFF){
for(i=0;i<16;i++){
*name[i]=getchar();
printf(*name[i]);
if(*name[i] == 0x0D){
break;
}
}
} else {
gets(r);
}
for(i=0; i<6; i++){
byte_s[0]=s[3*i];
byte_s[1]=s[3*i+1];
list_address[count].add_byte[i] = ascii_to_u8bit(byte_s);
}
count += 1;
printf("OK");
}
}
return count;
}
int1 bt_reset(int1 factory){
char r[3];
ser_out("rst");
if(factory)
ser_out(" factory");
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_baud_rate(unsigned int32 rate){
char r[3];
ser_out("set baud %Lu\r", rate);
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_connectable(int1 state){
char r[3];
ser_out("set connectable ");
if(state){
ser_out("on\r");
} else {
ser_out("off\r");
}
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_encrypt(int1 state){
char r[3];
ser_out("set encrypt ");
if(state){
ser_out("on\r");
} else {
ser_out("off\r");
}
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_escape_char(char esc_char){
char r[3];
ser_out("set escchar ");
ser_out(esc_char);
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_flow_control(int1 state){
char r[3];
ser_out("set flow ");
if(state){
ser_out("none\r");
} else {
ser_out("hardware\r");
}
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_link_timeout(unsigned int8 timeout){
char r[3];
ser_out("set linktimeout %u\r", timeout);
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_name(char *name, unsigned int8 lenght){
char r[3];
unsigned int8 i;
ser_out("set name ");
for(i=0;i<lenght;i++)
ser_out(*(name+i));
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int bt_set_passkey(char *passkey, unsigned int8 lenght){
char r[3];
unsigned int8 i;
ser_out("set passkey ");
for(i=0;i<lenght;i++)
ser_out(*(passkey+i));
ser_out("\r");
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_security(int1 state){
char r[3];
ser_out("set security ");
if(state){
ser_out("on\r");
} else {
ser_out("off\r");
}
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_tx_power(unsigned int8 power){
char r[3];
ser_out("set txpower %u\r", power);
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
}
int1 bt_set_visible(int1 state){
char r[3];
ser_out("set visible ");
if(state){
ser_out("on\r");
} else {
ser_out("off\r");
}
gets(r);
if(r[0]=='A'&&r[1]=='C'&&r[2]=='K'){
return 0;
} else {
return 1;
}
} |
|
|