class LcdThread(threading.Thread): def __init__(self, alarmThread, shutdownCallback, weatherFetcher): threading.Thread.__init__(self) self.alarmThread = alarmThread self.stopping = False self.message = "" self.settings = Settings.Settings() self.weather = weatherFetcher self.menu = MenuControl.MenuControl(alarmThread, shutdownCallback) self.menu.setDaemon(True) self.lcd = LCDControl() self.lcd.white() self.setMessage("Booting up...") self.rotor = InputWorker(self) self.rotor.start() def setBrightness(self, brightness): # We get passes a value from 0 - 15, which we need to scale to 0-255 before passing to LCDControl colVal = int(255 * (float(brightness) / 15)) self.lcd.setColour(colVal, colVal, colVal) def setMessage(self, newMessage, center=False): if newMessage != self.message: self.message = newMessage self.lcd.setMessage(self.message, center) def scroll(self, direction): self.menu.scroll(direction) # Called by InputWorker on press of the select button def select(self): if self.alarmThread.isAlarmSounding(): # Lets snooze for a while self.alarmThread.snooze() return self.menu.select() # Called by InputWorker on press of the cancel button def cancel(self): if self.alarmThread.isAlarmSounding() or self.alarmThread.isSnoozing(): # Stop the alarm! self.alarmThread.stopAlarm() return if self.alarmThread.alarmInSeconds() < self.settings.getInt("preempt_cancel") and not self.menu.isActive(): # We're in the allowable window for pre-empting a cancel alarm, and we're not in the menu log.info("Pre-empt cancel triggered") self.alarmThread.stopAlarm() return self.menu.cancel() def stop(self): self.stopping = True def run(self): self.menu.start() self.lcd.setMessage("Boot finished") while not self.stopping: time.sleep(0.1) try: if self.alarmThread.isAlarmSounding(): self.setMessage("Wakey wakey!", True) continue if self.menu.isActive(): message = self.menu.getMessage() elif self.menu.backgroundRadioActive(): message = "Radio player on" else: now = datetime.datetime.now(pytz.timezone("Europe/London")) message = formatDate(now) message += "\n" message += self.weather.getWeather().display() message += "\n" message += self.alarmThread.getMenuLine() self.setMessage(message, True) except: log.exception("Error in LcdThread loop") # end while not stopping self.setMessage("Shutting down") self.lcd.shutdown() self.menu.stop()
from AudioPlayer import AudioPlayer from InputWorker import InputWorker from MusicDB import MusicDB from ScannerWorker import ScannerWorker from input.SipPuffEvent import SipPuffEvent from helpers.QueueMerge import QueueMerge from scanner.ScannerEvents import ScannerEvent, RootPathAppeared, RootPathRemoved, AudioFileFound if __name__ == '__main__': # Create the database mdb = MusicDB() # initialize input system inputProcess = InputWorker() inputProcess.start() # initialize scanner scannerProcess = ScannerWorker() scannerProcess.start() # merge the outputs into a single queue qm = QueueMerge() qm.add_input_queue(inputProcess.output_queue) qm.add_input_queue(scannerProcess.output_queue) # initialize audio player player = AudioPlayer() while True: # Endless work loop. We read an event and act on it event = qm.outputQueue.get()
class LcdThread(threading.Thread): def __init__(self, alarmThread, settings, weather, media, shutdownCallback): threading.Thread.__init__(self) self.alarmThread = alarmThread self.stopping = False self.message = "" self.settings = settings self.weather = weather self.menu = MenuControl.MenuControl(alarmThread, settings, media, shutdownCallback) self.menu.setDaemon(True) self.lcd = LCDControl() self.lcd.white() self.setMessage("Booting up...") if self.settings.getInt('use_rotor') == 1: self.rotor = InputWorker(self) self.rotor.start() def setBrightness(self, brightness): # We get passes a value from 0 - 15, which we need to scale to 0-255 before passing to LCDControl colVal = int(255 * (float(brightness) / 15)) self.lcd.setColour(colVal, colVal, colVal) def setMessage(self, newMessage, center=False): if newMessage != self.message: self.message = newMessage self.lcd.setMessage(self.message, center) def scroll(self, direction): self.menu.scroll(direction) # Called by InputWorker on press of the select button def select(self): if self.alarmThread.isAlarmSounding(): # Lets snooze for a while self.alarmThread.snooze() return self.menu.select() # Called by InputWorker on press of the cancel button def cancel(self): if self.alarmThread.isAlarmSounding() or self.alarmThread.isSnoozing(): # Stop the alarm! self.alarmThread.stopAlarm() return if self.alarmThread.alarmInSeconds() < self.settings.getInt( 'preempt_cancel') and not self.menu.isActive(): # We're in the allowable window for pre-empting a cancel alarm, and we're not in the menu log.info("Pre-empt cancel triggered") self.alarmThread.stopAlarm() return self.menu.cancel() def stop(self): self.stopping = True def run(self): self.menu.start() self.lcd.setMessage("Boot finished") while (not self.stopping): time.sleep(0.1) try: if self.alarmThread.isAlarmSounding(): self.setMessage("Wakey wakey!", True) continue if self.menu.isActive(): message = self.menu.getMessage() elif self.menu.backgroundRadioActive(): message = "Radio player on" else: now = datetime.datetime.now( pytz.timezone(self.settings.get('timezone'))) message = formatDate(now) message += "\n" message += self.weather.getWeather().display() message += "\n" message += self.alarmThread.getMenuLine() self.setMessage(message, True) except: log.exception("Error in LcdThread loop") # end while not stopping self.setMessage("Shutting down") self.lcd.shutdown() self.menu.stop()
def initInput(self, settings, alarm): from InputWorker import InputWorker log.debug("Initializing inputs") inputWorker = InputWorker(alarm, settings) inputWorker.start() return inputWorker