As this is my first post here, a quick intro: I am using ESP8266 and ESP32 for somewhat like 5 years now for various home automation stuff.
So far I always used the Arduino IDE to feed them but the compile-upload-run cycle is a bit longish and so it's not well suitable for playing around.
Searching for an interpreter language I stumbled across Annex32 and I am pretty impressed what's all in there.
Excellent job cicciocb!
After playing a bit with Annex32, I now tried to create the first "serious" application. I subscribes to 16 topics from a MQTT broker (ioBroker in my case) and displays 16 icons depending on the state of each topic.
I am using Annex32 CAN 1.51.5 LFS
In my first test I did the drawing of the bitmap directly in the message handler after receiving the MQTT message. That horribly failed and only a few of the icons were displayed.
After implementing a "ring buffer" where MQTT messages are written into and processed outside of the event handler, it got better.
After adding a 200ms delay between the subscriptions, at least all is displayed correctly after startup.
But when a display mode change happens in ioBroker (which can change a lot of the states at once), Annex is always missing some of the messages.
Am I doing something wrong or is it a problem of Annex32?
My code below.
Thanks in advance!
Armin
Code: [Local Link Removed for Guests]
tft.init 0
tft.fill 0
'touch.calib
testdata:
data "javascript/0/faces/val00", "Test00", "door"
data "javascript/0/faces/val01", "Test01", "door"
data "javascript/0/faces/val02", "Test02", "door"
data "javascript/0/faces/val03", "Test03", "door"
data "javascript/0/faces/val10", "Test10", "door"
data "javascript/0/faces/val11", "Test11", "door"
data "javascript/0/faces/val12", "Test12", "door"
data "javascript/0/faces/val13", "Test13", "door"
data "javascript/0/faces/val20", "Test20", "door"
data "javascript/0/faces/val21", "Test21", "door"
data "javascript/0/faces/val22", "Test22", "door"
data "javascript/0/faces/val23", "Test23", "door"
data "javascript/0/faces/val30", "Test30", "door"
data "javascript/0/faces/val31", "Test31", "door"
data "javascript/0/faces/val32", "Test32", "door"
data "javascript/0/faces/val33", "Test33", "door"
arrSize=15
dim states$(arrSize)
dim labels$(arrSize)
dim images$(arrSize)
dim values(arrSize)
restore testdata
for i=0 to arrSize
read states$(i), labels$(i), images$(i)
values(i)=-1
next i
queueSize=31
dim topics$(queueSize)
dim messages$(queueSize)
wptr=0
rptr=0
onmqtt mqttEvent
j=mqtt.setup("mqtt://172.28.2.12:1884", 0)
j=mqtt.connect("", "")
pause 500
for i=0 to arrSize
s$=states$(i)
j=mqtt.subscribe(s$, 0)
pause 200
next i
while 1=1
if rptr<>wptr then
's$=time$+" Topic: "+topics$(rptr)+" Message:"+messages$(rptr)
'wlog s$
for i=0 to arrSize
if topics$(rptr)=states$(i) then
j=val(messages$(rptr))
if values(i)<>j then
values(i)=j
drawPic i
end if
exit for
end if
next i
if rptr>=queueSize then rptr=0 else rptr=rptr+1
end if
pause 10
wend
wait
sub drawPic(picToDraw)
k=values(picToDraw)
s$="/"+images$(picToDraw)+chr$(48+k)+".bmp"
x=(picToDraw mod 4)*60
y=(picToDraw \ 4)*80
tft.bmp s$, x, y
if k=0 then
tft.rect x, y+60, 60, 20, tft.rgb(76, 231, 60), 1
else
tft.rect x, y+60, 60, 20, tft.rgb(204, 46, 80), 1
end if
tft.text.color tft.rgb(0, 0, 0)
tft.text.align align_top_mid
tft.text.draw labels$(i), x+30, y+60, 2
end sub
mqttEvent:
if mqtt.message$<>"" then
topics$(wptr)=mqtt.topic$
messages$(wptr)=mqtt.message$
if wptr>=queueSize then wptr=0 else wptr=wptr+1
end if
return