# @name Clock_S # @desc Small centered clock HH:MM or HH:MM:SS with 12/24h format, day/night mode, brightness and rotation control # @author Avemer # @version 1.3 # @config hour_format select "Hour format" default=24 options=24,12 # @config show_seconds bool "Show seconds" default=true # @config blink_colon bool "Blink colon" default=true # @config clock_color color "Day clock color" default=#FFFFFF # @config day_brightness slider "Day brightness" default=127 min=1 max=255 # @config day_auto_brightness bool "Day auto brightness" default=false # @config night_mode bool "Night mode" default=true # @config night_start text "Night start" default="23:00" maxlen=5 # @config night_end text "Night end" default="08:00" maxlen=5 # @config night_color color "Night clock color" default=#FF0000 # @config night_brightness slider "Night brightness" default=10 min=0 max=255 # @config night_auto_brightness bool "Night auto brightness" default=false # @config night_rotation bool "Disable rotation at night" default=true class Clock # USER VARIABLES var HOUR_FORMAT var SHOW_SECONDS var BLINK_COLON var CLOCK_COLOR var DAY_BRIGHTNESS var DAY_AUTO_BRIGHTNESS var NIGHT_MODE_ENABLED var NIGHT_START var NIGHT_END var NIGHT_CLOCK_COLOR var NIGHT_BRIGHTNESS var NIGHT_AUTO_BRIGHTNESS var NIGHT_ROTATION_ENABLED # INTERNAL VARIABLES var night_start_m var night_end_m var night_mode var last_night_mode # INITIALIZATION def init() # SELECT returns a string value. # Keep it as string: "12" or "24". self.HOUR_FORMAT = str( store.get("hour_format") ) # Boolean settings. self.SHOW_SECONDS = store.get("show_seconds") self.BLINK_COLON = store.get("blink_colon") self.CLOCK_COLOR = store.get("clock_color") self.DAY_BRIGHTNESS = store.get("day_brightness") self.DAY_AUTO_BRIGHTNESS = store.get("day_auto_brightness") self.NIGHT_MODE_ENABLED = store.get("night_mode") self.NIGHT_START = store.get("night_start") self.NIGHT_END = store.get("night_end") self.NIGHT_CLOCK_COLOR = store.get("night_color") self.NIGHT_BRIGHTNESS = store.get("night_brightness") self.NIGHT_AUTO_BRIGHTNESS = store.get("night_auto_brightness") self.NIGHT_ROTATION_ENABLED = store.get("night_rotation") # Parse night mode times. self.night_start_m = self.parse_min( self.NIGHT_START, 23 * 60 ) self.night_end_m = self.parse_min( self.NIGHT_END, 8 * 60 ) self.night_mode = false self.last_night_mode = nil end # CONVERT HH:MM TO MINUTES def parse_min(txt, dflt) var m = re.search( "(\\d\\d?):(\\d\\d)", str(txt) ) if m == nil return dflt end var v = num(m[1], 0) * 60 + num(m[2], 0) if v >= 0 && v < 1440 return v end return dflt end # UPDATE NIGHT MODE def update_night_mode() var night = false var hr = num(hour(), -1) var mi = num(minute(), -1) if hr < 0 || mi < 0 return end if self.NIGHT_MODE_ENABLED var now = hr * 60 + mi # Same start and end = disabled. if self.night_start_m == self.night_end_m night = false # Normal interval. elif self.night_start_m < self.night_end_m if now >= self.night_start_m && now < self.night_end_m night = true end # Interval crosses midnight. else if now >= self.night_start_m || now < self.night_end_m night = true end end end self.night_mode = night # APPLY SETTINGS ONLY WHEN MODE CHANGES if self.night_mode != self.last_night_mode self.last_night_mode = self.night_mode # NIGHT MODE if self.night_mode settings.set( "brightness", self.NIGHT_BRIGHTNESS ) settings.set( "autoBrightness", self.NIGHT_AUTO_BRIGHTNESS ) if self.NIGHT_ROTATION_ENABLED rotation.show() rotation.pause() end # DAY MODE else settings.set( "brightness", self.DAY_BRIGHTNESS ) settings.set( "autoBrightness", self.DAY_AUTO_BRIGHTNESS ) if self.NIGHT_ROTATION_ENABLED rotation.resume() end end end # Keep rotation disabled throughout night. if self.night_mode if self.NIGHT_ROTATION_ENABLED rotation.pause() end end end # MAIN LOOP def loop() self.update_night_mode() end # GET CURRENT CLOCK COLOR def get_color() var c = self.CLOCK_COLOR if self.night_mode c = self.NIGHT_CLOCK_COLOR end return c end # DRAW CLOCK def draw() clear() var h = num(hour(), 0) var m = num(minute(), 0) var s = num(second(), 0) # 12 / 24 HOUR FORMAT # # IMPORTANT: # hour_format from SELECT is handled as a STRING. # # "24" = 24-hour format # "12" = 12-hour format if self.HOUR_FORMAT == "12" h = h % 12 if h == 0 h = 12 end end # FORMAT HOURS var hh = str(h) if h < 10 hh = "0" + hh end # FORMAT MINUTES var mm = str(m) if m < 10 mm = "0" + mm end # FORMAT SECONDS var ss = str(s) if s < 10 ss = "0" + ss end # CREATE TIME STRING var value = hh + ":" + mm # ADD SECONDS if self.SHOW_SECONDS value = value + ":" + ss end # BLINK COLON if self.BLINK_COLON if s % 2 == 1 value = hh + " " + mm if self.SHOW_SECONDS value = value + " " + ss end end end # CENTER TEXT var color = self.get_color() var w = text_ink_width(value) var x = int((width() - w) / 2) text( x, 6, value, color ) end # BUTTON def on_button(btn) end end return Clock()