13
#include <sys/socket.h>
14
#include <bluetooth/bluetooth.h>
15
#include <bluetooth/rfcomm.h>
16
#endif /* HAVE_BLUEZ */
18
#include "hrm_functions.h"
22
#define MAX_HEART_FREQ 160
24
static GIOChannel *hrm_io_channel = NULL;
26
static guint hrm_sid1, hrm_sid3;
29
void * get_hrm_data_thread(void *ptr);
38
global_reconnect_hrm = TRUE;
39
g_source_remove(watchdog);
41
g_source_remove(hrm_sid1);
42
g_source_remove(hrm_sid3);
45
#endif /* HAVE_BLUEZ */
51
osd_hrm(gboolean force_redraw)
54
PangoContext *context = NULL;
55
PangoLayout *layout = NULL;
56
PangoFontDescription *desc = NULL;
62
static int x = 10, y = 310;
63
static int width = 0, height = 0;
65
static int hrm_tmp = 0;
72
if(mouse_dx == 0 && mouse_dy == 0)
75
buffer = g_strdup_printf("%u", hrmdata->freq);
77
buffer = g_strdup_printf("--");
80
context = gtk_widget_get_pango_context (map_drawable);
81
layout = pango_layout_new (context);
82
desc = pango_font_description_new();
84
pango_font_description_set_absolute_size (desc, 50 * PANGO_SCALE);
85
pango_layout_set_font_description (layout, desc);
86
pango_layout_set_text (layout, buffer, strlen(buffer));
89
gc = gdk_gc_new (map_drawable->window);
92
color.red = (hrmdata->freq > MAX_HEART_FREQ) ? 0xffff : 0;
98
gdk_gc_set_rgb_fg_color (gc, &color);
105
if(hrm_tmp != hrm || force_redraw)
109
map_drawable->window,
110
map_drawable->style->fg_gc[GTK_WIDGET_STATE (map_drawable)],
118
gdk_draw_layout(map_drawable->window,
124
pango_layout_get_pixel_size(layout, &width, &height);
130
pango_font_description_free (desc);
131
g_object_unref (layout);
134
#endif /* HAVE_BLUEZ */
141
static GtkWidget *widget1=NULL, *widget2=NULL;
142
static gchar buffer[128];
145
widget1 = lookup_widget(window1, "label206");
146
widget2 = lookup_widget(window1, "label207");
149
g_snprintf (buffer, 128, _("<b><big>%d</big></b> <small>bpm</small>"),
151
gtk_label_set_label(GTK_LABEL(widget1), buffer);
153
g_snprintf (buffer, 128, _("<b><big>%d/%d</big></b>"),
154
hrmdata->min, hrmdata->max);
155
gtk_label_set_label(GTK_LABEL(widget2), buffer);
156
#endif /* HAVE_BLUEZ */
161
cb_hrm_io_error(GIOChannel *src, GIOCondition condition, gpointer data)
166
g_source_remove(hrm_sid1);
167
g_source_remove(hrm_sid3);
168
#endif /* HAVE_BLUEZ */
175
cb_hrm_data(GIOChannel *src, GIOCondition condition, gpointer data)
178
static int hrm_status = 0;
181
GError *error = NULL;
185
status = g_io_channel_read_chars(
187
(char *) buf, sizeof(buf),
188
&bytes_read, &error);
190
if(status == G_IO_STATUS_NORMAL)
196
if((bytes_read == 60) && (buf[0] == 2))
197
hrmdata->freq = buf[12];
199
if((bytes_read == 1) && (buf[0] == 2))
204
hrmdata->freq = buf[11];
210
g_source_remove(watchdog);
211
watchdog = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT_IDLE,60,reset_hrm_io,NULL,NULL);
216
printf("gio: %s \n", error->message);
221
if(hrmdata->freq < hrmdata->min && hrmdata->freq > 50)
222
hrmdata->min = hrmdata->freq;
223
if(hrmdata->freq > hrmdata->max && hrmdata->freq < 220)
224
hrmdata->max = hrmdata->freq;
225
#endif /* HAVE_BLUEZ */
236
#if GLIB_CHECK_VERSION(2,34,0)
237
g_thread_new("get hrm thread", &get_hrm_data_thread, (gpointer) NULL);
239
g_thread_create(&get_hrm_data_thread, NULL, FALSE, NULL);
241
#endif /* HAVE_BLUEZ */
245
get_hrm_data_thread(void *ptr)
248
static int hrm_sock = 0;
249
struct sockaddr_rc addr = {0};
251
unsigned char buf[501];
253
GError *error = NULL;
258
if(!global_hrm_bt_addr)
261
if(!hrmdata || global_reconnect_hrm)
266
if (hrm_sock) hrm_sock = close(hrm_sock);
268
hrm_sock = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
270
printf("error opening hrm socket\n");
274
str2ba(global_hrm_bt_addr, &addr.rc_bdaddr);
276
addr.rc_family = AF_BLUETOOTH;
279
conn = connect(hrm_sock, (struct sockaddr *)&addr, sizeof(addr));
281
printf("error connecting %s\n", global_hrm_bt_addr);
284
shutdown(hrm_sock, SHUT_RDWR);
287
global_reconnect_hrm = FALSE;
290
hrmdata = g_new0(hrm_data_t,1);
294
len = read(hrm_sock, buf, 500);
296
fprintf(stderr, "HRM Rcvd %i bytes", len);
299
watchdog = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT_IDLE,60,reset_hrm_io,NULL,NULL);
301
hrm_io_channel = g_io_channel_unix_new(hrm_sock);
302
g_io_channel_set_encoding(hrm_io_channel, NULL, &error);
303
g_io_channel_set_flags(hrm_io_channel, G_IO_FLAG_NONBLOCK, NULL);
305
hrm_sid1 = g_io_add_watch_full(hrm_io_channel, G_PRIORITY_HIGH_IDLE+200, G_IO_ERR | G_IO_HUP, cb_hrm_io_error, NULL, NULL);
306
hrm_sid3 = g_io_add_watch_full(hrm_io_channel, G_PRIORITY_HIGH_IDLE+200, G_IO_IN | G_IO_PRI, cb_hrm_data, NULL, NULL);
310
#endif /* HAVE_BLUEZ */