示例#1
0
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()
示例#2
0
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)
示例#3
0
	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)
示例#4
0
	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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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)