DOWN_SWITCH = 18 MENU_SWITCH = 25 # To use GPIO 14 and 15 (Serial RX/TX) # Remove references to /dev/ttyAMA0 from /boot/cmdline.txt and /etc/inittab UP = 0 DOWN = 1 CurrentStationFile = "/var/lib/radiod/current_station" CurrentTrackFile = "/var/lib/radiod/current_track" CurrentFile = CurrentStationFile log = Log() radio = Radio() lcd = lcd_i2c() rss = Rss() # Signal SIGTERM handler def signalHandler(signal,frame): global lcd global log radio.execCommand("umount /media > /dev/null 2>&1") radio.execCommand("umount /share > /dev/null 2>&1") pid = os.getpid() log.message("Radio stopped, PID " + str(pid), log.INFO) lcd.line1("Radio stopped") lcd.line2("") lcd.line3("") lcd.line4("") GPIO.cleanup()
from lcd_i2c_class import lcd_i2c from lcd_i2c_pcf8574 import lcd_i2c_pcf8574 from time import sleep def no_interrupt(): return False if __name__ == '__main__': i2c_address = 0x00 print "I2C LCD test program" print "1 = Adafruit I2C backpack" print "2 = PCF8574 I2C backpack" response = raw_input("Select type of backpack: ") if int(response) is 1: lcd = lcd_i2c() i2c_address = 0x20 elif int(response) is 2: lcd = lcd_i2c_pcf8574() i2c_address = 0x27 else: print "Invalid selection!" sys.exit(1) print "I2C address:", hex(i2c_address) try: if int(response) is 2: lcd.init(address=i2c_address)
def run(self): global lcd global CurrentFile GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers GPIO.setwarnings(False) # Ignore warnings down_switch = radio.getSwitchGpio("down_switch") log.message("Down switch = " + str(down_switch), log.DEBUG) boardrevision = radio.getBoardRevision() if boardrevision == 1: # For rev 1 boards with no inbuilt pull-up/down resistors # Wire the GPIO inputs to ground via a 10K resistor GPIO.setup(MENU_SWITCH, GPIO.IN) GPIO.setup(UP_SWITCH, GPIO.IN) GPIO.setup(down_switch, GPIO.IN) GPIO.setup(LEFT_SWITCH, GPIO.IN) GPIO.setup(RIGHT_SWITCH, GPIO.IN) else: # For rev 2 boards with inbuilt pull-up/down resistors the # following lines are used instead of the above, so # there is no need to physically wire the 10k resistors GPIO.setup(MENU_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(UP_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(down_switch, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LEFT_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(RIGHT_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Initialise radio log.init('radio') signal.signal(signal.SIGTERM,signalHandler) signal.signal(signal.SIGUSR1,signalSIGUSR1) progcall = str(sys.argv) log.message('Radio running pid ' + str(os.getpid()), log.INFO) log.message("Radio " + progcall + " daemon version " + radio.getVersion(), log.INFO) log.message("GPIO version " + str(GPIO.VERSION), log.INFO) # Load pcf8475 i2c class or Adafruit backpack if radio.getBackPackType() == radio.PCF8475: log.message("PCF8475 backpack", log.INFO) lcd = lcd_i2c_pcf8475() else: log.message("Adafruit backpack", log.INFO) lcd = lcd_i2c() boardrevision = radio.getBoardRevision() lcd.init(boardrevision) lcd.backlight(True) hostname = exec_cmd('hostname') ipaddr = exec_cmd('hostname -I') myos = exec_cmd('uname -a') log.message(myos, log.INFO) # Display daemon pid on the LCD message = "Radio pid " + str(os.getpid()) lcd.line1(message) lcd.line2("IP " + ipaddr) time.sleep(4) # Wait for the IP network ipaddr = "" waiting4network = True count = 10 while waiting4network: lcd.line2("Wait for network") ipaddr = exec_cmd('hostname -I') time.sleep(1) count -= 1 if (count < 0) or (len(ipaddr) > 1): waiting4network = False if len(ipaddr) < 1: lcd.line2("No IP network") else: lcd.line2("IP " + ipaddr) time.sleep(2) log.message("Starting MPD", log.INFO) lcd.line2("Starting MPD") radio.start() log.message("MPD started", log.INFO) mpd_version = radio.execMpcCommand("version") log.message(mpd_version, log.INFO) lcd.line1("Radio ver "+ radio.getVersion()) lcd.scroll2(mpd_version,no_interrupt) time.sleep(1) reload(lcd,radio) radio.play(get_stored_id(CurrentFile)) log.message("Current ID = " + str(radio.getCurrentID()), log.INFO) # Set up switch event processing GPIO.add_event_detect(MENU_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(LEFT_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(RIGHT_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(UP_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(down_switch, GPIO.RISING, callback=switch_event, bouncetime=200) # Main processing loop count = 0 while True: switch = radio.getSwitch() if switch > 0: get_switch_states(lcd,radio,rss) display_mode = radio.getDisplayMode() lcd.setScrollSpeed(0.3) # Scroll speed normal dateFormat = radio.getDateFormat() todaysdate = strftime(dateFormat) ipaddr = exec_cmd('hostname -I') # Shutdown command issued if display_mode == radio.MODE_SHUTDOWN: displayShutdown(lcd) while True: time.sleep(1) if len(ipaddr) < 1: lcd.line2("No IP network") elif display_mode == radio.MODE_TIME: if radio.getReload(): log.message("Reload ", log.DEBUG) reload(lcd,radio) radio.setReload(False) else: displayTime(lcd,radio) if radio.muted(): msg = "Sound muted" if radio.getStreaming(): msg = msg + ' *' lcd.line2(msg) else: display_current(lcd,radio) elif display_mode == radio.MODE_SEARCH: display_search(lcd,radio) elif display_mode == radio.MODE_SOURCE: display_source_select(lcd,radio) elif display_mode == radio.MODE_OPTIONS: display_options(lcd,radio) elif display_mode == radio.MODE_IP: lcd.line2("Radio v" + radio.getVersion()) if len(ipaddr) < 1: lcd.line1("No IP network") else: lcd.scroll1("IP " + ipaddr, interrupt) elif display_mode == radio.MODE_RSS: displayTime(lcd,radio) display_rss(lcd,rss) elif display_mode == radio.MODE_SLEEP: lcd.line1(todaysdate) display_sleep(lcd,radio) # Timer function checkTimer(radio) # Check state (pause or play) checkState(radio) # Alarm wakeup function if display_mode == radio.MODE_SLEEP and radio.alarmFired(): log.message("Alarm fired", log.INFO) unmuteRadio(lcd,radio) displayWakeUpMessage(lcd) radio.setDisplayMode(radio.MODE_TIME) if radio.volumeChanged(): lcd.line2("Volume " + str(radio.getVolume())) time.sleep(0.5) time.sleep(0.1)
def run(self): global lcd global CurrentFile global volumeknob,tunerknob log.init('radio') # Setup signal handlers signal.signal(signal.SIGTERM,signalHandler) progcall = str(sys.argv) log.message('Radio running pid ' + str(os.getpid()), log.INFO) log.message("Radio " + progcall + " daemon version " + radio.getVersion(), log.INFO) log.message("GPIO version " + str(GPIO.VERSION), log.INFO) i2c_address = radio.getI2Caddress() # Load pcf8574 i2c class or Adafruit backpack if radio.getBackPackType() == radio.PCF8574: log.message("PCF8574 backpack, address: " + hex(i2c_address), log.INFO) lcd = lcd_i2c_pcf8574() else: log.message("Adafruit backpack, address: " + hex(i2c_address), log.INFO) lcd = lcd_i2c() boardrevision = radio.getBoardRevision() lcd.init(board_rev=boardrevision, address=i2c_address) lcd.backlight(True) # Set up LCD line width width = lcd.getWidth() if width > 0: lcd.setWidth(width) else: lcd.setWidth(20) lcd.scroll1("Radio version " + radio.getVersion(), nointerrupt) time.sleep(0.5) ipaddr = exec_cmd('hostname -I') hostname = exec_cmd('hostname -s') # Display daemon pid on the LCD message = "Radio pid " + str(os.getpid()) lcd.line2(message) # Wait for the IP network ipaddr = "" waiting4network = True count = 10 while waiting4network: lcd.line4("Waiting for network") ipaddr = exec_cmd('hostname -I') time.sleep(1) count -= 1 if (count < 0) or (len(ipaddr) > 1): waiting4network = False if len(ipaddr) < 1: lcd.line4("No IP network") else: lcd.line4("IP " + ipaddr) time.sleep(2) lcd.line3("Starting MPD") log.message("GPIO version " + str(GPIO.VERSION), log.INFO) radio.start() log.message("MPD started", log.INFO) time.sleep(0.5) mpd_version = radio.execMpcCommand("version") log.message(mpd_version, log.INFO) lcd.scroll3(mpd_version, no_interrupt) lcd.scroll4("GPIO version " + str(GPIO.VERSION), no_interrupt) time.sleep(2.0) # Auto-load music library if no Internet if len(ipaddr) < 1 and radio.autoload(): log.message("Loading music library",log.INFO) radio.setSource(radio.PLAYER) # Load radio reload(lcd,radio) radio.play(get_stored_id(CurrentFile)) log.message("Current ID = " + str(radio.getCurrentID()), log.INFO) lcd.line3("Radio Station " + str(radio.getCurrentID())) # Get rotary switches configuration up_switch = radio.getSwitchGpio("up_switch") down_switch = radio.getSwitchGpio("down_switch") left_switch = radio.getSwitchGpio("left_switch") right_switch = radio.getSwitchGpio("right_switch") menu_switch = radio.getSwitchGpio("menu_switch") mute_switch = radio.getSwitchGpio("mute_switch") if radio.getRotaryClass() is radio.ROTARY_STANDARD: volumeknob = RotaryEncoder(left_switch,right_switch,mute_switch,volume_event,boardrevision) tunerknob = RotaryEncoder(down_switch,up_switch,menu_switch,tuner_event,boardrevision) elif radio.getRotaryClass() is radio.ROTARY_ALTERNATIVE: volumeknob = RotaryEncoderAlternative(left_switch,right_switch,mute_switch,volume_event,boardrevision) log.message("Running" , log.INFO) # Main processing loop count = 0 toggleScrolling = True # Toggle scrolling between Line 2 and 3 while True: # Check for audio device error if radio.audioError(): lcd.line1("Audio Error!") lcd.line2("Aborting!") time.sleep(5) sys.exit(1) # See if we have had an interrupt switch = radio.getSwitch() if switch > 0: get_switch_states(lcd,radio,rss,volumeknob,tunerknob) display_mode = radio.getDisplayMode() lcd.setScrollSpeed(0.3) # Scroll speed normal dateFormat = radio.getDateFormat() todaysdate = strftime(dateFormat) source = radio.getSource() ipaddr = exec_cmd('hostname -I') # Shutdown command issued if display_mode == radio.MODE_SHUTDOWN: log.message("Shutting down", log.DEBUG) displayShutdown(lcd,radio) while True: time.sleep(1) if ipaddr is "": lcd.line3("No IP network") elif display_mode == radio.MODE_TIME: if radio.getReload(): log.message("Reload ", log.DEBUG) reload(lcd,radio) radio.setReload(False) msg = todaysdate if radio.getStreaming(): msg = msg + ' *' lcd.line1(msg) if source == radio.AIRPLAY: displayAirplay(lcd,radio) else: display_current(lcd,radio,toggleScrolling) elif display_mode == radio.MODE_SEARCH: display_search(lcd,radio) elif display_mode == radio.MODE_SOURCE: display_source_select(lcd,radio) elif display_mode == radio.MODE_OPTIONS: display_options(lcd,radio) elif display_mode == radio.MODE_IP: displayInfo(lcd,ipaddr,mpd_version) elif display_mode == radio.MODE_RSS: lcd.line1(todaysdate) input_source = radio.getSource() current_id = radio.getCurrentID() if input_source == radio.RADIO: station = radio.getRadioStation() + ' (' + str(current_id) + ')' lcd.line2(station) else: lcd.line2("Current track:" + str(current_id)) display_rss(lcd,rss) elif display_mode == radio.MODE_SLEEP: lcd.line1(todaysdate) display_sleep(lcd,radio) # Timer function checkTimer(radio) # Check state (pause or play) checkState(radio) # Alarm wakeup function if display_mode == radio.MODE_SLEEP and radio.alarmFired(): log.message("Alarm fired", log.INFO) radio.unmute() displayWakeUpMessage(lcd) radio.setDisplayMode(radio.MODE_TIME) # Toggle line 2 & 3 scrolling if toggleScrolling: toggleScrolling = False else: toggleScrolling = True time.sleep(0.1)
def run(self): global lcd global CurrentFile global volumeknob, tunerknob log.init('radio') # Setup signal handlers signal.signal(signal.SIGTERM, signalHandler) progcall = str(sys.argv) log.message('Radio running pid ' + str(os.getpid()), log.INFO) log.message( "Radio " + progcall + " daemon version " + radio.getVersion(), log.INFO) log.message("GPIO version " + str(GPIO.VERSION), log.INFO) i2c_address = radio.getI2Caddress() # Load pcf8574 i2c class or Adafruit backpack if radio.getBackPackType() == radio.PCF8574: log.message("PCF8574 backpack, address: " + hex(i2c_address), log.INFO) lcd = lcd_i2c_pcf8574() else: log.message("Adafruit backpack, address: " + hex(i2c_address), log.INFO) lcd = lcd_i2c() boardrevision = radio.getBoardRevision() lcd.init(board_rev=boardrevision, address=i2c_address) lcd.backlight(True) # Set up LCD line width width = lcd.getWidth() if width > 0: lcd.setWidth(width) else: lcd.setWidth(20) lcd.line1("Radio vers " + radio.getVersion()) time.sleep(0.5) ipaddr = exec_cmd('hostname -I') hostname = exec_cmd('hostname -s') # Display daemon pid on the LCD message = "Radio pid " + str(os.getpid()) lcd.line2(message) lcd.line3("Starting MPD") log.message("GPIO version " + str(GPIO.VERSION), log.INFO) lcd.line4("IP " + ipaddr) radio.start() log.message("MPD started", log.INFO) time.sleep(0.5) mpd_version = radio.execMpcCommand("version") log.message(mpd_version, log.INFO) lcd.scroll3(mpd_version, no_interrupt) lcd.scroll4("GPIO version " + str(GPIO.VERSION), no_interrupt) time.sleep(2.0) # Auto-load music library if no Internet if len(ipaddr) < 1 and radio.autoload(): log.message("Loading music library", log.INFO) radio.setSource(radio.PLAYER) # Load radio reload(lcd, radio) radio.play(get_stored_id(CurrentFile)) log.message("Current ID = " + str(radio.getCurrentID()), log.INFO) lcd.line3("Radio Station " + str(radio.getCurrentID())) # Get rotary switches configuration up_switch = radio.getSwitchGpio("up_switch") down_switch = radio.getSwitchGpio("down_switch") left_switch = radio.getSwitchGpio("left_switch") right_switch = radio.getSwitchGpio("right_switch") menu_switch = radio.getSwitchGpio("menu_switch") mute_switch = radio.getSwitchGpio("mute_switch") if radio.getRotaryClass() is radio.ROTARY_STANDARD: volumeknob = RotaryEncoder(left_switch, right_switch, mute_switch, volume_event, boardrevision) tunerknob = RotaryEncoder(down_switch, up_switch, menu_switch, tuner_event, boardrevision) elif radio.getRotaryClass() is radio.ROTARY_ALTERNATIVE: volumeknob = RotaryEncoderAlternative(left_switch, right_switch, mute_switch, volume_event, boardrevision) log.message("Running", log.INFO) # Main processing loop count = 0 toggleScrolling = True # Toggle scrolling between Line 2 and 3 while True: # See if we have had an interrupt switch = radio.getSwitch() if switch > 0: get_switch_states(lcd, radio, rss, volumeknob, tunerknob) display_mode = radio.getDisplayMode() lcd.setScrollSpeed(0.3) # Scroll speed normal dateFormat = radio.getDateFormat() todaysdate = strftime(dateFormat) ipaddr = exec_cmd('hostname -I') # Shutdown command issued if display_mode == radio.MODE_SHUTDOWN: log.message("Shutting down", log.DEBUG) displayShutdown(lcd) while True: time.sleep(1) if ipaddr is "": lcd.line3("No IP network") elif display_mode == radio.MODE_TIME: if radio.getReload(): log.message("Reload ", log.DEBUG) reload(lcd, radio) radio.setReload(False) msg = todaysdate if radio.getStreaming(): msg = msg + ' *' lcd.line1(msg) display_current(lcd, radio, toggleScrolling) elif display_mode == radio.MODE_SEARCH: display_search(lcd, radio) elif display_mode == radio.MODE_SOURCE: display_source_select(lcd, radio) elif display_mode == radio.MODE_OPTIONS: display_options(lcd, radio) elif display_mode == radio.MODE_IP: displayInfo(lcd, ipaddr, mpd_version) elif display_mode == radio.MODE_RSS: lcd.line1(todaysdate) input_source = radio.getSource() current_id = radio.getCurrentID() if input_source == radio.RADIO: station = radio.getRadioStation() + ' (' + str( current_id) + ')' lcd.line2(station) else: lcd.line2("Current track:" + str(current_id)) display_rss(lcd, rss) elif display_mode == radio.MODE_SLEEP: lcd.line1(todaysdate) display_sleep(lcd, radio) # Timer function checkTimer(radio) # Check state (pause or play) checkState(radio) # Alarm wakeup function if display_mode == radio.MODE_SLEEP and radio.alarmFired(): log.message("Alarm fired", log.INFO) radio.unmute() displayWakeUpMessage(lcd) radio.setDisplayMode(radio.MODE_TIME) # Toggle line 2 & 3 scrolling if toggleScrolling: toggleScrolling = False else: toggleScrolling = True time.sleep(0.1)
def run(self): global lcd global CurrentFile GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers GPIO.setwarnings(False) # Ignore warnings down_switch = radio.getSwitchGpio("down_switch") log.message("Down switch = " + str(down_switch), log.DEBUG) boardrevision = radio.getBoardRevision() if boardrevision == 1: # For rev 1 boards with no inbuilt pull-up/down resistors # Wire the GPIO inputs to ground via a 10K resistor GPIO.setup(MENU_SWITCH, GPIO.IN) GPIO.setup(UP_SWITCH, GPIO.IN) GPIO.setup(down_switch, GPIO.IN) GPIO.setup(LEFT_SWITCH, GPIO.IN) GPIO.setup(RIGHT_SWITCH, GPIO.IN) else: # For rev 2 boards with inbuilt pull-up/down resistors the # following lines are used instead of the above, so # there is no need to physically wire the 10k resistors GPIO.setup(MENU_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(UP_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(down_switch, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LEFT_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(RIGHT_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Initialise radio log.init('radio') signal.signal(signal.SIGTERM, signalHandler) signal.signal(signal.SIGUSR1, signalSIGUSR1) progcall = str(sys.argv) log.message('Radio running pid ' + str(os.getpid()), log.INFO) log.message( "Radio " + progcall + " daemon version " + radio.getVersion(), log.INFO) log.message("GPIO version " + str(GPIO.VERSION), log.INFO) # Load pcf8475 i2c class or Adafruit backpack if radio.getBackPackType() == radio.PCF8475: log.message("PCF8475 backpack", log.INFO) lcd = lcd_i2c_pcf8475() else: log.message("Adafruit backpack", log.INFO) lcd = lcd_i2c() boardrevision = radio.getBoardRevision() lcd.init(boardrevision) lcd.backlight(True) hostname = exec_cmd('hostname') ipaddr = exec_cmd('hostname -I') myos = exec_cmd('uname -a') log.message(myos, log.INFO) # Display daemon pid on the LCD message = "Radio pid " + str(os.getpid()) lcd.line1(message) lcd.line2("IP " + ipaddr) time.sleep(4) # Wait for the IP network ipaddr = "" waiting4network = True count = 10 while waiting4network: lcd.line2("Wait for network") ipaddr = exec_cmd('hostname -I') time.sleep(1) count -= 1 if (count < 0) or (len(ipaddr) > 1): waiting4network = False if len(ipaddr) < 1: lcd.line2("No IP network") else: lcd.line2("IP " + ipaddr) time.sleep(2) log.message("Starting MPD", log.INFO) lcd.line2("Starting MPD") radio.start() log.message("MPD started", log.INFO) mpd_version = radio.execMpcCommand("version") log.message(mpd_version, log.INFO) lcd.line1("Radio ver " + radio.getVersion()) lcd.scroll2(mpd_version, no_interrupt) time.sleep(1) reload(lcd, radio) radio.play(get_stored_id(CurrentFile)) log.message("Current ID = " + str(radio.getCurrentID()), log.INFO) # Set up switch event processing GPIO.add_event_detect(MENU_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(LEFT_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(RIGHT_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(UP_SWITCH, GPIO.RISING, callback=switch_event, bouncetime=200) GPIO.add_event_detect(down_switch, GPIO.RISING, callback=switch_event, bouncetime=200) # Main processing loop count = 0 while True: switch = radio.getSwitch() if switch > 0: get_switch_states(lcd, radio, rss) display_mode = radio.getDisplayMode() lcd.setScrollSpeed(0.3) # Scroll speed normal dateFormat = radio.getDateFormat() todaysdate = strftime(dateFormat) ipaddr = exec_cmd('hostname -I') # Shutdown command issued if display_mode == radio.MODE_SHUTDOWN: displayShutdown(lcd) while True: time.sleep(1) if len(ipaddr) < 1: lcd.line2("No IP network") elif display_mode == radio.MODE_TIME: if radio.getReload(): log.message("Reload ", log.DEBUG) reload(lcd, radio) radio.setReload(False) else: displayTime(lcd, radio) if radio.muted(): msg = "Sound muted" if radio.getStreaming(): msg = msg + ' *' lcd.line2(msg) else: display_current(lcd, radio) elif display_mode == radio.MODE_SEARCH: display_search(lcd, radio) elif display_mode == radio.MODE_SOURCE: display_source_select(lcd, radio) elif display_mode == radio.MODE_OPTIONS: display_options(lcd, radio) elif display_mode == radio.MODE_IP: lcd.line2("Radio v" + radio.getVersion()) if len(ipaddr) < 1: lcd.line1("No IP network") else: lcd.scroll1("IP " + ipaddr, interrupt) elif display_mode == radio.MODE_RSS: displayTime(lcd, radio) display_rss(lcd, rss) elif display_mode == radio.MODE_SLEEP: lcd.line1(todaysdate) display_sleep(lcd, radio) # Timer function checkTimer(radio) # Check state (pause or play) checkState(radio) # Alarm wakeup function if display_mode == radio.MODE_SLEEP and radio.alarmFired(): log.message("Alarm fired", log.INFO) unmuteRadio(lcd, radio) displayWakeUpMessage(lcd) radio.setDisplayMode(radio.MODE_TIME) if radio.volumeChanged(): lcd.line2("Volume " + str(radio.getVolume())) time.sleep(0.5) time.sleep(0.1)
def run(self): global lcd global CurrentFile global volumeknob, tunerknob log.init('radio') signal.signal(signal.SIGTERM, signalHandler) progcall = str(sys.argv) log.message('Radio running pid ' + str(os.getpid()), log.INFO) log.message( "Radio " + progcall + " daemon version " + radio.getVersion(), log.INFO) log.message("GPIO version " + str(GPIO.VERSION), log.INFO) i2c_address = radio.getI2Caddress() # Get address from configuration # Load pcf8574 i2c class or Adafruit backpack if radio.getBackPackType() == radio.PCF8574: log.message("PCF8574 backpack address: " + hex(i2c_address), log.INFO) lcd = lcd_i2c_pcf8574() else: log.message("Adafruit backpack address: " + hex(i2c_address), log.INFO) lcd = lcd_i2c() boardrevision = radio.getBoardRevision() lcd.init(board_rev=boardrevision, address=i2c_address) lcd.backlight(True) hostname = exec_cmd('hostname') ipaddr = exec_cmd('hostname -I') # Display daemon pid on the LCD message = "Radio pid " + str(os.getpid()) lcd.line1(message) lcd.line2("IP " + ipaddr) time.sleep(4) log.message("Starting MPD", log.INFO) lcd.line2("Starting MPD") radio.start() log.message("MPD started", log.INFO) mpd_version = radio.execMpcCommand("version") log.message(mpd_version, log.INFO) lcd.line1("Radio ver " + radio.getVersion()) lcd.scroll2(mpd_version, no_interrupt) time.sleep(1) reload(lcd, radio) radio.play(get_stored_id(CurrentFile)) log.message("Current ID = " + str(radio.getCurrentID()), log.INFO) # Get rotary switches configuration up_switch = radio.getSwitchGpio("up_switch") down_switch = radio.getSwitchGpio("down_switch") left_switch = radio.getSwitchGpio("left_switch") right_switch = radio.getSwitchGpio("right_switch") menu_switch = radio.getSwitchGpio("menu_switch") mute_switch = radio.getSwitchGpio("mute_switch") if radio.getRotaryClass() is radio.ROTARY_STANDARD: volumeknob = RotaryEncoder(left_switch, right_switch, mute_switch, volume_event, boardrevision) tunerknob = RotaryEncoder(up_switch, down_switch, menu_switch, tuner_event, boardrevision) elif radio.getRotaryClass() is radio.ROTARY_ALTERNATIVE: volumeknob = RotaryEncoderAlternative(left_switch, right_switch, mute_switch, volume_event, boardrevision) tunerknob = RotaryEncoderAlternative(up_switch, down_switch, menu_switch, tuner_event, boardrevision) log.message("Running", log.INFO) # Main processing loop count = 0 while True: switch = radio.getSwitch() if switch > 0: get_switch_states(lcd, radio, rss, volumeknob, tunerknob) radio.setSwitch(0) display_mode = radio.getDisplayMode() lcd.setScrollSpeed(0.3) # Scroll speed normal dateFormat = radio.getDateFormat() todaysdate = strftime(dateFormat) ipaddr = exec_cmd('hostname -I') # Shutdown command issued if display_mode == radio.MODE_SHUTDOWN: displayShutdown(lcd) while True: time.sleep(1) elif ipaddr is "": lcd.line2("No IP network") elif display_mode == radio.MODE_TIME: if radio.getReload(): log.message("Reload ", log.DEBUG) reload(lcd, radio) radio.setReload(False) displayTime(lcd, radio) if radio.muted(): msg = "Sound muted" if radio.getStreaming(): msg = msg + ' *' lcd.line2(msg) else: display_current(lcd, radio) elif display_mode == radio.MODE_SEARCH: display_search(lcd, radio) elif display_mode == radio.MODE_SOURCE: display_source_select(lcd, radio) elif display_mode == radio.MODE_OPTIONS: display_options(lcd, radio) elif display_mode == radio.MODE_IP: lcd.line2("Radio v" + radio.getVersion()) if ipaddr is "": lcd.line1("No IP network") else: lcd.scroll1("IP " + ipaddr, interrupt) elif display_mode == radio.MODE_RSS: lcd.line1(todaysdate) display_rss(lcd, rss) elif display_mode == radio.MODE_SLEEP: lcd.line1(todaysdate) display_sleep(lcd, radio) # Timer function checkTimer(radio) # Check state (pause or play) checkState(radio) # Alarm wakeup function if display_mode == radio.MODE_SLEEP and radio.alarmFired(): log.message("Alarm fired", log.INFO) unmuteRadio(lcd, radio) displayWakeUpMessage(lcd) radio.setDisplayMode(radio.MODE_TIME) if radio.volumeChanged(): lcd.line2("Volume " + str(radio.getVolume())) time.sleep(0.5) time.sleep(0.1)