Z
@seb Sure. I'll share it here. Like I said it is very quick and dirty. It accepts an OSC message with only one variable (integer or float) of the form:
'/adress1, if, value'
integer (i) should also work.
I do not parse the address tag(s). Also, in a normal OSC message multiple type tags can be used in one message, like: '/adress1, if, intval, floatval'
That is not implemented.
import socket
import time
import struct
import pycom
pycom.heartbeat(False)
def readFloat(data):
if(len(data)<4):
print("Error: too few bytes for float", data, len(data))
rest = data
float = 0
else:
float = struct.unpack(">f", data[0:4])[0]
rest = data[4:]
return float
def readInt(data):
if(len(data)<4):
print("Error: too few bytes for int", data, len(data))
rest = data
integer = 0
else:
integer = struct.unpack(">i", data[0:4])[0]
rest = data[4:]
return integer
def getAdrVal(msg):
if b',f' in msg:
l = msg.find(b',f')
vals = msg[l+4:]
adress = msg[1:l-1]
val = readFloat(vals)
#print(adress,':',int(400*readFloat(val)))
elif b',i' in msg:
l = msg.find(b',i')
vals = msg[l+4:]
adress = msg[1:l-1]
val = readInt(vals)
else:
print('not implemented')
val = 0
adress = ''
return(adress, int(200*val))
# UDP socket server
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.setblocking(True)
serversocket.bind(('0.0.0.0', 9000)) # only bind, no accept like in TCP
print('OSC server started')
red, green, blue = 0,255,0
while True:
data, src = serversocket.recvfrom(1024)
if data:
#print(data)
adrVal = getAdrVal(data)
if b'Lo' in adrVal[0]:red = min(adrVal[1],255)
if b'Mid' in adrVal[0]:green = min(adrVal[1],255)
if b'Hi' in adrVal[0]:blue = min(adrVal[1],255)
pycom.rgbled(red*256*256 + green*256 + blue)