OSC, float32 und AVR gcc

Gast #2375603
Lesenswert?

Hallo!

Ich versuche gerade ein Interface zu programmieren, welches per UDP 
empfangene OSC (http://opensoundcontrol.org) Kommandos in definierte 
Aktionen im DMX-Universum umsetzt.

Dabei kommt z.B. ein Kommando /1/fader1 ,f xxxx zustande, dieses wird 
durch das Android/Iphone/Ipad-Tool TouchOSC 
(http://hexler.net/docs/touchosc) erzeugt.

Soweit ist das kein Problem, ich bekomm es aber nicht hin, die vier Byte 
lange Float zu einem ein Byte großem Integer zu wandeln, welches von DMX 
benötigt wird.

Ih habe also in 4 chars den per UDP empfangenen Wert
Buffer[0] bis Buffer[3]

die in
uint8_t dmx_value gewandelt werden müssen.

Dabei soll 0 der kleinste Float-Wert sein und 255 der größte. Ich weiß 
leider auch nicht, welche Werte TouchOSC liefert, meine aber das geht 
von 0.1 bis 1.0.

Kann mir jemand dabei helfen? Ich stehe auf dem Schlauch und komme 
einfach nicht mehr weiter...

Viele Grüße
Patrick
#2380775
Lesenswert?

Patrick schrieb:
> Ih habe also in 4 chars den per UDP empfangenen Wert

Wieso 4 Zeichen? Auf der verlinkten Web-Seite sieht es eher nach 8 
Zeichen aus (z.B. "0.588608"). Allerdings habe ich dort auf die Schnelle 
keine eindeutige Definition des Nachrichten-Formats gefunden. Als erstes 
musst du also mal 100%ig sicher abklären, in welchem Format du den 
Float-Wert denn nun tatsächlich geliefert bekommst.
Gast #2381393
Lesenswert?

Hallo Stefan,

per Wireshark habe ich am Ende der UDP-Nachricht 4 Zeichen, die sich je 
nach Faderposition in der App verändern, der Rest ist 0x00. Ich werde 
allerdings aus den 4 Zeichen bzw. der zugehörigen Hex-Werte nicht 
schlau, nur das bei Fader = unten alle Zeichen 0x00 sind.

Viele Grüße
Patrick
Gast #2381620
Lesenswert?

Folgende Werte werden gesendet
1
/  1  /  f  a  d  e  r  1           ,  f
2
2f:31:2f:66:61:64:65:72:31:00:00:00:2c:66:00:00:00:00:00:00  ganz unten 0
3
2f:31:2f:66:61:64:65:72:31:00:00:00:2c:66:00:00:3f:80:00:00  ganz oben 1.0
4
2f:31:2f:66:61:64:65:72:31:00:00:00:2c:66:00:00:3f:0a:da:2c  ca. mitte ~0.5
Gast #2382262
Lesenswert?

Danke! Habs wie folgt gelöst, hatte ich auch schon mindestens zweimal 
so, war nur die ganze Zeit ein Zeichen daneben :(
1
uint8_t osc_float_read(uint8_t startbyte)
2
{
3
  union U8f
4
  {
5
      uint8_t byte[4];
6
      float f;
7
  };
8

9
  union U8f u8f;
10
  u8f.byte[0] = eth_buffer[startbyte+3];
11
  u8f.byte[1] = eth_buffer[startbyte+2];
12
  u8f.byte[2] = eth_buffer[startbyte+1];
13
  u8f.byte[3] = eth_buffer[startbyte];
14

15
  uint8_t tmp = u8f.f/0.00392;
16

17
  return tmp;
18
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren