David Blume commited on 2020-03-06 23:03:37
Showing 16 changed files, with 549 additions and 0 deletions.
| ... | ... |
@@ -0,0 +1,21 @@ |
| 1 |
+The MIT License (MIT) |
|
| 2 |
+ |
|
| 3 |
+Copyright (c) 2016 David Blume |
|
| 4 |
+ |
|
| 5 |
+Permission is hereby granted, free of charge, to any person obtaining a copy |
|
| 6 |
+of this software and associated documentation files (the "Software"), to deal |
|
| 7 |
+in the Software without restriction, including without limitation the rights |
|
| 8 |
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
| 9 |
+copies of the Software, and to permit persons to whom the Software is |
|
| 10 |
+furnished to do so, subject to the following conditions: |
|
| 11 |
+ |
|
| 12 |
+The above copyright notice and this permission notice shall be included in all |
|
| 13 |
+copies or substantial portions of the Software. |
|
| 14 |
+ |
|
| 15 |
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
| 16 |
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
| 17 |
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
| 18 |
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
| 19 |
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
| 20 |
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
| 21 |
+SOFTWARE. |
| ... | ... |
@@ -0,0 +1,13 @@ |
| 1 |
+.PHONY: clean |
|
| 2 |
+ZIPFILE=test.zip |
|
| 3 |
+ |
|
| 4 |
+all: $(ZIPFILE) |
|
| 5 |
+ curl -s -S --user rokudev:$(DEVPASSWORD) --digest -F "archive=@$(ZIPFILE)" \ |
|
| 6 |
+ -F "mysubmit=Install" --output /dev/null --write-out "%{http_code}" \
|
|
| 7 |
+ http://$(ROKU_DEV_TARGET)/plugin_install |
|
| 8 |
+ |
|
| 9 |
+$(ZIPFILE): manifest source/*.brs components/*.xml components/*.brs images/*.png |
|
| 10 |
+ zip $@ manifest source/*.brs components/*.xml components/*.brs images/*.png |
|
| 11 |
+ |
|
| 12 |
+clean: |
|
| 13 |
+ rm $(ZIPFILE) |
| ... | ... |
@@ -0,0 +1,28 @@ |
| 1 |
+# dxb Channel |
|
| 2 |
+ |
|
| 3 |
+dxb Channel is a test [channel for Roku devices](https://sdkdocs.roku.com/display/sdkdoc/SceneGraph+Samples). |
|
| 4 |
+It uses SceneGraph and the BrightScript language. |
|
| 5 |
+ |
|
| 6 |
+# Getting the project |
|
| 7 |
+ |
|
| 8 |
+You can get a copy of this project by clicking on the |
|
| 9 |
+[ZIP](http://git.dlma.com/dxb_channel.git/zipball/master) |
|
| 10 |
+or [TAR](http://git.dlma.com/dxb_channel.git/tarball/master) buttons |
|
| 11 |
+near the top right of the GitList web page. |
|
| 12 |
+ |
|
| 13 |
+If you're me, and you want to contribute to the repo, then you can clone it like so: |
|
| 14 |
+ |
|
| 15 |
+ git clone ssh://USERNAME@dlma.com/~/git/dxb_channel.git |
|
| 16 |
+ |
|
| 17 |
+# Building it |
|
| 18 |
+ |
|
| 19 |
+[Ensure you can sideload a dev channel](https://sdkdocs.roku.com/display/sdkdoc/Loading+and+Running+Your+Application). |
|
| 20 |
+Then see the "build\_systems" command in dxb\_channel.sublime-project to see how the channel is zipped and deployed. |
|
| 21 |
+ |
|
| 22 |
+# Is it any good? |
|
| 23 |
+ |
|
| 24 |
+[Yes](https://news.ycombinator.com/item?id=3067434). |
|
| 25 |
+ |
|
| 26 |
+# Licence |
|
| 27 |
+ |
|
| 28 |
+This software uses the [MIT license](http://git.dlma.com/dxb_channel.git/blob/master/LICENSE.txt). |
| ... | ... |
@@ -0,0 +1,170 @@ |
| 1 |
+function init() |
|
| 2 |
+ m.title = m.top.findNode("title")
|
|
| 3 |
+ m.title.font.size=248 |
|
| 4 |
+ m.title.color="0x62C7FF18" |
|
| 5 |
+ |
|
| 6 |
+ title_font_size = 34 |
|
| 7 |
+ font_size = 32 |
|
| 8 |
+ m.updates = m.top.findNode("updates")
|
|
| 9 |
+ m.updates.font.size=font_size |
|
| 10 |
+ m.updates.color="0x52C7F8FF" |
|
| 11 |
+ m.updates.lineSpacing = 8 |
|
| 12 |
+ |
|
| 13 |
+ m.updates_title = m.top.findNode("updates_title")
|
|
| 14 |
+ m.updates_title.font.size=title_font_size |
|
| 15 |
+ m.updates_title.color="0x62E7FFFF" |
|
| 16 |
+ m.updates_title.text = "Launch Parameters" |
|
| 17 |
+ |
|
| 18 |
+ m.updates_lower = m.top.findNode("updates_lower")
|
|
| 19 |
+ m.updates_lower.font.size=font_size |
|
| 20 |
+ m.updates_lower.color="0x52C7F8FF" |
|
| 21 |
+ m.updates_lower.text = "" |
|
| 22 |
+ m.updates_lower.lineSpacing = 8 |
|
| 23 |
+ |
|
| 24 |
+ m.updates_lower_title = m.top.findNode("updates_lower_title")
|
|
| 25 |
+ m.updates_lower_title.font.size=title_font_size |
|
| 26 |
+ m.updates_lower_title.color="0x62E7FFFF" |
|
| 27 |
+ m.updates_lower_title.text = "Events" |
|
| 28 |
+ |
|
| 29 |
+ m.updates_right = m.top.findNode("updates_right")
|
|
| 30 |
+ m.updates_right.font.size=font_size |
|
| 31 |
+ m.updates_right.color="0x52C7F8FF" |
|
| 32 |
+ m.updates_right.lineSpacing = 8 |
|
| 33 |
+ |
|
| 34 |
+ m.updates_right_title = m.top.findNode("updates_right_title")
|
|
| 35 |
+ m.updates_right_title.font.size=title_font_size |
|
| 36 |
+ m.updates_right_title.color="0x62E7FFFF" |
|
| 37 |
+ m.updates_right_title.text = "Test Output" |
|
| 38 |
+ |
|
| 39 |
+ m.title_color = "0x20204080" |
|
| 40 |
+ m.title_focus_color = "0x4060B0A0" |
|
| 41 |
+ m.tl_rect = m.top.findNode("updates_title_rect")
|
|
| 42 |
+ m.tl_rect.color = m.title_color |
|
| 43 |
+ m.bl_rect = m.top.findNode("updates_lower_title_rect")
|
|
| 44 |
+ m.bl_rect.color = m.title_color |
|
| 45 |
+ m.r_rect = m.top.findNode("updates_right_title_rect")
|
|
| 46 |
+ m.r_rect.color = m.title_color |
|
| 47 |
+ label_color = "0x00002080" |
|
| 48 |
+ r = m.top.findNode("updates_rect")
|
|
| 49 |
+ r.color = label_color |
|
| 50 |
+ r = m.top.findNode("updates_lower_rect")
|
|
| 51 |
+ r.color = label_color |
|
| 52 |
+ r = m.top.findNode("updates_right_rect")
|
|
| 53 |
+ r.color = label_color |
|
| 54 |
+ |
|
| 55 |
+ m.myTask = CreateObject("roSGNode", "MyTask")
|
|
| 56 |
+ m.myTask.ObserveField("updateText", "onUpdateText")
|
|
| 57 |
+ m.myTask.ObserveField("updateTextLower", "onUpdateTextLower")
|
|
| 58 |
+ m.myTask.ObserveField("updateTextRight", "onUpdateTextRight")
|
|
| 59 |
+ m.myTask.control = "RUN" |
|
| 60 |
+ |
|
| 61 |
+ texttimer = m.top.findNode("textTimer")
|
|
| 62 |
+ texttimer.observeField("fire", "timerUpdate")
|
|
| 63 |
+ texttimer.control = "start" |
|
| 64 |
+ |
|
| 65 |
+ m.updates_lower_array = CreateObject("roArray", 10, true)
|
|
| 66 |
+ |
|
| 67 |
+ m.focus_rect = 3 |
|
| 68 |
+ doUpdateFocus() |
|
| 69 |
+ |
|
| 70 |
+ m.top.setFocus(true) |
|
| 71 |
+end function |
|
| 72 |
+ |
|
| 73 |
+function onUpdateText() as void |
|
| 74 |
+ if m.updates.text.Len() = 0 |
|
| 75 |
+ m.updates.text = m.myTask.updateText |
|
| 76 |
+ else |
|
| 77 |
+ m.updates.text = m.updates.text + chr(10) + m.myTask.updateText |
|
| 78 |
+ end if |
|
| 79 |
+end function |
|
| 80 |
+ |
|
| 81 |
+function onUpdateTextLower() as void |
|
| 82 |
+ updateTextLower(m.myTask.updateTextLower) |
|
| 83 |
+end function |
|
| 84 |
+ |
|
| 85 |
+function updateTextLower(s as String) as void |
|
| 86 |
+ while m.updates_lower_array.Count() > 9 |
|
| 87 |
+ m.updates_lower_array.Shift() |
|
| 88 |
+ end while |
|
| 89 |
+ m.updates_lower_array.Push(s) |
|
| 90 |
+ |
|
| 91 |
+ m.updates_lower.text = m.updates_lower_array.Join(chr(10)) |
|
| 92 |
+end function |
|
| 93 |
+ |
|
| 94 |
+function onUpdateTextRight() as void |
|
| 95 |
+ if m.updates_right.text.Len() = 0 |
|
| 96 |
+ m.updates_right.text = m.myTask.updateTextRight |
|
| 97 |
+ else |
|
| 98 |
+ m.updates_right.text = m.updates_right.text + chr(10) + m.myTask.updateTextRight |
|
| 99 |
+ end if |
|
| 100 |
+end function |
|
| 101 |
+ |
|
| 102 |
+function onKeyEvent(key as String, press as Boolean) as Boolean |
|
| 103 |
+ handled = false |
|
| 104 |
+ if press then |
|
| 105 |
+ if (key = "back") then |
|
| 106 |
+ handled = false |
|
| 107 |
+ else |
|
| 108 |
+ update_ui = false |
|
| 109 |
+ if key = "up" |
|
| 110 |
+ if m.focus_rect = 2: |
|
| 111 |
+ m.focus_rect = 1 |
|
| 112 |
+ elseif m.focus_rect = 3 |
|
| 113 |
+ m.focus_rect = 0 |
|
| 114 |
+ update_ui = true |
|
| 115 |
+ endif |
|
| 116 |
+ elseif key = "right" |
|
| 117 |
+ if m.focus_rect = 0: |
|
| 118 |
+ m.focus_rect = 1 |
|
| 119 |
+ update_ui = true |
|
| 120 |
+ elseif m.focus_rect = 3 |
|
| 121 |
+ m.focus_rect = 2 |
|
| 122 |
+ update_ui = true |
|
| 123 |
+ endif |
|
| 124 |
+ elseif key = "down" |
|
| 125 |
+ if m.focus_rect = 0: |
|
| 126 |
+ m.focus_rect = 3 |
|
| 127 |
+ update_ui = true |
|
| 128 |
+ elseif m.focus_rect = 1 |
|
| 129 |
+ m.focus_rect = 2 |
|
| 130 |
+ endif |
|
| 131 |
+ elseif key = "left" |
|
| 132 |
+ if m.focus_rect = 1: |
|
| 133 |
+ m.focus_rect = 0 |
|
| 134 |
+ update_ui = true |
|
| 135 |
+ elseif m.focus_rect = 2 |
|
| 136 |
+ m.focus_rect = 3 |
|
| 137 |
+ update_ui = true |
|
| 138 |
+ endif |
|
| 139 |
+ end if |
|
| 140 |
+ if update_ui |
|
| 141 |
+ doUpdateFocus() |
|
| 142 |
+ endif |
|
| 143 |
+ dt = Mid(CreateObject("roDateTime").ToISOString(), 15, 5)
|
|
| 144 |
+ updateTextLower(dt + " " + key) |
|
| 145 |
+ handled = true |
|
| 146 |
+ end if |
|
| 147 |
+ end if |
|
| 148 |
+ return handled |
|
| 149 |
+end function |
|
| 150 |
+ |
|
| 151 |
+sub doUpdateFocus() |
|
| 152 |
+ if m.focus_rect = 0 |
|
| 153 |
+ m.tl_rect.color = m.title_focus_color |
|
| 154 |
+ m.bl_rect.color = m.title_color |
|
| 155 |
+ m.r_rect.color = m.title_color |
|
| 156 |
+ elseif m.focus_rect = 1 or m.focus_rect = 2 |
|
| 157 |
+ m.tl_rect.color = m.title_color |
|
| 158 |
+ m.bl_rect.color = m.title_color |
|
| 159 |
+ m.r_rect.color = m.title_focus_color |
|
| 160 |
+ elseif m.focus_rect = 3 |
|
| 161 |
+ m.tl_rect.color = m.title_color |
|
| 162 |
+ m.bl_rect.color = m.title_focus_color |
|
| 163 |
+ m.r_rect.color = m.title_color |
|
| 164 |
+ end if |
|
| 165 |
+end sub |
|
| 166 |
+ |
|
| 167 |
+sub timerUpdate() |
|
| 168 |
+ ' Not needed, but nice to have as an example. |
|
| 169 |
+ ' print "timerUpdate called." |
|
| 170 |
+end sub |
| ... | ... |
@@ -0,0 +1,108 @@ |
| 1 |
+<?xml version="1.0" encoding="utf-8" ?> |
|
| 2 |
+<component name="dxb" extends="Scene"> |
|
| 3 |
+ <children> |
|
| 4 |
+ <Label id="title" |
|
| 5 |
+ text="dxb" |
|
| 6 |
+ font = "font:LargeBoldSystemFont" |
|
| 7 |
+ width="1000" |
|
| 8 |
+ height="100" |
|
| 9 |
+ translation = "[860, 40]" |
|
| 10 |
+ horizAlign="right" |
|
| 11 |
+ vertAlign="top" /> |
|
| 12 |
+ |
|
| 13 |
+ <Rectangle id="updates_title_rect" |
|
| 14 |
+ width="900" |
|
| 15 |
+ height="51" |
|
| 16 |
+ translation = "[50,40]" |
|
| 17 |
+ color = "0x20600040" > |
|
| 18 |
+ <Label id="updates_title" |
|
| 19 |
+ text="" |
|
| 20 |
+ font = "font:SmallBoldSystemFont" |
|
| 21 |
+ width="880" |
|
| 22 |
+ height="40" |
|
| 23 |
+ translation = "[10,10]" |
|
| 24 |
+ horizAlign="left" |
|
| 25 |
+ vertAlign="top" |
|
| 26 |
+ wrap="true" /> |
|
| 27 |
+ </Rectangle> |
|
| 28 |
+ <Rectangle id="updates_rect" |
|
| 29 |
+ width="900" |
|
| 30 |
+ height="440" |
|
| 31 |
+ translation = "[50,90]" |
|
| 32 |
+ color = "0x00800040" > |
|
| 33 |
+ <Label id="updates" |
|
| 34 |
+ text="" |
|
| 35 |
+ width="880" |
|
| 36 |
+ height="420" |
|
| 37 |
+ translation = "[10,10]" |
|
| 38 |
+ horizAlign="left" |
|
| 39 |
+ vertAlign="top" |
|
| 40 |
+ wrap="true" /> |
|
| 41 |
+ </Rectangle> |
|
| 42 |
+ |
|
| 43 |
+ <Rectangle id="updates_lower_title_rect" |
|
| 44 |
+ width="900" |
|
| 45 |
+ height="50" |
|
| 46 |
+ translation = "[50,540]" |
|
| 47 |
+ color = "0x40203040" > |
|
| 48 |
+ <Label id="updates_lower_title" |
|
| 49 |
+ text="updates_lower_title text" |
|
| 50 |
+ font = "font:SmallBoldSystemFont" |
|
| 51 |
+ width="880" |
|
| 52 |
+ height="40" |
|
| 53 |
+ translation = "[10,10]" |
|
| 54 |
+ horizAlign="left" |
|
| 55 |
+ vertAlign="top" |
|
| 56 |
+ wrap="true" /> |
|
| 57 |
+ </Rectangle> |
|
| 58 |
+ <Rectangle id="updates_lower_rect" |
|
| 59 |
+ width="900" |
|
| 60 |
+ height="440" |
|
| 61 |
+ translation = "[50,590]" |
|
| 62 |
+ color = "0x60202040" > |
|
| 63 |
+ <Label id="updates_lower" |
|
| 64 |
+ text="updates_lower text" |
|
| 65 |
+ width="880" |
|
| 66 |
+ height="420" |
|
| 67 |
+ translation = "[10,10]" |
|
| 68 |
+ horizAlign="left" |
|
| 69 |
+ vertAlign="top" |
|
| 70 |
+ wrap="true" /> |
|
| 71 |
+ </Rectangle> |
|
| 72 |
+ |
|
| 73 |
+ <Rectangle id="updates_right_title_rect" |
|
| 74 |
+ width="900" |
|
| 75 |
+ height="51" |
|
| 76 |
+ translation = "[960,40]" |
|
| 77 |
+ color = "0x20004040" > |
|
| 78 |
+ <Label id="updates_right_title" |
|
| 79 |
+ text="" |
|
| 80 |
+ font = "font:SmallBoldSystemFont" |
|
| 81 |
+ width="880" |
|
| 82 |
+ height="40" |
|
| 83 |
+ translation = "[10,10]" |
|
| 84 |
+ horizAlign="left" |
|
| 85 |
+ vertAlign="top" |
|
| 86 |
+ wrap="true" /> |
|
| 87 |
+ </Rectangle> |
|
| 88 |
+ <Rectangle id="updates_right_rect" |
|
| 89 |
+ width="900" |
|
| 90 |
+ height="940" |
|
| 91 |
+ translation = "[960,90]" |
|
| 92 |
+ color = "0x00002040" > |
|
| 93 |
+ <Label id="updates_right" |
|
| 94 |
+ width="880" |
|
| 95 |
+ height="920" |
|
| 96 |
+ translation = "[10,10]" |
|
| 97 |
+ horizAlign="left" |
|
| 98 |
+ vertAlign="top" |
|
| 99 |
+ wrap="true" /> |
|
| 100 |
+ </Rectangle> |
|
| 101 |
+ |
|
| 102 |
+ <Timer |
|
| 103 |
+ id = "textTimer" |
|
| 104 |
+ repeat = "true" |
|
| 105 |
+ duration = "4" /> |
|
| 106 |
+ </children> |
|
| 107 |
+<script type="text/brightscript" uri="pkg:/components/dxb.brs" /> |
|
| 108 |
+</component> |
| ... | ... |
@@ -0,0 +1,117 @@ |
| 1 |
+sub init() |
|
| 2 |
+ m.top.functionName = "executeTask" |
|
| 3 |
+end sub |
|
| 4 |
+ |
|
| 5 |
+function getDeviceId(deviceInfo as object) as String |
|
| 6 |
+ ' Try to get the Serial Number for an ECP call |
|
| 7 |
+ request = CreateObject("roUrlTransfer")
|
|
| 8 |
+ request.SetUrl("http://localhost:8060/query/device-info")
|
|
| 9 |
+ root = CreateObject("roXMLElement")
|
|
| 10 |
+ if root.Parse(request.GetToString()) then |
|
| 11 |
+ serialnums = root.GetNamedElements("serial-number")
|
|
| 12 |
+ if serialnums.Count() > 0 |
|
| 13 |
+ model = root.GetNamedElements("model-number")
|
|
| 14 |
+ if model.Count() > 0 |
|
| 15 |
+ return serialnums[0].GetText() + ":" + model[0].GetText() |
|
| 16 |
+ end if |
|
| 17 |
+ end if |
|
| 18 |
+ end if |
|
| 19 |
+ ' That did not work, so make a custom one. |
|
| 20 |
+ clientID = Right(deviceInfo.GetChannelClientId(), 6) |
|
| 21 |
+ modelID = deviceInfo.GetModel() |
|
| 22 |
+ return clientID + "-" + modelID |
|
| 23 |
+end function |
|
| 24 |
+ |
|
| 25 |
+function executeTask() as void |
|
| 26 |
+ |
|
| 27 |
+ am = CreateObject("roAppManager")
|
|
| 28 |
+ aaRunParams = am.GetRunParams() |
|
| 29 |
+ for each key in aaRunParams |
|
| 30 |
+ val = aaRunParams[key] |
|
| 31 |
+ m.top.updateText = key + " = " + val.ToStr() |
|
| 32 |
+ print "roAppManager.runParams " key " = " val |
|
| 33 |
+ end for |
|
| 34 |
+ |
|
| 35 |
+ deviceInfo = CreateObject("roDeviceInfo")
|
|
| 36 |
+ port = CreateObject("roMessagePort")
|
|
| 37 |
+ deviceInfo.SetMessagePort(port) |
|
| 38 |
+ |
|
| 39 |
+ success = deviceInfo.EnableLinkStatusEvent(true) |
|
| 40 |
+ if not success m.top.updateTextLower = "EnableLinkStatusEvent failure" |
|
| 41 |
+ success = deviceInfo.EnableAudioDestinationEvent(true) |
|
| 42 |
+ if not success then m.top.updateTextLower = "EnableAudioDestinationEvent failure" |
|
| 43 |
+ success = deviceInfo.EnableAudioGuideChangedEvent(true) |
|
| 44 |
+ if not success then m.top.updateTextLower = "EnableAudioGuideChangedEvent failure" |
|
| 45 |
+ success = deviceInfo.EnableAppFocusEvent(true) |
|
| 46 |
+ if not success then m.top.updateTextLower = "EnableAppFocusEvent failure" |
|
| 47 |
+ success = deviceInfo.EnableCodecCapChangedEvent(true) |
|
| 48 |
+ if not success then m.top.updateTextLower = "EnableCodecCapChangedEvent failure" |
|
| 49 |
+ |
|
| 50 |
+ |
|
| 51 |
+ aaConnectionInfo = deviceInfo.GetConnectionInfo() |
|
| 52 |
+ for each key in aaConnectionInfo |
|
| 53 |
+ val = aaConnectionInfo[key] |
|
| 54 |
+ m.top.updateTextRight = key + " = " + val.ToStr() |
|
| 55 |
+ print "roDeviceInfo.ConnectionInfo " key " = " val |
|
| 56 |
+ end for |
|
| 57 |
+ |
|
| 58 |
+ while(true) |
|
| 59 |
+ msg = wait(0, port) |
|
| 60 |
+ msgType = type(msg) |
|
| 61 |
+ |
|
| 62 |
+ dt = Mid(CreateObject("roDateTime").ToISOString(), 15, 5)
|
|
| 63 |
+ |
|
| 64 |
+ if msgType = "roHdmiStatusEvent" |
|
| 65 |
+ aa = msg.GetInfo() |
|
| 66 |
+ v = aa.LookupCI("Plugged")
|
|
| 67 |
+ if v <> invalid |
|
| 68 |
+ m.top.updateTextLower = dt + " HDMI plugged " + v.toStr() |
|
| 69 |
+ print "HDMI plugged " v.toStr() |
|
| 70 |
+ end if |
|
| 71 |
+ elseif msgType = "roCECStatusEvent" |
|
| 72 |
+ aa = msg.GetInfo() |
|
| 73 |
+ v = aa.LookupCI("Active")
|
|
| 74 |
+ if v <> invalid |
|
| 75 |
+ m.top.updateTextLower = dt + " CEC Status " + v.toStr() |
|
| 76 |
+ print "CEC Status " v.toStr() |
|
| 77 |
+ end if |
|
| 78 |
+ elseif msgType = "roDeviceInfoEvent" |
|
| 79 |
+ aa = msg.GetInfo() |
|
| 80 |
+ v = aa.LookupCI("Mute")
|
|
| 81 |
+ if v <> invalid |
|
| 82 |
+ m.top.updateTextLower = dt + " Mute " + v.toStr() |
|
| 83 |
+ print "Mute " v.toStr() |
|
| 84 |
+ end if |
|
| 85 |
+ v = aa.LookupCI("Mode")
|
|
| 86 |
+ if v <> invalid |
|
| 87 |
+ m.top.updateTextLower = dt + " Mode " + v.toStr() |
|
| 88 |
+ print "Mode " v.toStr() |
|
| 89 |
+ end if |
|
| 90 |
+ v = aa.LookupCI("linkStatus")
|
|
| 91 |
+ if v <> invalid |
|
| 92 |
+ m.top.updateTextLower = dt + " LinkStatus " + v.toStr() |
|
| 93 |
+ print "LinkStatus " v.toStr() |
|
| 94 |
+ end if |
|
| 95 |
+ v = aa.LookupCI("audioGuideEnabled")
|
|
| 96 |
+ if v <> invalid |
|
| 97 |
+ m.top.updateTextLower = dt + " AudioGuide " + v.toStr() |
|
| 98 |
+ print "AudioGuide " v.toStr() |
|
| 99 |
+ end if |
|
| 100 |
+ v = aa.LookupCI("appFocused")
|
|
| 101 |
+ if v <> invalid |
|
| 102 |
+ m.top.updateTextLower = dt + " appFocused " + v.toStr() |
|
| 103 |
+ print "appFocused " v.toStr() |
|
| 104 |
+ end if |
|
| 105 |
+ v = aa.LookupCI("audioCodecCapabilityChanged")
|
|
| 106 |
+ if v <> invalid |
|
| 107 |
+ m.top.updateTextLower = dt + " audioCodecCapabilityChanged " + v.toStr() |
|
| 108 |
+ print "audioCodecCapabilityChanged " v.toStr() |
|
| 109 |
+ end if |
|
| 110 |
+ else |
|
| 111 |
+ m.top.updateTextLower = dt + " msgType " + msgType |
|
| 112 |
+ print "Unknown event msgType " v.toStr() |
|
| 113 |
+ end if |
|
| 114 |
+ |
|
| 115 |
+ end while |
|
| 116 |
+ |
|
| 117 |
+end function |
| ... | ... |
@@ -0,0 +1,12 @@ |
| 1 |
+<?xml version="1.0" encoding="utf-8" ?> |
|
| 2 |
+ |
|
| 3 |
+<component name="MyTask" extends="Task"> |
|
| 4 |
+ |
|
| 5 |
+<interface> |
|
| 6 |
+ <field id="updateText" type="string" value=""/> |
|
| 7 |
+ <field id="updateTextRight" type="string" value=""/> |
|
| 8 |
+ <field id="updateTextLower" type="string" value=""/> |
|
| 9 |
+</interface> |
|
| 10 |
+ |
|
| 11 |
+<script type="text/brightscript" uri="pkg:/components/mytask.brs"/> |
|
| 12 |
+</component> |
| ... | ... |
@@ -0,0 +1,41 @@ |
| 1 |
+{
|
|
| 2 |
+ "build_systems": |
|
| 3 |
+ [ |
|
| 4 |
+ {
|
|
| 5 |
+ "name": "Run", |
|
| 6 |
+ "linux": {
|
|
| 7 |
+ "shell_cmd": "make all", |
|
| 8 |
+ }, |
|
| 9 |
+ "working_dir": "$project_path" |
|
| 10 |
+ }, |
|
| 11 |
+ {
|
|
| 12 |
+ "name": "Zip", |
|
| 13 |
+ "working_dir": "$project_path", |
|
| 14 |
+ "windows": {
|
|
| 15 |
+ "cmd": "\"C:\\Program Files\\7-Zip\\7z.exe\" a -tzip \"$project_base_name.zip\" manifest source/*.* images" |
|
| 16 |
+ }, |
|
| 17 |
+ "osx": {
|
|
| 18 |
+ "shell_cmd": "zip \"$project_base_name.zip\" manifest source/*.* images/*.*" |
|
| 19 |
+ }, |
|
| 20 |
+ "linux": {
|
|
| 21 |
+ "shell_cmd": "zip \"$project_base_name.zip\" manifest source/*.* images/*.*" |
|
| 22 |
+ } |
|
| 23 |
+ } |
|
| 24 |
+ ], |
|
| 25 |
+ "folders": |
|
| 26 |
+ [ |
|
| 27 |
+ {
|
|
| 28 |
+ "path": ".", |
|
| 29 |
+ "file_exclude_patterns": |
|
| 30 |
+ [ |
|
| 31 |
+ "tags", |
|
| 32 |
+ "*.zip", |
|
| 33 |
+ "*.sublime-project" |
|
| 34 |
+ ], |
|
| 35 |
+ "folder_exclude_patterns": |
|
| 36 |
+ [ |
|
| 37 |
+ "obj" |
|
| 38 |
+ ], |
|
| 39 |
+ } |
|
| 40 |
+ ] |
|
| 41 |
+} |
| ... | ... |
@@ -0,0 +1,10 @@ |
| 1 |
+title=dxb |
|
| 2 |
+major_version=0 |
|
| 3 |
+minor_version=0 |
|
| 4 |
+build_version=2 |
|
| 5 |
+ui_resolutions=fhd |
|
| 6 |
+mm_icon_focus_hd=pkg:/images/mm_icon_focus_hd.png |
|
| 7 |
+mm_icon_focus_sd=pkg:/images/mm_icon_focus_sd.png |
|
| 8 |
+splash_screen_hd=pkg:/images/splash_screen_hd.png |
|
| 9 |
+splash_screen_sd=pkg:/images/splash_screen_sd.png |
|
| 10 |
+splash_min_time=0 |
| ... | ... |
@@ -0,0 +1,27 @@ |
| 1 |
+sub Main(launchParams) |
|
| 2 |
+ ' Just to test various ECP params |
|
| 3 |
+ print "Launch parameters:" |
|
| 4 |
+ for each key in launchParams |
|
| 5 |
+ print " " key "=" launchParams[key] |
|
| 6 |
+ end for |
|
| 7 |
+ |
|
| 8 |
+ ' Indicate this is a Roku SceneGraph application' |
|
| 9 |
+ screen = CreateObject("roSGScreen")
|
|
| 10 |
+ port = CreateObject("roMessagePort")
|
|
| 11 |
+ screen.SetMessagePort(port) |
|
| 12 |
+ |
|
| 13 |
+ ' Create a scene and load /components/dxb.xml' |
|
| 14 |
+ m.scene = screen.CreateScene("dxb")
|
|
| 15 |
+ screen.show() |
|
| 16 |
+ |
|
| 17 |
+ while(true) |
|
| 18 |
+ msg = wait(0, port) |
|
| 19 |
+ msgType = type(msg) |
|
| 20 |
+ print "dxb Main loop msgType = " msgType |
|
| 21 |
+ if msgType = "roSGScreenEvent" |
|
| 22 |
+ if msg.isScreenClosed() then return |
|
| 23 |
+ end if |
|
| 24 |
+ end while |
|
| 25 |
+ |
|
| 26 |
+end sub |
|
| 27 |
+ |
|
| 0 | 28 |