Add new volume and memory functions
dblume

dblume commited on 2024-03-02 13:53:06
Showing 4 changed files, with 54 additions and 22 deletions.

... ...
@@ -15,19 +15,23 @@ Clicking the link will take you directly to a confirmation page for getting the
15 15
 
16 16
 # Getting the project
17 17
 
18
-You can get a copy of this project by clicking on the
19
-[ZIP](https://git.dlma.com/dxb_channel.git/zipball/main)
20
-or [TAR](https://git.dlma.com/dxb_channel.git/tarball/main) buttons
21
-near the top right of the GitList web page.
18
+At [git.dlma.com](https://git.dlma.com/dxb_channel.git) click Download and
19
+select Download ZIP or Download TAR.
22 20
 
23 21
 If you're me, and you want to contribute to the repo, then you can clone it like so:
24 22
 
25
-    git clone ssh://USERNAME@dlma.com/~/git/dxb_channel.git
23
+    git clone ssh://$USER@dlma.com/~/git/dxb_channel.git
26 24
 
27 25
 ## Building it
28 26
 
29 27
 [Ensure you can sideload a dev channel](https://sdkdocs.roku.com/display/sdkdoc/Loading+and+Running+Your+Application).
30 28
 
29
+It is convenient to set environment variables `$ROKU_DEV_TARGET` and `$DEVPASSWORD` in a
30
+local file ".env". For example:
31
+
32
+    ROKU_DEV_TARGET=192.168.1.2
33
+    DEVPASSWORD=mooltipass
34
+
31 35
 ### CLI
32 36
 
33 37
 Running make will build and deploy if you have `$ROKU_DEV_TARGET` and `$DEVPASSWORD` set.
... ...
@@ -40,23 +44,21 @@ You can automatically make and deploy with each changed file with the following
40 44
 
41 45
 ### VS Code
42 46
 
43
-VS Code can also use the Makefile with [VC Code Makefile Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.makefile-tools).
44
-You can set environment variables `$ROKU_DEV_TARGET` and `$DEVPASSWORD` in a file ".env". For example:
45
-
46
-    ROKU_DEV_TARGET=192.168.1.2
47
-    DEVPASSWORD=mooltipass
47
+VS Code can also use the Makefile with
48
+[VC Code Makefile Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.makefile-tools).
48 49
 
49 50
 Use dxb\_channel.code-workspace as your workspace file for the project.
50 51
 
51 52
 ### Sublime Text
52 53
 
53
-See the "build\_systems" command in dxb\_channel.sublime-project to see how the channel is zipped and deployed.
54
+See the "build\_systems" command in dxb\_channel.sublime-project to see how
55
+the channel is zipped and deployed.
54 56
 
55 57
 ## Experimenting
56 58
 
57 59
 The code in [`components/testtask.brs`](https://git.dlma.com/dxb_channel.git/blob/main/components/testtask.brs)
58
-is run every time the OK button is pressed (while the "Test Output" pane has focus).
59
-That's a good place to experiment with new code.
60
+is run every time the OK button is pressed (while the "Test Output" pane has
61
+focus).  That's a good place to experiment with new code.
60 62
 
61 63
 # Is it any good?
62 64
 
... ...
@@ -2,10 +2,19 @@ sub init()
2 2
     m.top.functionName = "executeTask"
3 3
 end sub
4 4
 
5
-function getDeviceInfo(deviceInfo as object) as Object
5
+function getDeviceInfo(deviceInfo as object, lastExit as String) as Object
6 6
     ' Try to get various info from an ECP call
7 7
     aa = {}
8
-    aa["RIDA"] = deviceInfo.GetRIDA()
8
+
9
+    ' Getting exit_code here may be a dupe of Launch Param LastExitOrTerminationReason
10
+    am = CreateObject("roAppManager")
11
+    if FindMemberFunction(am, "GetLastExitInfo") <> invalid:
12
+        lastExitInfo = CreateObject("roAppManager").GetLastExitInfo()
13
+        if lastExitInfo <> invalid and lastExitInfo.exit_code <> lastExit:
14
+            aa["exit code"] = Mid(lastExitInfo.exit_code, 6) + " at " + Mid(lastExitInfo.timestamp, 12, 8)
15
+        endif
16
+    endif
17
+
9 18
     print "Client ID = " deviceInfo.GetChannelClientId()
10 19
     request = CreateObject("roUrlTransfer")
11 20
     request.SetUrl("http://localhost:8060/query/device-info")
... ...
@@ -35,14 +44,14 @@ function getDeviceInfo(deviceInfo as object) as Object
35 44
         end if
36 45
         aa["friendly name"] = deviceInfo.GetFriendlyName()
37 46
         deets = deviceInfo.GetModelDetails()
38
-        aa["model"] = deviceInfo.GetModel() + " (" + deets["VendorName"] + " " ++ deets["ModelNumber"] + ")"
47
+        aa["model"] = deviceInfo.GetModel() + " (" + deets.VendorName + " " + deets.ModelNumber + ")"
39 48
         return aa
40 49
     end if
41 50
     ' That did not work, so make a custom one.
42 51
     deets = deviceInfo.GetModelDetails()
43
-    aa["model"] = deviceInfo.GetModel() + " (" + deets["VendorName"] + " " ++ deets["ModelNumber"] + ")"
52
+    aa.model = deviceInfo.GetModel() + " (" + deets.VendorName + " " + deets.ModelNumber + ")"
44 53
     mmrb = deviceInfo.GetOSVersion()  ' major minor revision build
45
-    aa["firmware version"] = mmrb["major"]+"."+mmrb["minor"] +"."+mmrb["revision"]+" build "+mmrb["build"]
54
+    aa["firmware version"] = mmrb.major+"."+mmrb.minor+"."+mmrb.revision+" build "+mmrb.build
46 55
     aa["friendly name"] = deviceInfo.GetFriendlyName()
47 56
     return aa
48 57
 end function
... ...
@@ -58,7 +67,7 @@ function executeTask() as void
58 67
     ' m.top.updateText = "devID " + CreateObject("roAppInfo").GetDevID()
59 68
 
60 69
     deviceInfo = CreateObject("roDeviceInfo")
61
-    infoaa = getDeviceInfo(deviceInfo)
70
+    infoaa = getDeviceInfo(deviceInfo, aaRunParams.lastExitOrTerminationReason)
62 71
     if infoaa <> invalid:
63 72
         for each key in infoaa.Keys()
64 73
             val = infoaa[key]
... ...
@@ -97,7 +106,10 @@ function executeTask() as void
97 106
     success = deviceInfo.EnableInternetStatusEvent(true)
98 107
     if not success then m.top.updateTextLower = "EnableInternetStatusEvent failure"
99 108
     success = deviceInfo.EnableLowGeneralMemoryEvent(true)
100
-    if not success then m.top.updateTextLower = "EnableLowGeneralMemoryEvent failure"
109
+    if FindMemberFunction(deviceInfo, "EnableAudioOutputEvent") <> invalid:
110
+        success = deviceInfo.EnableAudioOutputEvent(true, "all")
111
+        if not success then m.top.updateTextLower = "EnableAudioOutputEvent failure"
112
+    endif
101 113
 
102 114
     while(true)
103 115
         msg = wait(0, port)
... ...
@@ -145,6 +157,12 @@ function executeTask() as void
145 157
             if v <> invalid then m.top.updateTextLower = dt + " GeneralMemoryLevel " + v.toStr()
146 158
             v = aa.LookupCI("internetStatus")
147 159
             if v <> invalid then m.top.updateTextLower = dt + " InternetStatus " + v.toStr()
160
+            v = aa.LookupCI("audioOutputEvent")
161
+            if v <> invalid then
162
+                m.top.updateTextLower = dt + " audioOutput " + v.toStr()
163
+                vol = aa.LookupCI("volume")
164
+                if vol <> invalid then m.top.updateTextLower = dt + " volume = " + vol.toStr()
165
+            end if
148 166
         elseif msgType = "roInputEvent"
149 167
             info = msg.GetInfo()
150 168
             m.top.updateTextLower = dt + " Input " + FormatJSON(info)
... ...
@@ -77,4 +77,16 @@ function executeTest() as void
77 77
     else
78 78
         m.top.updateText = "AsyncPostFromString failed"
79 79
     end if
80
+
81
+    appMemMon = CreateObject("roAppMemoryMonitor")
82
+    if appMemMon <> invalid:
83
+        m.top.updateText = "roAppMemoryMonitor.GetChannelMemoryLimit"
84
+        m.top.updateText = "  Available Memory MiB = " + (appMemMon.GetChannelAvailableMemory() / 1024).ToStr() + " (" + appMemMon.GetMemoryLimitPercent().ToStr() + "% used)"
85
+        if FindMemberFunction(appMemMon, "GetChannelMemoryLimit") <> invalid:
86
+            ' printAA(appMemMon.GetChannelMemoryLimit())
87
+            memFields = appMemMon.GetChannelMemoryLimit()
88
+            m.top.updateText = "  maxForegroundMemory MiB = " + (memFields.maxForegroundMemory / 1024).ToStr()
89
+            m.top.updateText = "  maxBackgroundMemory MiB = " + (memFields.maxBackgroundMemory / 1024).ToStr()
90
+        endif
91
+    endif
80 92
 end function
... ...
@@ -1,7 +1,7 @@
1 1
 title=dxb
2 2
 major_version=0
3
-minor_version=6
4
-build_version=2
3
+minor_version=7
4
+build_version=0
5 5
 ui_resolutions=fhd
6 6
 mm_icon_focus_hd=pkg:/images/mm_icon_focus_hd.png
7 7
 mm_icon_focus_sd=pkg:/images/mm_icon_focus_sd.png
8 8