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