# @name LED Ticker # @desc A simple and customizable LED ticker for AWTRIX NG # @version 1.1 # @config message text "Text" default="BR4ND LED TICKER" maxlen=256 # @config scrolling bool "Scrolling" default=true # @config font select "Font size" default=small options=small,large # @config colorMode select "Color mode" default=solid options=solid,rainbow,blink,fade # @config color color "Text color" default=#FFFFFF # @config background color "Background color" default=#000000 # @config effectSpeed number "Effect speed" default=1000 min=100 max=5000 unit=ms # @config speed number "Scroll speed" default=100 min=0 max=300 unit=% # @config direction select "Direction" default=left options=left,right # @config scrollMode select "Scroll mode" default=loop options=static,wrap,loop,bounce # @config gap number "Gap" default=8 min=0 max=32 unit=px # @config hold number "Pause" default=1000 min=0 max=5000 unit=ms class LEDTicker var message var scrolling var fontName var colorMode var color var background var effectSpeed var speed var direction var scrollMode var gap var hold var rainbow def init() self.message = store.get("message") self.scrolling = store.get("scrolling") self.fontName = store.get("font") self.colorMode = store.get("colorMode") self.color = store.get("color") self.background = store.get("background") self.effectSpeed = store.get("effectSpeed") self.speed = store.get("speed") self.direction = store.get("direction") self.scrollMode = store.get("scrollMode") self.gap = store.get("gap") self.hold = store.get("hold") self.rainbow = [] var length = size(self.message) if length > 0 for i : 0 .. length - 1 var hue = (i * 360) / length self.rainbow.push([self.message[i], hsv(hue, 100, 70)]) end end end def blinkColor() var period = self.effectSpeed if period <= 0 return self.color end var phase = now_ms() % period if phase < (period / 2) return 0x000000 end return self.color end def fadeColor() var period = self.effectSpeed if period <= 0 return self.color end var phase = now_ms() % period var brightness if phase < (period / 2) brightness = (phase * 255) / (period / 2) else brightness = ((period - phase) * 255) / (period / 2) end if brightness < 0 brightness = 0 end if brightness > 255 brightness = 255 end var r = (self.color >> 16) & 255 var g = (self.color >> 8) & 255 var b = self.color & 255 var rr = (r * brightness) / 255 var gg = (g * brightness) / 255 var bb = (b * brightness) / 255 return rgb(rr, gg, bb) end def draw() clear(self.background) font(self.fontName) var mode = self.scrollMode if !self.scrolling mode = "static" end var opts = { "mode": mode, "direction": self.direction, "entry": "offscreen", "whenFits": "static", "speed": self.speed, "gap": self.gap, "holdMs": self.hold } if self.colorMode == "rainbow" scroll_text( self.rainbow, 0xFFFFFF, opts ) elif self.colorMode == "blink" scroll_text( self.message, self.blinkColor(), opts ) elif self.colorMode == "fade" scroll_text( self.message, self.fadeColor(), opts ) else scroll_text( self.message, self.color, opts ) end end end return LEDTicker()