#!/bin/ksh # # KSH script using the GTK-server to tune a radiocard. # Tested with XForms on Linux Slackware 10.x # # *** Does NOT work with GTK, use the XForms backend !!! *** # # This is version 3 of my radiocard tuner GUI. I am actually # using this script to tune my ISA Aztech/Packardbell radiocard # in my 2nd computer! # # -3.0: added extra functionality # -3.1: fixed bug with changing/muting volume (25/02/2004) # -3.2: -no rc file is needed to set color (22/11/2005) # -spaces can be used in preset names (22/11/2005) # -overall code improvements (22/11/2005) # -about box changed message (23/11/2005) # -show icon in window (24/11/2005) # -3.2b:-version for XForms backend (31/8/2006) # -3.3: -new preset functionality (1/9/2006) # -works with PDKSH now (9/9/2006) # -3.4: -changed to embedded GTK (7/10/2006) # -3.5: -fixed code, compatible with GTK version of radio (12/8/2008) # -fixed bug with slider (12/8/2008) # -can run with static GTK-server compiled with XForms (12/8/2008) # # Additional software: # -fmtools for tuning (http://www.exploits.org/v4l/fmtools/ # or http://www.stanford.edu/~blp/fmtools/) # -AWK (floating point rounding) # -optional: rexima or aumix for volume adjustment # # January 22, 2004 by Peter van Eerten # Changed for GTK-server 1.2 at October 10, 2004 # Changed for GTK-server 1.3 at December 6, 2004 # # This version must use the GTK-server 2.2.1 or higher # compiled for XForms. # ################################################################# # Create embedded GTK functions if [[ ! -f /etc/gtk-server.cfg ]] then print "No GTK-server configfile found! Please install GTK-server..." exit 1 elif [[ ! -f $HOME/.gtk4korn || /etc/gtk-server.cfg -nt $HOME/.gtk4korn ]] then print "# Embedded GTK functions for KornShell" > $HOME/.gtk4korn while read LINE do if [[ $LINE == +(*FUNCTION_NAME*) ]] then TMP=${LINE#*= } print "function ${TMP%%,*}" >> $HOME/.gtk4korn print "{\nprint -p ${TMP%%,*} \$@" >> $HOME/.gtk4korn print "read -p GTK\n}" >> $HOME/.gtk4korn fi done < /etc/gtk-server.cfg fi NULL="NULL" # Include embedded GTK for KornShell . $HOME/.gtk4korn # Some constants for better readability FL_UP_BOX=1 FL_NORMAL_BUTTON=0 FL_PUSH_BUTTON=1 FL_PLACE_CENTER=2 FL_FULLBORDER=1 FL_TRANSIENT=2 FL_HOR_NICE_SLIDER=5 FL_ENGRAVED_FRAME=5 FL_SMALL_SIZE=10 FL_NORMAL_SIZE=12 FL_NORMAL_TEXT=0 FL_NORMAL_INPUT=0 FL_RED=1 FL_GREEN=2 FL_RADIO_BUTTON=2 FL_NORMAL_CHOICE=0 FL_HOLD_BROWSER=2 ############################################# function Check_Software { # Check on availability of AWK AWK=`which awk 2>/dev/null` if [[ -z $AWK ]] then echo "Awk not found on your system! Exiting..." exit 1 fi # Check on availability of REXIMA or AUMIX MIXER=`which rexima 2>/dev/null` if [[ -z $MIXER ]] then MIXER=`which aumix 2>/dev/null` if [[ -z $MIXER ]] then echo "No mixer found! The volume will be set on your radiocard." fi fi # Check on availability of fmtools FM=`which fm 2>/dev/null` if [[ -z $FM ]] then echo "The fmtools were not found on your system!" echo "Please download the latest version from: www.stanford.edu/~blp/fmtools/" exit 1 fi # Go back return } ############################################# function Build_Gui { # Main window fl_bgn_form $FL_UP_BOX 350 230 WINDOW=$GTK # Buttons fl_add_button $FL_NORMAL_BUTTON 10 190 60 30 "Mute" MUTE_BUTTON=$GTK fl_add_button $FL_NORMAL_BUTTON 80 190 60 30 "About" ABOUT_BUTTON=$GTK fl_add_button $FL_NORMAL_BUTTON 280 190 60 30 "Exit" EXIT_BUTTON=$GTK # Frequency scale fl_add_labelframe $FL_ENGRAVED_FRAME 10 15 190 60 "'Tune Radio Card'" FREQ_FRAME=$GTK fl_set_object_lsize $FREQ_FRAME $FL_NORMAL_SIZE fl_add_valslider $FL_HOR_NICE_SLIDER 15 35 180 30 "''" FREQSCALE=$GTK fl_set_slider_precision $FREQSCALE 1 fl_set_slider_bounds $FREQSCALE 87.5 108.0 fl_set_slider_step $FREQSCALE 0.1 fl_set_object_lsize $FREQSCALE $FL_SMALL_SIZE # Volume scale fl_add_labelframe $FL_ENGRAVED_FRAME 210 15 130 60 "Volume" VOL_FRAME=$GTK fl_set_object_lsize $VOL_FRAME $FL_NORMAL_SIZE fl_add_valslider $FL_HOR_NICE_SLIDER 215 35 120 30 "''" VOLSCALE=$GTK fl_set_slider_precision $VOLSCALE 0 fl_set_slider_bounds $VOLSCALE 0 100 fl_set_slider_step $VOLSCALE 1 fl_set_object_lsize $VOLSCALE $FL_SMALL_SIZE # Configure part fl_add_labelframe $FL_ENGRAVED_FRAME 10 90 160 90 "Configure" CONFIG_FRAME=$GTK fl_set_object_lsize $CONFIG_FRAME $FL_NORMAL_SIZE fl_add_input $FL_NORMAL_INPUT 15 140 100 30 "''" ENTRY=$GTK fl_set_object_lsize $ENTRY $FL_NORMAL_SIZE fl_add_button $FL_NORMAL_BUTTON 120 140 45 30 "Add" ADD_BUTTON=$GTK fl_add_text $FL_NORMAL_TEXT 15 120 100 20 "Presetname" fl_add_button $FL_NORMAL_BUTTON 120 105 45 30 "Del" DEL_BUTTON=$GTK # Presets part fl_add_labelframe $FL_ENGRAVED_FRAME 180 90 160 90 "Presets" PRESET_FRAME=$GTK fl_set_object_lsize $PRESET_FRAME $FL_NORMAL_SIZE fl_add_browser $FL_HOLD_BROWSER 190 100 140 70 "''" CHOICE=$GTK if [[ -f $HOME/.kshradio ]] then NR=1 while read LINE do FREQ[$NR]=`echo $LINE | $AWK '/channel/ {print $2}'` CHAN[$NR]=`echo $LINE | $AWK '/channel/ {for (a=3; a <= NF; a++) printf $a " ";}'` if [[ ${CHAN[$NR]} != "" ]] then fl_addto_browser $CHOICE "'${CHAN[$NR]}'" ((NR+=1)) fi done < $HOME/.kshradio UBOUND=$NR fi fl_end_form fl_show_form $WINDOW $FL_PLACE_CENTER $FL_FULLBORDER "'KSH Radio Tuner'" fl_set_focus_object $WINDOW $ENTRY return } ############################################## function Set_Volume { # $1 contains the mixer, $2 contains the volume, $3 contains frequency case $1 in `which rexima 2>/dev/null`) $1 line $2;; `which aumix 2>/dev/null`) $1 -l $2;; *) fm $3 $2*655;; esac } ############################################## # Initialize environment export LC_ALL=nl_NL export LD_LIBRARY_PATH=/usr/X11R6/lib # Start GTK-server ./gtk-server -stdin |& # Save my directory MYDIR=${0%/*} # Check available packages on system Check_Software # Read saved settings if available if [[ -f $HOME/.kshradio ]] then while read LINE do if [[ $LINE == +(*volume*) ]]; then VOLUME=${LINE#* }; fi if [[ $LINE == +(*frequency*) ]]; then CURFREQ=${LINE#* }; fi done < $HOME/.kshradio else VOLUME=70 CURFREQ=87.5 fi # Redefine the fl_get_slider_value call, erronous in configfile gtk_server_redefine "fl_get_slider_value NONE DOUBLE 1 WIDGET" # Create user interface Build_Gui # Adjust widgets accordingly fl_set_slider_value $VOLSCALE $VOLUME fl_set_slider_value $FREQSCALE $CURFREQ NR=1 while [[ $NR -le $UBOUND ]] do if [[ $CURFREQ = ${FREQ[$NR]} ]] then fl_select_browser_line $CHOICE $NR break else ((NR+=1)) fi done # Set the volume and frequency Set_Volume $MIXER $VOLUME $CURFREQ fm $CURFREQ 65535 > /dev/null # Initialize EVENT=0 MUTE=1 MODE=0 # This is the mainloop while [[ $EVENT -ne $EXIT_BUTTON && $EVENT != "" ]] do # Walk through all GTK events gtk_server_callback "wait" EVENT=$GTK case $GTK in # Mute/unmute the radiocard $MUTE_BUTTON) let MUTE=1-$MUTE if [[ $MUTE -eq 0 ]] then fm off > /dev/null fl_set_object_label $MUTE_BUTTON "Unmute" else fm $CURFREQ 65535 > /dev/null fl_set_object_label $MUTE_BUTTON "Mute" fi;; # Set the volume $VOLSCALE) fl_get_slider_value $VOLSCALE VOLUME=${GTK%.*} # Set the volume Set_Volume $MIXER $VOLUME $CURFREQ # Slider changed, put radio on if it was muted fm $CURFREQ 65535 > /dev/null # Radio not muted anymore MUTE=1 fl_set_object_label $MUTE_BUTTON "Mute";; # Set the radiofrequency $FREQSCALE) fl_get_slider_value $FREQSCALE CURFREQ=$GTK fm $CURFREQ 65535 > /dev/null;; # Check the ABOUT button $ABOUT_BUTTON) gtk_server_version fl_show_message "'*** KSH Radio Controller ***\n'" "'Programmed with KSH and GTK-server $GTK.\n'" "'Visit http://www.gtk-server.org/ for more info!'";; # Set preset channel $ADD_BUTTON) fl_get_input $ENTRY if [[ $GTK != "" ]] then CHAN[$UBOUND]=$GTK fl_addto_browser $CHOICE "'$GTK'" FREQ[$UBOUND]=$CURFREQ ((UBOUND+=1)) fl_set_input $ENTRY "" fi;; # Delete preset $DEL_BUTTON) fl_get_browser $CHOICE NR=$GTK if [[ $UBOUND -gt 1 ]] then fl_delete_browser_line $CHOICE $NR while [[ $NR -lt $UBOUND ]] do CHAN[$NR]=${CHAN[$NR+1]} FREQ[$NR]=${FREQ[$NR+1]} ((NR+=1)) done ((UBOUND-=1)) fi;; # See if selection was clicked $CHOICE) fl_get_browser $CHOICE NR=1 while [[ $NR -le $UBOUND ]] do if [[ $GTK = $NR ]] then fm ${FREQ[$NR]} 65535 > /dev/null fl_set_slider_value $FREQSCALE ${FREQ[$NR]} CURFREQ=${FREQ[$NR]} break else ((NR+=1)) fi done;; esac done # Remember last volume print "volume" $VOLUME> $HOME/.kshradio # Remember last frequency print "frequency" $CURFREQ>> $HOME/.kshradio # Remember preset channels NR=1 while [[ $NR -lt $UBOUND ]] do print "channel" ${FREQ[$NR]} ${CHAN[$NR]}>> $HOME/.kshradio ((NR+=1)) done # Mute radio at exit fm off > /dev/null # Exit GTK-server gtk_server_exit # End exit 0