pewduino_logo

IR-Protokoll

Frequenz

Das IR-Signal hat grundlegend eine Frequenz von 38 kHz. Ohne die Frequenz reagieren die IR-Empfänger Vishay TSOP 31238 nicht auf das Infrarotlicht.

Daten-Pakete

Ein Schuss besteht aus folgenden Daten:
[header] + [1. byte] + [2. byte] + [1 parity bit]

Der “Header” wird mit der Dauer von 2400 μs gesendet.
Ein Bit mit dem Wert “1” wird mit der Dauer von 1200 μs gesendet.
Ein Bit mit dem Wert “0” wird mit der Dauer von 600 μs gesendet.

Zwischen dem  “Header”, der “1” oder “0” gibt es Pausen des Lichtsignals mit einer Dauer von 600 μs Dauer.

 

ir_protocol_time

Inhalte der Daten eines Schusses:

[header] [0ppppppc] [tttddddd] [k]

Bedeutung der Bytes:

[0ppppppc]

Das erste Bit im ersten Byte ist eine 0 (Null). Dies bedeutet, dass es sich hierbei um einen virtuellen Schuss handelt. Danach folgt die SpielerID in den nächsten 6 Bit.

Ist das erste Bit eine 1, so handelt es sich hier um ein Kommando/System-Befehl.

Mit 6 Bit für die SpielerID lassen sich maximal 64 Spieler adressieren. Allerdings würde ich Spieler mit ID 0 vorerst nicht verwenden und erstmal ohne Verwendung markieren.

Dezimal-WertSpielerID
0nicht verwendet
1-63SpielerID 1-63

Das letzte Bit gibt an, ob es sich beim Schuss um einen kritischen Treffer handelt. Kritische Treffer können zum Beispiel doppelten Schaden machen, oder den Gegner für eine kurze Zeit reaktionsunfähig machen. Wichtig an dieser Stelle: Wenn der Schuss kritisch ist, also das 8. Bit ist “1”, dann bleibt der eigentliche Schadenswert trotzdem identisch. Bedeutet, wenn die Waffe pro Schuss normalerweise 30 Schaden macht, dann wird bei einem kritischen Treffer beim senden daran nichts verändert. Nur das c-Bit wird 1 gesetzt.

Die Verdopplung des Schadens geschieht dann erst beim Empfänger. Das hat folgenden Hintergrund: ich kann mir vorstellen durch Power-Ups oder durch Spielerklassen (Sniper, Nahkampf, etc) eine gewisse natürliche Abhärtung gegen Kritische Treffer einzubauen. Das bedeutet, dass obwohl der Sender einen Kritischen Schuss gesendet hat, der Empfänger es aber ignoriert, weil genügend Abhärtung vorhanden ist (durch virtuelle Panzerung zum Beispiel).

[tttddddd]

Die ersten 3 Bit des 2. Bytes stehen für die TeamID. Mit 3 bit lassen sich maximal 8 Teams definieren. Das Team mit der ID 0 würde ich nun auch erst einmal nicht verwenden, allerdings könnte ich mir später eine Ausarbeitung als “Enviroment Damage” vorstellen, zum Beispiel als Radioaktivität, Feuer, Chemieschaden, Krankheit, etc.

Dezimal-WertTeam
0Umgebungsschaden
1Team Rot
2Team Blau
3Team Grün
4Team Gelb
5Team Rosa
6Team Lila
7Team Schwarz

Die nächsten 4 Bit des 2. Bytes beinhalten den erzeugten Schaden der Waffe. Da sich mit 4 Bit nur 32 Werte übertragen lassen, müssen wir an dieser Stelle etwas kreativer sein.

Damage Mapping

Werterzeugter Schaden
0nicht verwendet
11
22
33
44
55
67
79
811
913
1015
1118
1221
1324
1427
1530
1635
1740
1845
1950
2060
2170
2280
2390
24100
25115
26130
27145
28160
29180
30200
31one shot kill

Das letzte parity Bit folgt nach den 2 Byte. Es ist das 17. Bit und damit das letzte Bit in einem Schuss. Es dient als Prüfziffer. Und das funktioniert so: Es werden die “Einsen” eines Schusses gezählt. Ist die Zahl gerade, wird das parity Bit “0”. Ist die Zahl der Einsen ungerade, wird das parity Bit “1”. Somit kann man einen “falschen” Schuss schnell erkennen und aus der Wertungsberechnung ausschließen.

Beispiele:

0001 0010 0100 1101 0
shotPlayer 9no critTeam 2
Damage 24 (13) – parity 0

0100 1101101 0110 1
shot – Player 38crit – Team 6 – 
Damage 80 (22) – parity 1