Break out Bluetooth functions in own module
This commit is contained in:
parent
36bbcbe182
commit
d1e0ca32db
5 changed files with 152 additions and 232 deletions
|
@ -24,6 +24,7 @@
|
|||
#include <metawatch.h>
|
||||
#include <crc16ccitt.h>
|
||||
#include <mw_utility.h>
|
||||
#include <bt_helper.h>
|
||||
|
||||
typedef struct {
|
||||
// GMainLoop *mloop;
|
||||
|
@ -175,120 +176,6 @@ void mw_get_real_time_clock_response_cb(mwdevice_t *mwdevice, struct tm *mw_tm,
|
|||
gtk_button_set_label(rtc_button, label_str);
|
||||
}
|
||||
|
||||
int open_socket(bdaddr_t *bdaddr, uint8_t channel)
|
||||
{
|
||||
struct sockaddr_rc addr;
|
||||
int sk, opt;
|
||||
|
||||
sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
|
||||
if (sk < 0) {
|
||||
fprintf(stderr, "Can't create socket: %s (%d)\n",
|
||||
strerror(errno), errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
f = 1;
|
||||
if (setsockopt(sk, SOL_BLUETOOTH, BT_FLUSHABLE, &f, sizeof(f)) < 0) {
|
||||
fprintf(stderr, "Can't set flushable: %s (%d)\n",
|
||||
strerror(errno), errno);
|
||||
return -1;
|
||||
}
|
||||
*/
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.rc_family = AF_BLUETOOTH;
|
||||
bacpy(&addr.rc_bdaddr, BDADDR_ANY);
|
||||
|
||||
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
|
||||
fprintf(stderr, "Can't bind socket: %s (%d)\n",
|
||||
strerror(errno), errno);
|
||||
close(sk);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Set link mode */
|
||||
opt = 0;
|
||||
opt |= RFCOMM_LM_MASTER;
|
||||
opt |= RFCOMM_LM_AUTH;
|
||||
/*
|
||||
opt |= RFCOMM_LM_ENCRYPT;
|
||||
opt |= RFCOMM_LM_SECURE;
|
||||
*/
|
||||
if (opt && setsockopt(sk, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)) < 0) {
|
||||
fprintf(stderr, "Can't set RFCOMM link mode: %s (%d)",
|
||||
strerror(errno), errno);
|
||||
close(sk);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.rc_family = AF_BLUETOOTH;
|
||||
bacpy(&addr.rc_bdaddr, bdaddr);
|
||||
addr.rc_channel = channel;
|
||||
|
||||
if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
|
||||
fprintf(stderr, "Can't connect: %s (%d)\n",
|
||||
strerror(errno), errno);
|
||||
close(sk);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return sk;
|
||||
}
|
||||
|
||||
void baswap(bdaddr_t *dst, const bdaddr_t *src)
|
||||
{
|
||||
register unsigned char *d = (unsigned char *) dst;
|
||||
register const unsigned char *s = (const unsigned char *) src;
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
d[i] = s[5-i];
|
||||
}
|
||||
|
||||
int bachk(const char *str)
|
||||
{
|
||||
if (!str)
|
||||
return -1;
|
||||
|
||||
if (strlen(str) != 17)
|
||||
return -1;
|
||||
|
||||
while (*str) {
|
||||
if (!isxdigit(*str++))
|
||||
return -1;
|
||||
|
||||
if (!isxdigit(*str++))
|
||||
return -1;
|
||||
|
||||
if (*str == 0)
|
||||
break;
|
||||
|
||||
if (*str++ != ':')
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int str2ba(const char *str, bdaddr_t *ba)
|
||||
{
|
||||
bdaddr_t b;
|
||||
int i;
|
||||
|
||||
if (bachk(str) < 0) {
|
||||
memset(ba, 0, sizeof(*ba));
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < 6; i++, str += 3)
|
||||
b.b[i] = strtol(str, NULL, 16);
|
||||
|
||||
baswap(ba, &b);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
gboolean handle_mw_io(GIOChannel *mw_io, GIOCondition condition, gpointer udata)
|
||||
{
|
||||
mwdata_t *mdata = (mwdata_t *)udata;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue