-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathframe_app.lua
More file actions
154 lines (123 loc) · 3.94 KB
/
frame_app.lua
File metadata and controls
154 lines (123 loc) · 3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
local data = require('data.min')
local battery = require('battery.min')
local camera = require('camera.min')
local code = require('code.min')
local plain_text = require('plain_text.min')
-- Phone to Frame flags
CAPTURE_SETTINGS_MSG = 0x0d
AUTO_EXP_SETTINGS_MSG = 0x0e
MANUAL_EXP_SETTINGS_MSG = 0x0f
TEXT_MSG = 0x0a
TAP_SUBS_MSG = 0x10
-- register the message parser so it's automatically called when matching data comes in
data.parsers[CAPTURE_SETTINGS_MSG] = camera.parse_capture_settings
data.parsers[AUTO_EXP_SETTINGS_MSG] = camera.parse_auto_exp_settings
data.parsers[MANUAL_EXP_SETTINGS_MSG] = camera.parse_manual_exp_settings
data.parsers[TEXT_MSG] = plain_text.parse_plain_text
data.parsers[TAP_SUBS_MSG] = code.parse_code
-- Frame to Phone flags
TAP_MSG = 0x09
AUTO_EXP_MSG = 0x12
function handle_tap()
rc, err = pcall(frame.bluetooth.send, string.char(TAP_MSG))
if rc == false then
-- send the error back on the stdout stream
print(err)
end
end
-- draw the current text on the display
function print_text()
local i = 0
for line in data.app_data[TEXT_MSG].string:gmatch("([^\n]*)\n?") do
if line ~= "" then
frame.display.text(line, 1, i * 60 + 1)
i = i + 1
end
end
end
function clear_display()
frame.display.text(" ", 1, 1)
frame.display.show()
frame.sleep(0.04)
end
function show_flash()
frame.display.bitmap(241, 191, 160, 2, 0, string.rep("\xFF", 400))
frame.display.bitmap(311, 121, 20, 2, 0, string.rep("\xFF", 400))
frame.display.show()
frame.sleep(0.04)
end
-- Main app loop
function app_loop()
clear_display()
local last_batt_update = 0
while true do
rc, err = pcall(
function()
-- process any raw data items, if ready (parse into take_photo, then clear data.app_data_block)
local items_ready = data.process_raw_items()
if items_ready > 0 then
if (data.app_data[CAPTURE_SETTINGS_MSG] ~= nil) then
-- visual indicator of capture and send
show_flash()
rc, err = pcall(camera.capture_and_send, data.app_data[CAPTURE_SETTINGS_MSG])
clear_display()
if rc == false then
print(err)
end
data.app_data[CAPTURE_SETTINGS_MSG] = nil
end
if (data.app_data[AUTO_EXP_SETTINGS_MSG] ~= nil) then
rc, err = pcall(camera.set_auto_exp_settings, data.app_data[AUTO_EXP_SETTINGS_MSG])
if rc == false then
print(err)
end
data.app_data[AUTO_EXP_SETTINGS_MSG] = nil
end
if (data.app_data[MANUAL_EXP_SETTINGS_MSG] ~= nil) then
rc, err = pcall(camera.set_manual_exp_settings, data.app_data[MANUAL_EXP_SETTINGS_MSG])
if rc == false then
print(err)
end
data.app_data[MANUAL_EXP_SETTINGS_MSG] = nil
end
if (data.app_data[TEXT_MSG] ~= nil and data.app_data[TEXT_MSG].string ~= nil) then
print_text()
frame.display.show()
data.app_data[TEXT_MSG] = nil
end
if (data.app_data[TAP_SUBS_MSG] ~= nil) then
if data.app_data[TAP_SUBS_MSG].value == 1 then
-- start subscription to tap events
print('subscribing for taps')
frame.imu.tap_callback(handle_tap)
else
-- cancel subscription to tap events
print('cancel subscription for taps')
frame.imu.tap_callback(nil)
end
data.app_data[TAP_SUBS_MSG] = nil
end
end
-- periodic battery level updates, 120s for a camera app
last_batt_update = battery.send_batt_if_elapsed(last_batt_update, 120)
if camera.is_auto_exp then
autoexp_result = camera.run_auto_exposure()
-- send the current auto exposure result back to the phone
camera.send_autoexp_result(autoexp_result)
end
frame.sleep(0.1)
end
)
-- Catch the break signal here and clean up the display
if rc == false then
-- send the error back on the stdout stream
print(err)
frame.display.text(" ", 1, 1)
frame.display.show()
frame.sleep(0.04)
break
end
end
end
-- run the main app loop
app_loop()