/****************************************************************************** radio.c *******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*============================================================================ =============================================================================*/ static char RsDevice[40] = "/dev/cua2"; /* modem device */ static struct termios Pmode; /* modem device control string */ static int Mfd; /* device id */ static int Freq; /* now frequency */ static int PreSet[5] = { 32, /* kiss FM 77.6 MHz */ 84, /* FM 802 80.2 MHz */ 182, /* FM osaka 85.1 MHz */ 210, /* NHK kobe 86.5 MHz */ 278, /* kiss FM 89.9 MHz */ }; /* preset frequency */ static int PwrSw; /* 0 = off, 1 = on */ static Widget TopLevel, Base; static Widget FreqLabel, Stereo; static Widget PrstBtn1, PrstBtn2, PrstBtn3, PrstBtn4, PrstBtn5; static Widget QuitBtn, PwrBtn, DwnBtn, UpBtn, DwnScnBtn, UpScnBtn; /*============================================================================ =============================================================================*/ void main(int argc, char *argv[]); void tic_sec(XtPointer client_data, XtIntervalId *tid); void preset1(Widget prst, XtPointer c_data, XtPointer data); void preset2(Widget prst, XtPointer c_data, XtPointer data); void preset3(Widget prst, XtPointer c_data, XtPointer data); void preset4(Widget prst, XtPointer c_data, XtPointer data); void preset5(Widget prst, XtPointer c_data, XtPointer data); void display_freq(int freq); void detect_stereo(void); void rsidle(char *status); void quit(Widget quit, XtPointer c_data, XtPointer data); void power(Widget pwr, XtPointer c_data, XtPointer data); void freq_down(Widget frq, XtPointer c_data, XtPointer data); void freq_up(Widget frq, XtPointer c_data, XtPointer data); void freq_down_scan(Widget frq, XtPointer c_data, XtPointer data); void freq_up_scan(Widget frq, XtPointer c_data, XtPointer data); void power_on(void); void power_off(void); void set_tune(int freq); void mopen(void); void sendbyte(int ch); void sendstring(char *s); int readbyte(void); /*============================================================================ =============================================================================*/ void main(int argc, char *argv[]) { mopen(); signal(SIGTERM, (void (*)(int))quit); XtSetLanguageProc(NULL, NULL, NULL); TopLevel = XtInitialize(argv[0], "Radio", NULL, 0, &argc, argv); Base = XtCreateManagedWidget("base", formWidgetClass, TopLevel, NULL, 0); FreqLabel = XtVaCreateManagedWidget("freqlabel", labelWidgetClass, Base, XtNlabel, "", NULL); Stereo = XtVaCreateManagedWidget("stereo", labelWidgetClass, Base, XtNfromHoriz, FreqLabel, XtNlabel, " ", NULL); PrstBtn1 = XtVaCreateManagedWidget("prst1", commandWidgetClass, Base, XtNfromVert, FreqLabel, NULL); XtAddCallback(PrstBtn1, XtNcallback, (XtCallbackProc)preset1, NULL); PrstBtn2 = XtVaCreateManagedWidget("prst2", commandWidgetClass, Base, XtNfromVert, FreqLabel, XtNfromHoriz, PrstBtn1, NULL); XtAddCallback(PrstBtn2, XtNcallback, (XtCallbackProc)preset2, NULL); PrstBtn3 = XtVaCreateManagedWidget("prst3", commandWidgetClass, Base, XtNfromVert, FreqLabel, XtNfromHoriz, PrstBtn2, NULL); XtAddCallback(PrstBtn3, XtNcallback, (XtCallbackProc)preset3, NULL); PrstBtn4 = XtVaCreateManagedWidget("prst4", commandWidgetClass, Base, XtNfromVert, FreqLabel, XtNfromHoriz, PrstBtn3, NULL); XtAddCallback(PrstBtn4, XtNcallback, (XtCallbackProc)preset4, NULL); PrstBtn5 = XtVaCreateManagedWidget("prst5", commandWidgetClass, Base, XtNfromVert, FreqLabel, XtNfromHoriz, PrstBtn4, NULL); XtAddCallback(PrstBtn5, XtNcallback, (XtCallbackProc)preset5, NULL); QuitBtn = XtVaCreateManagedWidget("quit", commandWidgetClass, Base, XtNfromVert, PrstBtn1, NULL); XtAddCallback(QuitBtn, XtNcallback, (XtCallbackProc)quit, NULL); PwrBtn = XtVaCreateManagedWidget("power", commandWidgetClass, Base, XtNfromVert, PrstBtn1, XtNfromHoriz, QuitBtn, NULL); XtAddCallback(PwrBtn, XtNcallback, (XtCallbackProc)power, NULL); DwnBtn = XtVaCreateManagedWidget("down", commandWidgetClass, Base, XtNfromVert, PrstBtn1, XtNfromHoriz, PwrBtn, NULL); XtAddCallback(DwnBtn, XtNcallback, (XtCallbackProc)freq_down, NULL); UpBtn = XtVaCreateManagedWidget("up", commandWidgetClass, Base, XtNfromVert, PrstBtn1, XtNfromHoriz, DwnBtn, NULL); XtAddCallback(UpBtn, XtNcallback, (XtCallbackProc)freq_up, NULL); DwnScnBtn = XtVaCreateManagedWidget("downscan", commandWidgetClass, Base, XtNfromVert, PrstBtn1, XtNfromHoriz, UpBtn, NULL); XtAddCallback(DwnScnBtn, XtNcallback, (XtCallbackProc)freq_down_scan, NULL); UpScnBtn = XtVaCreateManagedWidget("upscan", commandWidgetClass, Base, XtNfromVert, PrstBtn1, XtNfromHoriz, DwnScnBtn, NULL); XtAddCallback(UpScnBtn, XtNcallback, (XtCallbackProc)freq_up_scan, NULL); XtRealizeWidget(TopLevel); tic_sec(TopLevel, NULL); XtMainLoop(); } void tic_sec(XtPointer client_data, XtIntervalId *tid) { detect_stereo(); XtAppAddTimeOut(XtWidgetToApplicationContext((Widget) (client_data)), 1000, tic_sec, client_data); } void detect_stereo(void) { char buf[40]; if(PwrSw == 0) return; rsidle(buf); XtVaSetValues(Stereo, XtNlabel, buf, NULL); } void display_freq(int freq) { static char *zen[] = {"£°","£±","£²","£³","£´","£µ","£¶","£·","£¸","£¹",}; int f; char buf[20]; /* freq = 0 - 300 */ f = freq * 5 + 7600; sprintf (buf, "%s%s.%s%s", zen[f / 1000], zen[(f / 100) % 10], zen[(f /10) % 10], zen[f % 10]); XtVaSetValues(FreqLabel, XtNlabel, buf, NULL); } void preset1(Widget prst, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); Freq = PreSet[0]; if(PwrSw){ set_tune(Freq); display_freq(Freq); } } void preset2(Widget prst, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); Freq = PreSet[1]; if(PwrSw){ set_tune(Freq); display_freq(Freq); } } void preset3(Widget prst, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); Freq = PreSet[2]; if(PwrSw){ set_tune(Freq); display_freq(Freq); } } void preset4(Widget prst, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); Freq = PreSet[3]; if(PwrSw){ set_tune(Freq); display_freq(Freq); } } void preset5(Widget prst, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); Freq = PreSet[4]; if(PwrSw){ set_tune(Freq); display_freq(Freq); } } void quit(Widget quit, XtPointer c_data, XtPointer data) { if(PwrSw){ power_off(); } close(Mfd); exit(0); } void power(Widget pwr, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); if(PwrSw){ /* power off */ power_off(); XtVaSetValues(FreqLabel, XtNlabel, "", NULL); XtVaSetValues(Stereo, XtNlabel, "", NULL); }else{ power_on(); set_tune(Freq); display_freq(Freq); } PwrSw ^= 1; tcflush( Mfd, TCIFLUSH ); } void freq_down(Widget frq, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); if(PwrSw){ Freq--; if(Freq < 0) Freq = 300; set_tune(Freq); display_freq(Freq); } } void freq_up(Widget frq, XtPointer c_data, XtPointer data) { tcflush( Mfd, TCIFLUSH ); if(PwrSw){ Freq++; if(Freq > 300) Freq = 0; set_tune(Freq); display_freq(Freq); } } void freq_down_scan(Widget frq, XtPointer c_data, XtPointer data) { } void freq_up_scan(Widget frq, XtPointer c_data, XtPointer data) { } /*============================================================================ =============================================================================*/ void power_on(void) { sendstring("\x1d\x23\x01\x23"); } void power_off(void) { sendstring("\x1d\x23\x02\x23"); } void set_tune(int freq) { char buf[40]; sprintf(buf, "\x1d\x23\x05\x23%03d", freq); sendstring(buf); } void rsidle(char *status) { int c, i; tcflush( Mfd, TCIFLUSH ); sendstring("\x1d\x23\x08\x23"); status[0] = 0; for(i = 0; i < 4; i++){ while((c = readbyte()) == -1); if(i == 2 && c == 4) strcpy(status, "Stereo"); } } void mopen(void) { if ((Mfd = open(RsDevice, O_RDWR | O_NDELAY)) < 0){ printf("Can't open %s\n", RsDevice); exit(1); } Pmode.c_cflag &= ~CBAUD; Pmode.c_cflag |= B9600; Pmode.c_cflag &= ~(CSIZE | PARENB | CSTOPB); Pmode.c_cflag |= CS8; Pmode.c_cflag |= CRTSCTS; Pmode.c_iflag &= ~(IXON | IXOFF | IXANY); tcsetattr( Mfd, TCSANOW, &Pmode); tcflush( Mfd, TCIFLUSH ); } void sendbyte(int ch) { char c; c = (ch & 0xff); if(write(Mfd, &c, 1)<0) printf("sendbyte: write error!"); } void sendstring(char *s) { while(*s){ sendbyte(*s++); } } int readbyte(void) { char c; if(read(Mfd, &c, 1) < 1) return(-1); return(c & 0xff); } /**** End of radio.c **********************************************************/