Hardware Abstraction Layer

aus dem DMXControl-Wiki

(Weitergeleitet von HAL)
Wechseln zu: Navigation, Suche

DMXControl soll in Version 3 einen HAL (Hardware Abstraction Layer, Hardwareabstraktionsschicht) bekommen. Dadurch vereinheitlicht sich die Ansteuerung der Geräte, da statt DMX-Werten mit Eigenschaften wie "Farbe", "Gobo", "Helligkeit", "Position" usw. gearbeitet wird.


Hintergrund

Was ist eine HAL überhaupt? Eine Hardwareabstraktionsschicht separiert größtenteils die Hardware von der Software und bietet der Software lediglich standardisierte Funktionen an, sodass diese nichts über die genaue Hardwarekonfiguration wissen muss. Ein Konkretes Beispiel im Falle von DMXControl:

Zwei Geräte besitzen einen Dimmerkanal, welcher bei beiden Geräten auf völlig unterschiedlichen Kanälen liegt. Mit einer HAL wüsste DMXC nichts von den unterschiedlichen Kanalkonfigurationen, sondern änderte lediglich den Wert des standardisierten "DIMMER"-Kanals. Die Software sendet also der HAL lediglich einen neuen Wert für den "DIMMER"-Kanal, wobei die Abstraktionsschicht daraufhin für jedes Gerät einzeln prüft, ob und auf welchem Kanal ein Dimmerkanal vorliegt. Ist dieser gefunden sendet die HAL daraufhin die neuen Kanalwerte an das Gerät.

Somit kann z.B. bei gruppierten Geräten ohne Rücksicht auf die Kanalkonfiguration der Geräte sehr leicht die einzelnen Funktionen geändert werden. Aber auch sämtliche andere Funktionen (von Befehlen bishin zu Effekten) können somit leichter aufgebaut werden.

Beispiel

Einfaches Beispiel zur Funktionsweise:
In einer Szene ist "volle Helligkeit" und "Rot" abgespeichert.
Gerät 1 ist ein RGB-Par mit 4 Kanälen und "denkt sich" nun: Prima, das heißt Kanal 1(rot) auf 255 und Dimmerkanal 4 auf 255.
Gerät 2 ist ein RGB-Par mit nur 3 Kanälen und "denkt": Alles klar, Rot auf voll und voll hell heißt virtueller Dimmer 255 und damit dann Kanal 1: Rot 255
Gerät 3 ist ein Scanner der sich schon freut: Da ich keinen Dimmer sondern nur einen Shutter habe mach ich den mal voll auf und stelle das Farbrad auf Rot.
Gerät 4 ist ein Movinghead (Wash) mit CMY-Mischung und schwenkt nun seine Dimmerblende ganz zur Seite und stellt mit seinem Farbmischsystem das beste 255er-Rot ein dass er bieten kann.
Gerät 5 ist ein älterer Scanner der flucht furchtbar weil er nur ein dunkles Orange drin hat aber kein Rot. Da er aber auch angesprochen wird nimmt er halt was er kriegen kann und zeigt dann das was am besten dazu passt.

Da natürlich die Geräte selbst relativ "dumm" sind, übernimmt genau diese Arbeit der HAL.


Datenformat (nicht aktueller Entwicklungsstand!)

Dies soll ein erster Entwurf für zukünftige DDFs werden, die in den HAL geladen werden. Die Bearbeitung ist noch lange nicht abgeschlossen, weswegen es einige Inkonsistenzen gibt.

<?xml version="1.0" encoding="ISO-8859-1"?>
<device ddfversion="2" image="RoboScan1220.gif">
 <information>
  <name>RoboScan 1220 XR (Modus 2)</name>
  <vendor>Martin</vendor>
  <author>Stefan Krupop</author>
 </information>

 <!-- Aufzählung der DMX-Kanäle des Gerätes. "offset" ist optional und wird zur laufenden Nummerierung addiert. -->
 <dmxchannels>
  <dmxchannel offset="0" name="Multifunktion"/>
  <dmxchannel name="Intensität"/>
  <dmxchannel name="Farbe"/>
  <dmxchannel name="Gobo 1 (fest)"/>
  <dmxchannel name="Gobo 2 (drehbar)"/>
  <dmxchannel name="Goborotation"/>
  <dmxchannel name="Fokus"/>
  <dmxchannel name="Iris"/>
  <dmxchannel name="Effektrad"/>
  <dmxchannel name="Pan"/>
  <dmxchannel name="Pan (Fein)"/>
  <dmxchannel name="Tilt"/>
  <dmxchannel name="Tilt (Fein)"/>
 </dmxchannels>

 <!-- Subchannels lösen Mehrfachbelegungen von DMX-Kanälen auf mehrere virtuelle Kanäle auf -->
 <!-- linear: min und max sind optional, default: 0 und 255 bzw. 65535 -->
 <subchannels>
  <subchannel id="helligkeit" channel="2" name="Intensität">
   <linear fade="true"/>
  </subchannel>
  <subchannel id="gobo1" channel="4" name="Gobo (fest)">
   <snap value="0" name="Offen" icon="open"/>
   <snap value="20" name="Sterne" icon="stars"/>
   <snap value="40" name="Stern" icon="star"/>
   <snap value="60" name="Punkte" icon="dots"/>
   <snap value="80" name="Kegel" icon="cone"/>
   <snap value="100" name="Pling" icon="pling"/>
   <snap value="120" name="Punkte-Kreis" icon="dotcircle"/>
   <snap value="140" name="Glocken" icon="bells"/>
   <snap value="160" name="Blume" icon="flowers"/>
   <snap value="180" name="Turbine" icon="turbine"/>
  </subchannel>
  <subchannel id="fokus" channel="7" name="Fokus">
   <linear fade="true"/>
  </subchannel>
  <subchannel id="iris" channel="8" name="Iris">
   <linear fade="true"/>
  </subchannel>
  <subchannel id="effekte" channel="9" name="Effektrad">
   <snap value="0" name="Offen" icon="open"/>
   <snap value="50" name="CTC 5500-3400K" icon="ctc"/>
   <snap value="100" name="Frostfilter" icon="frost"/>
   <snap value="150" name="Dreiseitprisma" icon="3prism"/>
   <snap value="250" name="Fünfseitprisma" icon="5prism"/>
  </subchannel>
  <subchannel id="pan" channel="10" channelhigh="11" name="Pan">
   <linear fade="true" default="32896"/>
  </subchannel>
  <subchannel id="tilt" channel="12" channelhigh="13" name="Tilt">
   <linear fade="true" default="32896"/>
  </subchannel>
 </subchannels>

 <form width="385" height="313">
  <deviceimage top="0" left="0" width="33" height="33"/>
  <devicename top="0" left="40" width="129" height="17"/>
  <deviceadress top="16" left="40" width="129" height="17"/>
  <position top="40" left="8" height="177" width="177"/>
  <label top="224" left="8" caption="Helligkeit"/>
  <slider top="240" left="16" height="25" width="169" startvalue="0" endvalue="255" tickfreq="51" smallchange="10" largechange="50" channel="1"/>
  <label top="0" left="200" caption="Farbe"/>
  <dropdown top="16" left="208" width="113" name="color_color" action="SetColor">
   <item caption="Weiß" value="0"/>
   <item caption="Flammrot" value="10"/>
   <item caption="Pink" value="20"/>
   <item caption="Cyanblau" value="30"/>
   <item caption="Gelb" value="40"/>
   <item caption="Orange" value="50"/>
   <item caption="Dunkelblau" value="60"/>
   <item caption="Magenta" value="70"/>
   <item caption="Grün" value="80"/>
   <item caption="Dunkelviolett" value="90"/>
   <item caption="Drehung UZ" value="-1"/>
   <item caption="Drehung GUZ" value="-2"/>
  </dropdown>
  <slider top="16" left="320" height="25" width="65" startvalue="0" endvalue="46" tickfreq="23" smallchange="1" largechange="12" name="color_speed" action="SetColor"/>
  <label top="40" left="200" caption="Gobos"/>
  <dropdown top="56" left="208" width="177" channel="3">
   <item caption="Offen" value="0"/>
   <item caption="Sterne" value="20"/>
   <item caption="Stern" value="40"/>
   <item caption="Punkte" value="60"/>
   <item caption="Kegel" value="80"/>
   <item caption="Pling" value="100"/>
   <item caption="Punkte-Kreis" value="120"/>
   <item caption="Glocken" value="140"/>
   <item caption="Blume" value="160"/>
   <item caption="Turbine" value="180"/>
  </dropdown>
  <dropdown top="80" left="208" width="177" name="gobos_gobo" action="SetGobo">
   <item caption="Offen" value="0"/>
   <item caption="{goboname_1}" value="1"/>
   <item caption="{goboname_2}" value="2"/>
   <item caption="{goboname_3}" value="3"/>
   <item caption="{goboname_4}" value="4"/>
  </dropdown>
  <label top="104" left="208" caption="Gobomodus:"/>
  <dropdown top="120" left="216" width="169" name="gobos_mode" action="SetGobo">
   <item caption="Normal" value="0"/>
   <item caption="Drehen UZ" value="-1"/>
   <item caption="Drehen GUZ" value="-2"/>
  </dropdown>
  <label top="144" left="208" caption="Winkel/Drehgeschwindigkeit:"/>
  <slider top="160" left="216" height="25" width="169" startvalue="0" endvalue="255" tickfreq="51" smallchange="10" largechange="51" name="gobos_index" action="SetGobo"/>
  <label top="184" left="200" caption="Effekt"/>
  <dropdown top="200" left="208" width="177" channel="8">
   <item caption="Offen" value="0"/>
   <item caption="CTC 5500-3400K" value="50"/>
   <item caption="Frostfilter" value="100"/>
   <item caption="Dreiseitprisma" value="150"/>
   <item caption="Fünfseitprisma" value="250"/>
  </dropdown>
  <label top="224" left="200" caption="Strobe"/>
  <onoff caption="Ein" top="240" left="208" width="33" height="20" name="strobe_on" action="SetStrobe"/>
  <slider top="240" left="240" height="25" width="145" startvalue="0" endvalue="127" tickfreq="32" smallchange="5" largechange="25" name="strobe_speed" action="SetStrobe"/>
  <label top="274" left="8" caption="Iris:"/>
  <slider top="272" left="24" height="25" width="161" startvalue="0" endvalue="255" tickfreq="51" smallchange="50" largechange="100" channel="7"/>
  <label top="274" left="200" caption="Fokus:"/>
  <slider top="272" left="232" height="25" width="153" startvalue="0" endvalue="255" tickfreq="51" smallchange="50" largechange="100" channel="6"/>
  <command top="296" left="272" width="105" caption="Lampe abschalten" clicksequence="save 0;set 0 245;hold 5500;restore 0"/>
  <command top="296" left="184" width="88" caption="Reset" clicksequence="save 0;set 0 250;hold 5500;restore 0"/>
  <command top="296" left="96" width="88" caption="Lüfter langsam" clicksequence="save 0;set 0 220"/>
  <command top="296" left="0" width="96" caption="Lampe zünden" clicksequence="save 0;set 0 255;hold 5500;restore 0"/>
  <line x1="56" y1="232" x2="184" y2="232"/>
  <line x1="232" y1="8" x2="384" y2="8"/>
  <line x1="232" y1="48" x2="384" y2="48"/>
  <line x1="240" y1="192" x2="384" y2="192"/>
  <line x1="240" y1="232" x2="384" y2="232"/>
  <line x1="192" y1="0" x2="192" y2="265"/>
  <line x1="0" y1="265" x2="384" y2="265"/>
 </form>
 <code>
  <procedure name='INITCONTROLS'>
   !call|GetStrobe$
   !call|GetColor$
   !call|GetGobo$
  </procedure>
  <procedure name='GetStrobe'>
!if|({channel_0} < 50) or ({channel_0} > 177)|
 !set_control|strobe_on|0$
 !set_control|strobe_speed|0$
|
 !set_control|strobe_on|1$
 !set_control|strobe_speed|(177-{channel_0})$
$
  </procedure>
  <procedure name='SetStrobe'>
!if|({strobe_on} = 1)|
 !set_channel|0|(177-{strobe_speed})$
|
 !set_channel|0|0$
$
  </procedure>
  <procedure name='GetColor'>
!if|{channel_2} < 162|
 !set_control|color_color|{channel_2}$
 !set_control|color_speed|0$
|
 !if|({channel_2} > 161) and ({channel_2} < 209)|
  !set_control|color_color|-1$
  !set_control|color_speed|(208-{channel_2})$
 $
 !if|({channel_2} > 208) and ({channel_2} < 256)|
  !set_control|color_color|-2$
  !set_control|color_speed|({channel_2}-209)$
 $
$
  </procedure>
  <procedure name='SetColor'>
!if|{color_color}|gt|-1|
 !set_channel|2|{color_color}$
|
 !if|{color_color}|eq|-1|
  !set_channel|2|(208-{color_speed})$
 $
 !if|{color_color}|eq|-2|
  !set_channel|2|(209+{color_speed})$
 $
$
  </procedure>
  <procedure name='GetGobo'>
!if|{channel_4} < 126|
 !set_control|gobos_gobo|({channel_4} / 30)$
 !set_control|gobos_mode|0$
 !set_control|gobos_index|{channel_5}$
$
!if|({channel_4} > 125)|
 !set_control|gobos_gobo|(({channel_4} - 120) / 30)$
 !if|{channel_5} < 128|
  !set_control|gobos_mode|-1$
  !set_control|gobos_index|(({channel_5}-1) * 2.0238)$
 |
  !set_control|gobos_mode|-2$
  !set_control|gobos_index|((254-{channel_5}) * 2.0238)$
 $
$
  </procedure>
  <procedure name='SetGobo'>
 !if|{gobos_mode}|eq|0|
  !set_channel|4|({gobos_gobo}*30)$
  !set_channel|5|{gobos_index}$
 |
  !if|{gobos_gobo}|gt|0|
   !if|{gobos_mode}|eq|-1|
    !set_channel|4|(120+({gobos_gobo}*30))$
    !set_channel|5|(1+({gobos_index} / 2.0238))$
   $
   !if|{gobos_mode}|eq|-2|
    !set_channel|4|(120+({gobos_gobo}*30))$
    !set_channel|5|(254-({gobos_index} / 2.0238))$
   $
  |
   !set_channel|4|0$
   !set_channel|5|0$
  $
 $
  </procedure>
 </code>
</device>


Persönliche Werkzeuge
Buch erstellen