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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.