]> git.karo-electronics.de Git - rdstmc.git/blob - decoder/uberradio.c
Add radio tuning test app
[rdstmc.git] / decoder / uberradio.c
1 /*
2  * Copyright (C) 2009, 2010 by Nils Faerber <nils.faerber@kernelconcepts.de>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version
7  * 2 of the License, or (at your option) any later version.
8  *
9  */
10
11 #include <stdio.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #include <time.h>
15 #include <unistd.h>
16 #include <sys/stat.h>
17 #include <fcntl.h>
18
19 #include <gtk/gtk.h>
20
21 #include <sqlite3.h>
22
23 #include "rds.h"
24 #include "tmc.h"
25
26 sqlite3 *lcl_db;
27 int OutputFlags;
28
29 typedef struct {
30         int radio_fd;
31         guint r_input_id;
32         GtkBuilder *builder;
33         GtkWidget *MainWin;
34         GtkWidget *RDS_TP_Label;
35         GtkWidget *RDS_TA_Label;
36         GtkWidget *RDS_M_Label;
37         GtkWidget *RDS_S_Label;
38         GtkWidget *RDS_SID_Label;
39         GtkWidget *RDS_RT_Label;
40         GtkWidget *RDS_PTY_Label;
41         GtkWidget *RDS_Date_Time_Label;
42         GtkWidget *RDS_PI_Label;
43         GtkWidget *RDS_PType_Label;
44         GtkWidget *TMC_View;
45         GtkTextBuffer *TMC_MSG_Buffer;
46 } uberradio_ui;
47
48
49 int open_radio(const char *name)
50 {
51 int fd;
52
53         fd = open(name, O_RDONLY | O_NONBLOCK);
54         if (fd > 0)
55                 return fd;
56         else
57                 return 0;
58 }
59
60
61 void handle_r_input(gpointer user_data, gint source, GdkInputCondition condition)
62 {
63 uberradio_ui *rui = (uberradio_ui *)user_data;
64 static unsigned short rdsgroup[4];
65
66         if (rds_receive_group(rui->radio_fd, rdsgroup)) {
67                 rds_decode_group(rdsgroup);
68         }
69 }
70
71 void rds_sname_cb(char *sname, void *user_data)
72 {
73 uberradio_ui *rui = (uberradio_ui *)user_data;
74 static char pbuf[128];
75
76         snprintf(pbuf, 128, "<tt>%s</tt>", sname);
77         gtk_label_set_markup(GTK_LABEL(rui->RDS_SID_Label), pbuf);
78 }
79
80
81 void rds_radiotext_cb(char *rtext, void *user_data)
82 {
83 uberradio_ui *rui = (uberradio_ui *)user_data;
84 static char pbuf[128];
85
86         snprintf(pbuf, 128, "<tt>%s</tt>", rtext);
87         gtk_label_set_markup(GTK_LABEL(rui->RDS_RT_Label), pbuf);
88 }
89
90 void rds_sinfo_cb(unsigned char TP, unsigned char TA, unsigned char MS, unsigned char PTY, void *user_data)
91 {
92 uberradio_ui *rui = (uberradio_ui *)user_data;
93
94         if (TP) {
95                 gtk_widget_set_sensitive(rui->RDS_TP_Label, TRUE);
96         } else {
97                 gtk_widget_set_sensitive(rui->RDS_TP_Label, FALSE);
98         }
99         if (TA) {
100                 gtk_widget_set_sensitive(rui->RDS_TA_Label, TRUE);
101         } else {
102                 gtk_widget_set_sensitive(rui->RDS_TA_Label, FALSE);
103         }
104         if (MS) {
105                 gtk_widget_set_sensitive(rui->RDS_M_Label, TRUE);
106                 gtk_widget_set_sensitive(rui->RDS_S_Label, FALSE);
107         } else {
108                 gtk_widget_set_sensitive(rui->RDS_M_Label, FALSE);
109                 gtk_widget_set_sensitive(rui->RDS_S_Label, TRUE);
110         }
111         gtk_label_set_text(GTK_LABEL(rui->RDS_PTY_Label), PTY_text[PTY]);
112 }
113
114 void rds_date_time_cb(struct tm *rds_time, void *user_data)
115 {
116 uberradio_ui *rui = (uberradio_ui *)user_data;
117 char pbuf[128];
118 char pbuf2[128];
119 gchar *pstr;
120 GDate mgdate;
121
122         mgdate.julian = 0;
123         mgdate.dmy = 1;
124         mgdate.day = rds_time->tm_mday;
125         mgdate.month = rds_time->tm_mon + 1;
126         mgdate.year = rds_time->tm_year + 1900;
127         g_date_strftime(pbuf, 128, "%A %d. %B %Y ", &mgdate);
128         strftime(pbuf2, 128, "%R", rds_time);
129         pstr = g_strconcat(pbuf, pbuf2, NULL);
130         gtk_label_set_markup(GTK_LABEL(rui->RDS_Date_Time_Label), pstr);
131         g_free(pstr);
132 }
133
134 void rds_PI_cb(unsigned short PI, unsigned char ccode, unsigned char ptype, unsigned char pref, void *user_data)
135 {
136 uberradio_ui *rui = (uberradio_ui *)user_data;
137 char pbuf[128];
138
139         // we get this callback if PI changed which also means that
140         // the station changed, which again mean that allprevious
141         // information in the display is invalid now
142
143         gtk_widget_set_sensitive(rui->RDS_TP_Label, FALSE);
144         gtk_widget_set_sensitive(rui->RDS_TA_Label, FALSE);
145         gtk_widget_set_sensitive(rui->RDS_M_Label, FALSE);
146         gtk_widget_set_sensitive(rui->RDS_S_Label, FALSE);
147         gtk_label_set_markup(GTK_LABEL(rui->RDS_RT_Label), "");
148         gtk_label_set_text(GTK_LABEL(rui->RDS_PTY_Label), "");
149         gtk_label_set_markup(GTK_LABEL(rui->RDS_SID_Label), "");
150         gtk_text_buffer_set_text(rui->TMC_MSG_Buffer, "", -1);
151
152         snprintf(pbuf, 128, "<b>PI</b> %d", PI);
153         gtk_label_set_markup(GTK_LABEL(rui->RDS_PI_Label), pbuf);
154         gtk_label_set_markup(GTK_LABEL(rui->RDS_PType_Label), ptype_ltext[ptype]);
155 }
156
157 void tmc_msg_cb(char *msg, void *user_data)
158 {
159 uberradio_ui *rui = (uberradio_ui *)user_data;
160
161         gtk_text_buffer_set_text(rui->TMC_MSG_Buffer, msg, -1);
162 }
163
164 int main(int argc, char **argv)
165 {
166 GtkWidget *w;
167 uberradio_ui rui;
168
169         gtk_init (&argc, &argv);
170
171         rui.builder = gtk_builder_new();
172         if (!gtk_builder_add_from_file(rui.builder, "uberradio.ui", NULL)) {
173                 fprintf(stderr, "Error creating GtkBuilder\n");
174                 return 0;
175         }
176         gtk_builder_connect_signals(rui.builder, NULL);
177
178         rui.RDS_TP_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_TP_Label"));
179         gtk_widget_set_sensitive(rui.RDS_TP_Label, FALSE);
180         rui.RDS_TA_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_TA_Label"));
181         gtk_widget_set_sensitive(rui.RDS_TA_Label, FALSE);
182         rui.RDS_M_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_M_Label"));
183         gtk_widget_set_sensitive(rui.RDS_M_Label, FALSE);
184         rui.RDS_S_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_S_Label"));
185         gtk_widget_set_sensitive(rui.RDS_S_Label, FALSE);
186         rui.RDS_SID_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_SID_Label"));
187         rui.RDS_RT_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_RT_Label"));
188         rui.RDS_PTY_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_PTY_Label"));
189         rui.RDS_Date_Time_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_Date_Time_Label"));
190         rui.RDS_PI_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_PI_Label"));
191         rui.RDS_PType_Label = GTK_WIDGET(gtk_builder_get_object(rui.builder, "RDS_PType_Label"));
192
193         rui.TMC_View = GTK_WIDGET(gtk_builder_get_object(rui.builder, "TMC_View"));
194         rui.TMC_MSG_Buffer = GTK_TEXT_BUFFER(gtk_builder_get_object(rui.builder, "TMC_MSG_Buffer"));
195
196         rui.MainWin = GTK_WIDGET(gtk_builder_get_object(rui.builder, "MainWin"));
197
198         gtk_widget_show_all(rui.MainWin);
199
200         if (!(rui.radio_fd = open_radio("/dev/radio0"))) {
201                 perror("open radio:");
202                 return -1;
203         }
204
205         if (sqlite3_open("lcl.db", &lcl_db) != SQLITE_OK) {
206                 perror("open lcl.db");
207                 close(rui.radio_fd);
208                 return -1;
209         }
210
211         rds_init();
212         tmc_init();
213
214         rui.r_input_id = gdk_input_add (rui.radio_fd, GDK_INPUT_READ, handle_r_input, &rui);
215
216         rds_set_sname_cb(rds_sname_cb, &rui);
217         rds_set_radiotext_cb(rds_radiotext_cb, &rui);
218         rds_set_date_time_cb(rds_date_time_cb, &rui);
219         rds_set_sinfo_cb(rds_sinfo_cb, &rui);
220         rds_set_PI_cb(rds_PI_cb, &rui);
221
222         tmc_set_msg_cb(tmc_msg_cb, &rui);
223
224         gtk_main();
225
226 return 0;
227 }