From a4836d69b1fa45fdd63340dc6e0f33f14cc44718 Mon Sep 17 00:00:00 2001 From: OlegStepanenko_noute Date: Tue, 22 Mar 2016 21:25:36 +0200 Subject: [PATCH] Added bluetooth module --- AVCLan_mini/AVCLan_BT.cpp | 33 + AVCLan_mini/AVCLan_BT.h | 28 + AVCLan_mini/AVCLan_mini.ino | 28 + AVCLan_mini/config.h | 5 +- AVC_LAN_logger/AVCLan_mini/AVCLanDrv.cpp | 1035 ++++++------- AVC_LAN_logger/AVCLan_mini/AVCLanDrv.h | 150 +- AVC_LAN_logger/AVCLan_mini/BuffSerial.cpp | 227 ++- AVC_LAN_logger/AVCLan_mini/BuffSerial.h | 53 +- logs/teraterm_parse.log | 1711 +++++++++++++++++++++ 9 files changed, 2517 insertions(+), 753 deletions(-) create mode 100644 AVCLan_mini/AVCLan_BT.cpp create mode 100644 AVCLan_mini/AVCLan_BT.h create mode 100644 logs/teraterm_parse.log diff --git a/AVCLan_mini/AVCLan_BT.cpp b/AVCLan_mini/AVCLan_BT.cpp new file mode 100644 index 0000000..0ee72d3 --- /dev/null +++ b/AVCLan_mini/AVCLan_BT.cpp @@ -0,0 +1,33 @@ +//-------------------------------------------------------------------------------- +#include "AVCLan_BT.h" +#include +#include +//-------------------------------------------------------------------------------- +SoftwareSerial mySerial(4, 3); // RX | TX + +//-------------------------------------------------------------------------------- +void AVCLanBT::begin() +//-------------------------------------------------------------------------------- +{ + mySerial.begin(9600); + mySerial.println("BlueTooth is ready"); +} + +//-------------------------------------------------------------------------------- +void AVCLanBT::println( char* val ) +//-------------------------------------------------------------------------------- +{ + mySerial.println( val ); + mySerial.println( "\n\r" ); +} + +//-------------------------------------------------------------------------------- +void AVCLanBT::print( const char* val ) +//-------------------------------------------------------------------------------- +{ + mySerial.print( val ); +} + +AVCLanBT avclanBT; + + diff --git a/AVCLan_mini/AVCLan_BT.h b/AVCLan_mini/AVCLan_BT.h new file mode 100644 index 0000000..f080c47 --- /dev/null +++ b/AVCLan_mini/AVCLan_BT.h @@ -0,0 +1,28 @@ +/* +*/ +#ifndef AVCLanBT_h +#define AVCLanBT_h + +#include +#include "Arduino.h" + +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- + +class AVCLanBT +{ + public: + void begin (); // initialisation, obligatory method + + void println( char*); + void print(const char*); + + private: +}; + +extern AVCLanBT avclanBT; + +#endif + + diff --git a/AVCLan_mini/AVCLan_mini.ino b/AVCLan_mini/AVCLan_mini.ino index 95c204d..235a417 100644 --- a/AVCLan_mini/AVCLan_mini.ino +++ b/AVCLan_mini/AVCLan_mini.ino @@ -1,6 +1,7 @@ #include "AVCLanDrv.h" #include "AVCLanHonda.h" +#include "AVCLan_BT.h" #include "config.h" //-------------------------------------------------------------------------------- @@ -11,6 +12,9 @@ #define HONDA_DIS_ON sbi(LED_PORT, COMMUT_OUT); #define HONDA_DIS_OFF cbi(LED_PORT, COMMUT_OUT); +static int MAX_ERROR_COUNT = 30; +byte errorID; +int error_count; //-------------------------------------------------------------------------------- void setup() //-------------------------------------------------------------------------------- @@ -20,6 +24,11 @@ void setup() avclan.begin(); avclanHonda.begin(); + errorID = 0; + error_count = 0; + + avclanBT.begin(); + avclanBT.println("Start HONDA avclan."); } //-------------------------------------------------------------------------------- @@ -43,10 +52,22 @@ void loop() if ( INPUT_IS_SET ) { byte res = avclan.readMessage(); if ( !res ) { + error_count = 0; + avclanHonda.getActionID(); if ( avclan.actionID != ACT_NONE ) { avclanHonda.processAction( (AvcActionID)avclan.actionID ); } + } else { + if ( errorID == res ) error_count++; + else error_count = 1; + + errorID = res; + + if ( error_count > MAX_ERROR_COUNT ) { + error_count = 0; + avclanHonda.setHondaDis(true); + } } } @@ -60,6 +81,13 @@ void loop() HONDA_DIS_OFF; } } + + if ( !error_count && errorID ) { + char BUFFF[15]; + sprintf(BUFFF, "Error: %d", errorID); + avclanBT.println( BUFFF ); + delay(2000); + } } diff --git a/AVCLan_mini/config.h b/AVCLan_mini/config.h index 0cefab6..c935dd2 100644 --- a/AVCLan_mini/config.h +++ b/AVCLan_mini/config.h @@ -29,10 +29,7 @@ #define LED_DDR DDRC #define LED_PORT PORTC #define LED_PIN PINC -//#define LED_OUT 5 - -// Commutate pin 11 -#define COMMUT_OUT 1 +#define COMMUT_OUT 0 // AZFM board activate diff --git a/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.cpp b/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.cpp index da66a4f..d8644fe 100644 --- a/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.cpp +++ b/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.cpp @@ -1,578 +1,579 @@ +/* + AVCLanDrv.cpp - AVCLan Library for 'duino / Wiring + Created by Kochetkov Aleksey, 04.08.2010 + Version 0.3.1 +*/ + #include "AVCLanDrv.h" #include "BuffSerial.h" -// AVCLan driver & timer2 init, -// char buff[80] = {0}; -//-------------------------------------------------------------------------------- -void AVCLanDrv::begin () -//-------------------------------------------------------------------------------- -{ - // AVCLan TX+/TX- read line INPUT - cbi(DATAIN_DDR, DATAIN); +// AVCLan driver & timer2 init, +void AVCLanDrv::begin (){ + // AVCLan TX+/TX- read line INPUT + cbi(DATAIN_DDR, DATAIN); #ifdef AVCLAN_ST485 - sbi(DATAIN_PORT, DATAIN); -#else - cbi(DATAIN_PORT, DATAIN); + sbi(DATAIN_PORT, DATAIN); +#else + cbi(DATAIN_PORT, DATAIN); #endif - // AVCLan TX+/TX- write line OUTPUT + // AVCLan TX+/TX- write line OUTPUT #ifdef AVCLAN_RESISTOR - cbi(DATAOUT_DDR, DATAOUT); - cbi(DATAOUT_PORT, DATAOUT); - cbi(ADCSRB, ACME); // Analog Comparator Multiplexer Enable - NO - cbi(ACSR, ACIS1); // Analog Comparator Interrupt Mode Select - cbi(ACSR, ACIS0); // Comparator Interrupt on Output Toggle - cbi(ACSR, ACD); // Analog Comparator Disbale - NO -#else + cbi(DATAOUT_DDR, DATAOUT); + cbi(DATAOUT_PORT, DATAOUT); + cbi(ADCSRB, ACME); // Analog Comparator Multiplexer Enable - NO + cbi(ACSR, ACIS1); // Analog Comparator Interrupt Mode Select + cbi(ACSR, ACIS0); // Comparator Interrupt on Output Toggle + cbi(ACSR, ACD); // Analog Comparator Disbale - NO +#else #ifdef AVCLAN_ST485 - sbi(DATAOUT_DDR, DATAOUT); - sbi(OUTEN_DDR, OUTEN); - AVC_OUT_DIS; - OUTPUT_SET_0; -#else - //avclan driver on PCA82C250 & LM239N - sbi(DATAOUT_DDR, DATAOUT); - AVC_OUT_DIS; - OUTPUT_SET_0; + sbi(DATAOUT_DDR, DATAOUT); + sbi(OUTEN_DDR, OUTEN); + AVC_OUT_DIS; + OUTPUT_SET_0; +#else +//avclan driver on PCA82C250 & LM239N + sbi(DATAOUT_DDR, DATAOUT); + AVC_OUT_DIS; + OUTPUT_SET_0; #endif #endif - // timer2 setup, prescaler factor - 8 +// timer2 setup, prescaler factor - 8 #if defined(__AVR_ATmega8__) - // ASSR=0x00; - TCCR2 = 0x02; - // TCNT2=0x00; - // OCR2=0x00; +// ASSR=0x00; + TCCR2=0x02; +// TCNT2=0x00; +// OCR2=0x00; #else // ATMega168 - // ASSR=0x00; - // TCCR2A=0x00; - TCCR2B = 0x02; - // TCNT2=0x00; - // OCR2A=0x00; - // OCR2B=0x00; +// ASSR=0x00; +// TCCR2A=0x00; + TCCR2B=0x02; +// TCNT2=0x00; +// OCR2A=0x00; +// OCR2B=0x00; #endif - headAddress = 0x0000; - deviceAddress = 0x0000; - // event = EV_NONE; - actionID = ACT_NONE; + headAddress = 0x0000; + deviceAddress = 0x0000; + event = EV_NONE; + actionID = ACT_NONE; } // Reads specified number of bits from the AVCLan. // nbBits (byte) -> Number of bits to read. // Return (word) -> Data value read. -//-------------------------------------------------------------------------------- -word AVCLanDrv::readBits (byte nbBits) -//-------------------------------------------------------------------------------- -{ - word data = 0; - _parityBit = 0; +word AVCLanDrv::readBits (byte nbBits){ + word data = 0; + _parityBit = 0; + + while (nbBits-- > 0){ + // Insert new bit + data <<= 1; + // Wait until rising edge of new bit. + while (INPUT_IS_CLEAR){ + // Reset watchdog. + //wdt_reset(); + } - while (nbBits-- > 0) { - // Insert new bit - data <<= 1; - // Wait until rising edge of new bit. - while (INPUT_IS_CLEAR) { - // Reset watchdog. - //wdt_reset(); - } - - // Reset timer to measure bit length. - TCNT2 = 0; - // Wait until falling edge. - while (INPUT_IS_SET); - // Compare half way between a '1' (20 us) and a '0' (32 us ): 32 - (32 - 20) /2 = 26 us - if (TCNT2 < AVC_BIT_0_HOLD_ON_MIN_LENGTH) { - // Set new bit. - data |= 0x0001; - // Adjust parity. - _parityBit = !_parityBit; - } - } - while (INPUT_IS_CLEAR && TCNT2 < AVC_NORMAL_BIT_LENGTH); - - // char buff[10] = {0}; - // sprintf(buff, "%x", data ); - // // bSDLog.logs( buff ); - return data; + // Reset timer to measure bit length. + TCNT2 = 0; + // Wait until falling edge. + while (INPUT_IS_SET); + // Compare half way between a '1' (20 us) and a '0' (32 us ): 32 - (32 - 20) /2 = 26 us + if (TCNT2 < AVC_BIT_0_HOLD_ON_MIN_LENGTH){ + // Set new bit. + data |= 0x0001; + // Adjust parity. + _parityBit = ! _parityBit; + } + } + while (INPUT_IS_CLEAR && TCNT2 < AVC_NORMAL_BIT_LENGTH); + return data; } // Read incoming messages on the AVCLan. -// Return 0 if success. -//-------------------------------------------------------------------------------- -byte AVCLanDrv::_readMessage () -//-------------------------------------------------------------------------------- -{ - uint8_t t = 0; - uint8_t oldSREG = SREG; - cli(); // disable interrupts +// Return true if success. +byte AVCLanDrv::_readMessage (){ + uint8_t t = 0; + uint8_t oldSREG = SREG; + cli(); // disable interrupts - // Start bit. - while (INPUT_IS_CLEAR); - TCCR2B = 0x03; // prescaler 32 - TCNT2 = 0; - // Wait until falling edge. - while (INPUT_IS_SET) { - t = TCNT2; - if (t > 0xFF) { - TCCR2B = 0x02; // prescaler 8 - SREG = oldSREG; - return 1; - } - } - TCCR2B = 0x02; // prescaler 8 + // Start bit. + while (INPUT_IS_CLEAR); + TCCR2B=0x03; // prescaler 32 + TCNT2 = 0; + // Wait until falling edge. + while (INPUT_IS_SET){ + t = TCNT2; + if (t > 0xFF) { + TCCR2B=0x02; // prescaler 8 + SREG = oldSREG; + return 1; + } + } + TCCR2B=0x02; // prescaler 8 + + if (t < AVC_START_BIT_HOLD_ON_MIN_LENGTH){ + //if (t < 0x16){ + SREG = oldSREG; + return 2; + } - if (t < AVC_START_BIT_HOLD_ON_MIN_LENGTH) { - //if (t < 0x16){ - SREG = oldSREG; - return 2; - } + broadcast = readBits(1); - broadcast = readBits(1); + masterAddress = readBits(12); + bool p = _parityBit; + if (p != readBits(1)){ + SREG = oldSREG; + return 3; + } + + slaveAddress = readBits(12); + p = _parityBit; + if (p != readBits(1)){ + SREG = oldSREG; + return 4; + } - masterAddress = readBits(12); - bool p = _parityBit; - if (p != readBits(1)) { - SREG = oldSREG; - return 3; - } + bool forMe = ( slaveAddress == deviceAddress ); - slaveAddress = readBits(12); - p = _parityBit; - if (p != readBits(1)) { - SREG = oldSREG; - return 4; - } + if (forMe){ + // Send ACK. + AVC_OUT_EN; + send1BitWord(0); + AVC_OUT_DIS; + }else{ + readBits(1); + } - bool forMe = ( slaveAddress == deviceAddress ); + // Control + readBits(4); + p = _parityBit; + if (p != readBits(1)){ + SREG = oldSREG; + return 5; + } - if (forMe) { - // Send ACK. - AVC_OUT_EN; - send1BitWord(0); - AVC_OUT_DIS; - } else { - readBits(1); - } + if (forMe){ + // Send ACK. + AVC_OUT_EN; + send1BitWord(0); + AVC_OUT_DIS; + }else{ + readBits(1); + } - // Control - readBits(4); - p = _parityBit; - if (p != readBits(1)) { - SREG = oldSREG; - return 5; - } + dataSize = readBits(8); + p = _parityBit; + if (p != readBits(1)){ + SREG = oldSREG; + return 6; + } - if (forMe) { - // Send ACK. - AVC_OUT_EN; - send1BitWord(0); - AVC_OUT_DIS; - } else { - readBits(1); - } + if (forMe){ + // Send ACK. + AVC_OUT_EN; + send1BitWord(0); + AVC_OUT_DIS; + }else{ + readBits(1); + } + if (dataSize > AVC_MAXMSGLEN){ + SREG = oldSREG; + return 7; + } + byte i; + for (i = 0; i < dataSize; i++ ){ + message[i] = readBits(8); + p = _parityBit; + if (p != readBits(1)){ + SREG = oldSREG; + return 8; + } - dataSize = readBits(8); - p = _parityBit; - if (p != readBits(1)) { - SREG = oldSREG; - return 6; - } - - if (forMe) { - // Send ACK. - AVC_OUT_EN; - send1BitWord(0); - AVC_OUT_DIS; - } else { - readBits(1); - } - if (dataSize > AVC_MAXMSGLEN) { - SREG = oldSREG; - return 7; - } - byte i; - for (i = 0; i < dataSize; i++ ) { - message[i] = readBits(8); - p = _parityBit; - if (p != readBits(1)) { - SREG = oldSREG; - return 8; - } - - if (forMe) { - // Send ACK. - AVC_OUT_EN; - send1BitWord(0); - AVC_OUT_DIS; - } else { - readBits(1); - } - } - SREG = oldSREG; - return 0; + if (forMe){ + // Send ACK. + AVC_OUT_EN; + send1BitWord(0); + AVC_OUT_DIS; + }else{ + readBits(1); + } + } + SREG = oldSREG; + return 0; } // Read incoming messages on the AVCLan, log message through serial port // Return true if success. -//-------------------------------------------------------------------------------- -byte AVCLanDrv::readMessage () -//-------------------------------------------------------------------------------- -{ - byte res = avclan._readMessage(); - if (res) - { - while (!avclan.isAvcBusFree()); - } - return res; +byte AVCLanDrv::readMessage (){ + byte res = avclan._readMessage(); + if (!res){ + avclan.printMessage(true); + }else{ + bSerial.print("R"); + bSerial.printHex4(res); + bSerial.println(); + while (!avclan.isAvcBusFree()); + } + return res; } // Send a start bit to the AVCLan -////-------------------------------------------------------------------------------- -//void AVCLanDrv::sendStartBit () -////-------------------------------------------------------------------------------- -//{ -// // Reset timer to measure bit length. -// TCCR2B = 0x03; // prescaler 32 -// TCNT2 = 0; -// OUTPUT_SET_1; -// -// // Pulse level high duration. -// while ( TCNT2 < AVC_START_BIT_HOLD_ON_LENGTH ); -// OUTPUT_SET_0; -// -// // Pulse level low duration until ~185 us. -// while ( TCNT2 < AVC_START_BIT_LENGTH ); -// TCCR2B = 0x02; // prescaler 8 -// -//} +void AVCLanDrv::sendStartBit (){ + // Reset timer to measure bit length. + TCCR2B=0x03; // prescaler 32 + TCNT2 = 0; + OUTPUT_SET_1; -// Send a 1 bit word to the AVCLan -//-------------------------------------------------------------------------------- -void AVCLanDrv::send1BitWord (bool data) -//-------------------------------------------------------------------------------- -{ - // Reset timer to measure bit length. - TCNT2 = 0; - OUTPUT_SET_1; + // Pulse level high duration. + while ( TCNT2 < AVC_START_BIT_HOLD_ON_LENGTH ); + OUTPUT_SET_0; - if (data) { - while (TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH); - } else { - while (TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH); - } + // Pulse level low duration until ~185 us. + while ( TCNT2 < AVC_START_BIT_LENGTH ); + TCCR2B=0x02; // prescaler 8 - OUTPUT_SET_0; - while (TCNT2 < AVC_NORMAL_BIT_LENGTH); } -//// Send a 4 bit word to the AVCLan -////-------------------------------------------------------------------------------- -//void AVCLanDrv::send4BitWord (byte data) -////-------------------------------------------------------------------------------- -//{ -// _parityBit = 0; -// -// // Most significant bit out first. -// for ( char nbBits = 0; nbBits < 4; nbBits++ ) { -// // Reset timer to measure bit length. -// TCNT2 = 2; -// OUTPUT_SET_1; -// -// if (data & 0x8) { -// // Adjust parity. -// _parityBit = ! _parityBit; -// while ( TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH ); -// } else { -// while ( TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH ); -// } -// -// OUTPUT_SET_0; -// // Hold output low until end of bit. -// while ( TCNT2 < AVC_NORMAL_BIT_LENGTH ); -// -// // Fetch next bit. -// data <<= 1; -// } -//} -// -//// Send a 8 bit word to the AVCLan -////-------------------------------------------------------------------------------- -//void AVCLanDrv::send8BitWord (byte data) -////-------------------------------------------------------------------------------- -//{ -// _parityBit = 0; -// -// // Most significant bit out first. -// for ( char nbBits = 0; nbBits < 8; nbBits++ ) { -// // Reset timer to measure bit length. -// TCNT2 = 2; -// OUTPUT_SET_1; -// -// if (data & 0x80) { -// // Adjust parity. -// _parityBit = ! _parityBit; -// while ( TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH ); -// } else { -// while ( TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH ); -// } -// -// OUTPUT_SET_0; -// // Hold output low until end of bit. -// while ( TCNT2 < AVC_NORMAL_BIT_LENGTH ); -// -// // Fetch next bit. -// data <<= 1; -// } -//} -// -//// Send a 12 bit word to the AVCLan -////-------------------------------------------------------------------------------- -//void AVCLanDrv::send12BitWord (word data) -////-------------------------------------------------------------------------------- -//{ -// _parityBit = 0; -// -// // Most significant bit out first. -// for ( char nbBits = 0; nbBits < 12; nbBits++ ) { -// // Reset timer to measure bit length. -// TCNT2 = 2; -// OUTPUT_SET_1; -// -// if (data & 0x0800) { -// // Adjust parity. -// _parityBit = ! _parityBit; -// while ( TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH ); -// } else { -// while ( TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH ); -// } -// -// OUTPUT_SET_0; -// // Hold output low until end of bit. -// while ( TCNT2 < AVC_NORMAL_BIT_LENGTH ); -// -// // Fetch next bit. -// data <<= 1; -// } -//} +// Send a 1 bit word to the AVCLan +void AVCLanDrv::send1BitWord (bool data){ + // Reset timer to measure bit length. + TCNT2 = 0; + OUTPUT_SET_1; + + if (data){ + while (TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH); + }else{ + while (TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH); + } + + OUTPUT_SET_0; + while (TCNT2 < AVC_NORMAL_BIT_LENGTH); +} + +// Send a 4 bit word to the AVCLan +void AVCLanDrv::send4BitWord (byte data){ + _parityBit = 0; + + // Most significant bit out first. + for ( char nbBits = 0; nbBits < 4; nbBits++ ){ + // Reset timer to measure bit length. + TCNT2 = 2; + OUTPUT_SET_1; + + if (data & 0x8){ + // Adjust parity. + _parityBit = ! _parityBit; + while ( TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH ); + }else{ + while ( TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH ); + } + + OUTPUT_SET_0; + // Hold output low until end of bit. + while ( TCNT2 < AVC_NORMAL_BIT_LENGTH ); + + // Fetch next bit. + data <<= 1; + } +} + +// Send a 8 bit word to the AVCLan +void AVCLanDrv::send8BitWord (byte data){ + _parityBit = 0; + + // Most significant bit out first. + for ( char nbBits = 0; nbBits < 8; nbBits++ ){ + // Reset timer to measure bit length. + TCNT2 = 2; + OUTPUT_SET_1; + + if (data & 0x80){ + // Adjust parity. + _parityBit = ! _parityBit; + while ( TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH ); + }else{ + while ( TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH ); + } + + OUTPUT_SET_0; + // Hold output low until end of bit. + while ( TCNT2 < AVC_NORMAL_BIT_LENGTH ); + + // Fetch next bit. + data <<= 1; + } +} + +// Send a 12 bit word to the AVCLan +void AVCLanDrv::send12BitWord (word data){ + _parityBit = 0; + + // Most significant bit out first. + for ( char nbBits = 0; nbBits < 12; nbBits++ ){ + // Reset timer to measure bit length. + TCNT2 = 2; + OUTPUT_SET_1; + + if (data & 0x0800){ + // Adjust parity. + _parityBit = ! _parityBit; + while ( TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH ); + }else{ + while ( TCNT2 < AVC_BIT_0_HOLD_ON_LENGTH ); + } + + OUTPUT_SET_0; + // Hold output low until end of bit. + while ( TCNT2 < AVC_NORMAL_BIT_LENGTH ); + + // Fetch next bit. + data <<= 1; + } +} // determine whether the bus is free (no tx/rx). // return TRUE is bus is free. -//-------------------------------------------------------------------------------- -bool AVCLanDrv::isAvcBusFree (void) -//-------------------------------------------------------------------------------- -{ - // Reset timer. - TCNT2 = 0; +bool AVCLanDrv::isAvcBusFree (void){ + // Reset timer. + TCNT2 = 0; - while (INPUT_IS_CLEAR) { - // We assume the bus is free if anything happens for the length of 1 bit. - if (TCNT2 > AVC_NORMAL_BIT_LENGTH) { - return true; - } - } + while (INPUT_IS_CLEAR){ + // We assume the bus is free if anything happens for the length of 1 bit. + if (TCNT2 > AVC_NORMAL_BIT_LENGTH){ + return true; + } + } - return false; + return false; +} + +// reads the acknowledge bit the AVCLan +// return TRUE if ack detected else FALSE. +bool AVCLanDrv::readAcknowledge (void){ + // The acknowledge pattern is very tricky: the sender shall drive the bus for the equivalent + // of a bit '1' (20 us) then release the bus and listen. At this point the target shall have + // taken over the bus maintaining the pulse until the equivalent of a bit '0' (32 us) is formed. + + // Reset timer to measure bit length. + TCNT2 = 0; + OUTPUT_SET_1; + + // Generate bit '0'. + while (TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH); + OUTPUT_SET_0; + + AVC_OUT_DIS; + + while (TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH + AVC_1U_LENGTH); + // Measure final resulting bit. + while ( INPUT_IS_SET ); + + // Sample half-way through bit '0' (26 us) to detect whether the target is acknowledging. + if (TCNT2 > AVC_BIT_0_HOLD_ON_MIN_LENGTH){ + // Slave is acknowledging (ack = 0). Wait until end of ack bit. + while (INPUT_IS_SET ); + AVC_OUT_EN; + return true; + } + + // No sign of life on the bus. + return false; +} + +// sends ack bit if I am broadcasting otherwise wait and return received ack bit. +// return FALSE if ack bit not detected. +bool AVCLanDrv::handleAcknowledge (void){ + if (broadcast == AVC_MSG_BROADCAST){ + // Acknowledge. + send1BitWord(0); + return true; + } + + // Return acknowledge bit. + return readAcknowledge(); +} + +// sends the message in global registers on the AVC LAN bus. +// return 0 if successful else error code +byte AVCLanDrv::_sendMessage (void){ + uint8_t oldSREG = SREG; + cli(); // disable interrupts + while (!isAvcBusFree()); + + AVC_OUT_EN; + + // Send start bit. + sendStartBit(); + + // Broadcast bit. + send1BitWord(broadcast); + + // Master address = me. + send12BitWord(masterAddress); + send1BitWord(_parityBit); + + // Slave address = head unit (HU). + send12BitWord(slaveAddress); + send1BitWord(_parityBit); + if (!handleAcknowledge()){ + AVC_OUT_DIS; + SREG = oldSREG; + return 1; + } + + // Control flag + parity. + send4BitWord(AVC_CONTROL_FLAGS); + send1BitWord(_parityBit); + if (!handleAcknowledge()){ + AVC_OUT_DIS; + SREG = oldSREG; + return 2; + } + + // Data length + parity. + send8BitWord(dataSize); + send1BitWord(_parityBit); + if (!handleAcknowledge()){ + AVC_OUT_DIS; + SREG = oldSREG; + return 3; + } + + for (byte i = 0; i < dataSize; i++){ + send8BitWord(message[i]); + send1BitWord(_parityBit); + if (!handleAcknowledge()){ + AVC_OUT_DIS; + SREG = oldSREG; + return false; + } + } + AVC_OUT_DIS; + SREG = oldSREG; + return 0; } -//// reads the acknowledge bit the AVCLan -//// return TRUE if ack detected else FALSE. -////-------------------------------------------------------------------------------- -//bool AVCLanDrv::readAcknowledge (void) -////-------------------------------------------------------------------------------- -//{ -// // The acknowledge pattern is very tricky: the sender shall drive the bus for the equivalent -// // of a bit '1' (20 us) then release the bus and listen. At this point the target shall have -// // taken over the bus maintaining the pulse until the equivalent of a bit '0' (32 us) is formed. -// -// // Reset timer to measure bit length. -// TCNT2 = 0; -// OUTPUT_SET_1; -// -// // Generate bit '0'. -// while (TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH); -// OUTPUT_SET_0; -// -// AVC_OUT_DIS; -// -// while (TCNT2 < AVC_BIT_1_HOLD_ON_LENGTH + AVC_1U_LENGTH); -// // Measure final resulting bit. -// while ( INPUT_IS_SET ); -// -// // Sample half-way through bit '0' (26 us) to detect whether the target is acknowledging. -// if (TCNT2 > AVC_BIT_0_HOLD_ON_MIN_LENGTH) { -// // Slave is acknowledging (ack = 0). Wait until end of ack bit. -// while (INPUT_IS_SET ); -// AVC_OUT_EN; -// return true; -// } -// -// // No sign of life on the bus. -// return false; -//} -// -//// sends ack bit if I am broadcasting otherwise wait and return received ack bit. -//// return FALSE if ack bit not detected. -////-------------------------------------------------------------------------------- -//bool AVCLanDrv::handleAcknowledge (void) -////-------------------------------------------------------------------------------- -//{ -// if (broadcast == AVC_MSG_BROADCAST) { -// // Acknowledge. -// send1BitWord(0); -// return true; -// } -// -// // Return acknowledge bit. -// return readAcknowledge(); -//} -// -//// sends the message in global registers on the AVC LAN bus. -//// return 0 if successful else error code -////-------------------------------------------------------------------------------- -//byte AVCLanDrv::_sendMessage (void) -////-------------------------------------------------------------------------------- -//{ -// uint8_t oldSREG = SREG; -// cli(); // disable interrupts -// while (!isAvcBusFree()); -// -// AVC_OUT_EN; -// -// // Send start bit. -// sendStartBit(); -// -// // Broadcast bit. -// send1BitWord(broadcast); -// -// // Master address = me. -// send12BitWord(masterAddress); -// send1BitWord(_parityBit); -// -// // Slave address = head unit (HU). -// send12BitWord(slaveAddress); -// send1BitWord(_parityBit); -// if (!handleAcknowledge()) { -// AVC_OUT_DIS; -// SREG = oldSREG; -// return 1; -// } -// -// // Control flag + parity. -// send4BitWord(AVC_CONTROL_FLAGS); -// send1BitWord(_parityBit); -// if (!handleAcknowledge()) { -// AVC_OUT_DIS; -// SREG = oldSREG; -// return 2; -// } -// -// // Data length + parity. -// send8BitWord(dataSize); -// send1BitWord(_parityBit); -// if (!handleAcknowledge()) { -// AVC_OUT_DIS; -// SREG = oldSREG; -// return 3; -// } -// -// for (byte i = 0; i < dataSize; i++) { -// send8BitWord(message[i]); -// send1BitWord(_parityBit); -// if (!handleAcknowledge()) { -// AVC_OUT_DIS; -// SREG = oldSREG; -// return false; -// } -// } -// AVC_OUT_DIS; -// SREG = oldSREG; -// return 0; -//} -// // sends the message in global registers on the AVC LAN bus, log message through serial port // return 0 if successful else error code -////-------------------------------------------------------------------------------- -//byte AVCLanDrv::sendMessage (void) -////-------------------------------------------------------------------------------- -//{ -// byte sc = MAXSENDATTEMP; -// byte res; -// do { -// res = avclan._sendMessage(); -// if (!res) { -// avclan.printMessage(false); -// } else { -// // bSerial.print("W"); -// // bSerial.printHex4(res); -// // bSerial.println(); -// while (!avclan.isAvcBusFree()); -// } -// sc--; -// } while (sc && res); -// return res; -//} -// -// sends the message for given mesage ID on the AVC LAN bus, log message through serial port -// return 0 if successful else error code -////-------------------------------------------------------------------------------- -//byte AVCLanDrv::sendMessage (const AvcOutMessage *msg) -////-------------------------------------------------------------------------------- -//{ -// loadMessage(msg); -// return sendMessage(); -//} - -// print message to serial port -//-------------------------------------------------------------------------------- -void AVCLanDrv::printMessage(bool incoming) -//-------------------------------------------------------------------------------- -{ - if (incoming) { - bSerial.print("< "); - } else { - bSerial.print("> "); - } - if (broadcast == AVC_MSG_BROADCAST) { - bSerial.print("b "); - } else { - bSerial.print("d "); - } - bSerial.printHex4(masterAddress >> 8); - bSerial.printHex8(masterAddress); - bSerial.print(" "); - - bSerial.printHex4(slaveAddress >> 8); - bSerial.printHex8(slaveAddress); - bSerial.print(" "); - bSerial.printHex8(dataSize); - - for (byte i = 0; i < dataSize; i++) { - bSerial.printHex8(message[i]); - } - bSerial.println(); +byte AVCLanDrv::sendMessage (void){ + byte sc = MAXSENDATTEMP; + byte res; + do{ + res = avclan._sendMessage(); + if (!res){ + avclan.printMessage(false); + }else{ + bSerial.print("W"); + bSerial.printHex4(res); + bSerial.println(); + while (!avclan.isAvcBusFree()); + } + sc--; + }while (sc && res); + return res; } +// sends the message for given mesage ID on the AVC LAN bus, log message through serial port +// return 0 if successful else error code +byte AVCLanDrv::sendMessage (AvcOutMessage *msg){ + loadMessage(msg); + return sendMessage(); +} +// print message to serial port +void AVCLanDrv::printMessage(bool incoming){ + if (incoming){ + bSerial.print("< "); + }else{ + bSerial.print("> "); + } + if (broadcast == AVC_MSG_BROADCAST){ + bSerial.print("b "); + }else{ + bSerial.print("d "); + } + bSerial.printHex4(masterAddress >> 8); + bSerial.printHex8(masterAddress); + bSerial.print(" "); + + bSerial.printHex4(slaveAddress >> 8); + bSerial.printHex8(slaveAddress); + bSerial.print(" "); + bSerial.printHex8(dataSize); + + for (byte i = 0; i < dataSize; i++){ + bSerial.printHex8(message[i]); + } + bSerial.println(); + +} + +// Use the last received message to determine the corresponding action ID +byte AVCLanDrv::getActionID(AvcInMessageTable messageTable[], byte mtSize){ + if (slaveAddress != deviceAddress && slaveAddress != 0x0FFF) return ACT_NONE; + for (byte msg = 0; msg < mtSize; msg++){ + bool found = true; + + if (dataSize != pgm_read_byte_near(&messageTable[msg].dataSize)){ + continue; + } + for (byte i = 0; i < dataSize; i++){ + if (message[i] != pgm_read_byte_near(&messageTable[msg].data[i])){ + found = false; + break; + } + } + + if (found){ + return pgm_read_byte_near(&messageTable[msg].actionID); + } + } + + return ACT_NONE; +} + +// Use the last received message to determine the corresponding action ID, use masked message table +byte AVCLanDrv::getActionID(AvcInMaskedMessageTable messageTable[], byte mtSize){ + if (slaveAddress != deviceAddress && slaveAddress != 0x0FFF) return ACT_NONE; + for (byte msg = 0; msg < mtSize; msg++){ + bool found = true; + + if (dataSize != pgm_read_byte_near(&messageTable[msg].dataSize)){ + continue; + } + word mask = pgm_read_byte_near(&messageTable[msg].mask); + for (byte i = 0; i < dataSize; i++){ + if (mask & _BV(i)) continue; + if (message[i] != pgm_read_byte_near(&messageTable[msg].data[i])){ + found = false; + break; + } + } + + if (found){ + return pgm_read_byte_near(&messageTable[msg].actionID); + } + } + + return ACT_NONE; +} // Loads message data for given mesage ID. -////-------------------------------------------------------------------------------- -//void AVCLanDrv::loadMessage(const AvcOutMessage *msg) -////-------------------------------------------------------------------------------- -//{ -// broadcast = pgm_read_byte_near(&msg->broadcast); -// masterAddress = deviceAddress; -// -// if (broadcast == AVC_MSG_BROADCAST) -// slaveAddress = 0x01FF; -// else -// slaveAddress = headAddress; -// -// dataSize = pgm_read_byte_near( &msg->dataSize ); -// -// for (byte i = 0; i < dataSize; i++ ) { -// message[i] = pgm_read_byte_near( &msg->data[i] ); -// } -//} +void AVCLanDrv::loadMessage(AvcOutMessage *msg){ + broadcast = pgm_read_byte_near(&msg->broadcast); + masterAddress = deviceAddress; -AVCLanDrv avclan; + if (broadcast == AVC_MSG_BROADCAST) + slaveAddress = 0x01FF; + else + slaveAddress = headAddress; + dataSize = pgm_read_byte_near( &msg->dataSize ); + for (byte i = 0; i < dataSize; i++ ){ + message[i] = pgm_read_byte_near( &msg->data[i] ); + } +}; + +AVCLanDrv avclan; \ No newline at end of file diff --git a/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.h b/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.h index dd3d855..a05f2a4 100644 --- a/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.h +++ b/AVC_LAN_logger/AVCLan_mini/AVCLanDrv.h @@ -19,7 +19,7 @@ #define INPUT_IS_CLEAR (!(ACSR & _BV(ACO))) #define OUTPUT_SET_1 sbi(PORTD, DATAOUT); #define OUTPUT_SET_0 cbi(PORTD, DATAOUT); -#define AVC_OUT_EN sbi(PORTD, DATAOUT); sbi(DDRD, DATAOUT); sbi(DDRD, DATAIN); sbi(ACSR, ACD); +#define AVC_OUT_EN sbi(PORTD, DATAOUT); sbi(DDRD, DATAOUT); sbi(DDRD, DATAIN); sbi(ACSR, ACD); #define AVC_OUT_DIS cbi(PORTD, DATAOUT); cbi(DDRD, DATAOUT); cbi(DDRD, DATAIN); cbi(ACSR, ACD); #else #ifdef AVCLAN_ST485 @@ -28,7 +28,7 @@ #define INPUT_IS_CLEAR (bit_is_set(DATAIN_PIN, DATAIN)) #define OUTPUT_SET_1 (cbi(DATAOUT_PORT, DATAOUT)); #define OUTPUT_SET_0 (sbi(DATAOUT_PORT, DATAOUT)); -#define AVC_OUT_EN (sbi(OUTEN_PORT, OUTEN));; +#define AVC_OUT_EN (sbi(OUTEN_PORT, OUTEN));; #define AVC_OUT_DIS (cbi(OUTEN_PORT, OUTEN));; #else //avclan driver on PCA82C250 & LM239N @@ -36,64 +36,54 @@ #define INPUT_IS_CLEAR (bit_is_clear(DATAIN_PIN, DATAIN)) #define OUTPUT_SET_1 (cbi(DATAOUT_PORT, DATAOUT)); #define OUTPUT_SET_0 (sbi(DATAOUT_PORT, DATAOUT)); -#define AVC_OUT_EN; -#define AVC_OUT_DIS; +#define AVC_OUT_EN ; +#define AVC_OUT_DIS ; #endif #endif -#define AVC_NORMAL_BIT_LENGTH 0x4A // 37 * (F_CPU / 1000000L / 8) -#define AVC_BIT_1_HOLD_ON_LENGTH 0x28 // 20 uS * (F_CPU / 1000000L / 8) -#define AVC_BIT_0_HOLD_ON_LENGTH 0x40 // 32 uS * (F_CPU / 1000000L / 8) -//#define AVC_BIT_0_HOLD_ON_MIN_LENGTH 0x34 // 26 uS * (F_CPU / 1000000L / 8) Compare half way between a '1' (20 us) and a '0' (32 us ): 32 - (32 - 20) /2 = 26 us -#define AVC_BIT_0_HOLD_ON_MIN_LENGTH 0x3C // 30 uS * (F_CPU / 1000000L / 8) Compare half way between a '1' (20 us) and a '0' (32 us ): 32 - (32 - 20) /2 = 26 us -#define AVC_START_BIT_LENGTH 0x5D // 186 uS * (F_CPU / 1000000L / 32) , prescaler 32 -#define AVC_START_BIT_HOLD_ON_LENGTH 0x54 // 168 uS * (F_CPU / 1000000L / 32) prescaler 32 -#define AVC_START_BIT_HOLD_ON_MIN_LENGTH 0x16 // 44 uS * (F_CPU / 1000000L / 32) grater that AVC_NORMAL_BIT_LENGTH, prescaler 32 -#define AVC_1U_LENGTH 0x02 // 1 uS * (F_CPU / 1000000L / 8) +#define AVC_NORMAL_BIT_LENGTH 0x4A // 37 * (F_CPU / 1000000L / 8) +#define AVC_BIT_1_HOLD_ON_LENGTH 0x28 // 20 uS * (F_CPU / 1000000L / 8) +#define AVC_BIT_0_HOLD_ON_LENGTH 0x40 // 32 uS * (F_CPU / 1000000L / 8) +//#define AVC_BIT_0_HOLD_ON_MIN_LENGTH 0x34 // 26 uS * (F_CPU / 1000000L / 8) Compare half way between a '1' (20 us) and a '0' (32 us ): 32 - (32 - 20) /2 = 26 us +#define AVC_BIT_0_HOLD_ON_MIN_LENGTH 0x3C // 30 uS * (F_CPU / 1000000L / 8) Compare half way between a '1' (20 us) and a '0' (32 us ): 32 - (32 - 20) /2 = 26 us +#define AVC_START_BIT_LENGTH 0x5D // 186 uS * (F_CPU / 1000000L / 32) , prescaler 32 +#define AVC_START_BIT_HOLD_ON_LENGTH 0x54 // 168 uS * (F_CPU / 1000000L / 32) prescaler 32 +#define AVC_START_BIT_HOLD_ON_MIN_LENGTH 0x16 // 44 uS * (F_CPU / 1000000L / 32) grater that AVC_NORMAL_BIT_LENGTH, prescaler 32 +#define AVC_1U_LENGTH 0x02 // 1 uS * (F_CPU / 1000000L / 8) -#define AVC_MAXMSGLEN 32 -#define AVC_CONTROL_FLAGS 0xF +#define AVC_MAXMSGLEN 32 +#define AVC_CONTROL_FLAGS 0xF typedef enum -{ // No this is not a mistake, broadcast = 0! - AVC_MSG_DIRECT = 1, - AVC_MSG_BROADCAST = 0 +{ // No this is not a mistake, broadcast = 0! + AVC_MSG_DIRECT = 1, + AVC_MSG_BROADCAST = 0 } AvcTransmissionMode; #define ACT_NONE 0 // no action -//#define EV_NONE 0 // no event - -//typedef struct -//{ -// byte actionID; // Action id -// byte dataSize; // message size (bytes) -// byte prefixSize; // prefix size -// byte prefix[6]; // prefix command (const value) -// byte commandSize; // prefix size -// byte command[4]; // message -//} AvcInMessageTable; +#define EV_NONE 0 // no event typedef struct { - byte actionID; // Action id - byte dataSize; // message size (bytes) - byte command; // message -} AvcInCmdTable; + byte actionID; // Action id + byte dataSize; // message size (bytes) + byte data[12]; // message +} AvcInMessageTable; -//typedef struct -//{ -// byte actionID; // Action id -// byte dataSize; // message size (bytes) -// byte data[14]; // message -// word mask; // mask, set bit = 1 in not checked position (1<<5 or _BV(5) - datap[5] not checked) -//} AvcInMaskedMessageTable; +typedef struct +{ + byte actionID; // Action id + byte dataSize; // message size (bytes) + byte data[14]; // message + word mask; // mask, set bit = 1 in not checked position (1<<5 or _BV(5) - datap[5] not checked) +} AvcInMaskedMessageTable; -//typedef struct -//{ -// AvcTransmissionMode broadcast; // Transmission mode: normal (1) or broadcast (0). -// byte dataSize; // message size (bytes) -// byte data[14]; // message -//} AvcOutMessage; +typedef struct +{ + AvcTransmissionMode broadcast; // Transmission mode: normal (1) or broadcast (0). + byte dataSize; // message size (bytes) + byte data[14]; // message +} AvcOutMessage; #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) @@ -102,42 +92,40 @@ typedef struct #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif -class AVCLanDrv { - public: - bool broadcast; - word masterAddress; - word slaveAddress; - word deviceAddress; - word headAddress; - byte dataSize; - byte message[AVC_MAXMSGLEN]; - // byte event; - byte actionID; - bool readonly; - - void begin (); - byte readMessage (void); - // byte sendMessage (void); - // byte sendMessage (const AvcOutMessage*); - void printMessage (bool incoming); - bool isAvcBusFree (void); - // byte getActionID (const AvcInMaskedMessageTable messageTable[], byte mtSize); - // void loadMessage (const AvcOutMessage*); - private: - bool _parityBit; - word readBits (byte nbBits); - byte _readMessage (void); - // byte _sendMessage (void); - // void sendStartBit (void); - void send1BitWord (bool data); - // void send4BitWord (byte data); - // void send8BitWord (byte data); - // void send12BitWord (word data); - // bool readAcknowledge (void); - // bool handleAcknowledge (void); +class AVCLanDrv{ + public: + bool broadcast; + word masterAddress; + word slaveAddress; + word deviceAddress; + word headAddress; + byte dataSize; + byte message[AVC_MAXMSGLEN]; + byte event; + byte actionID; + bool readonly; + void begin (); + byte readMessage (void); + byte sendMessage (void); + byte sendMessage (AvcOutMessage*); + void printMessage (bool incoming); + bool isAvcBusFree (void); + byte getActionID (AvcInMessageTable messageTable[], byte mtSize); + byte getActionID (AvcInMaskedMessageTable messageTable[], byte mtSize); + void loadMessage (AvcOutMessage*); + private: + bool _parityBit; + word readBits (byte nbBits); + byte _readMessage (void); + byte _sendMessage (void); + void sendStartBit (void); + void send1BitWord (bool data); + void send4BitWord (byte data); + void send8BitWord (byte data); + void send12BitWord (word data); + bool readAcknowledge (void); + bool handleAcknowledge (void); }; extern AVCLanDrv avclan; #endif - - diff --git a/AVC_LAN_logger/AVCLan_mini/BuffSerial.cpp b/AVC_LAN_logger/AVCLan_mini/BuffSerial.cpp index 75bc216..2f596b4 100644 --- a/AVC_LAN_logger/AVCLan_mini/BuffSerial.cpp +++ b/AVC_LAN_logger/AVCLan_mini/BuffSerial.cpp @@ -1,32 +1,28 @@ /* - BuffSerial.cpp v.01 - serial with transmit buffer library for Wiring - Created by Kochetkov Aleksey, 03.07.2009 + BuffSerial.cpp - serial with transmit buffer library for Wiring + Created by Kochetkov Aleksey, 28.11.2009 + Version 0.1.2 */ -//-------------------------------------------------------------------------------- #include + #include "BuffSerial.h" -//-------------------------------------------------------------------------------- // serial init -//-------------------------------------------------------------------------------- -void BuffSerial::begin(long speed) -{ - //-------------------------------------------------------------------------------- +void BuffSerial::begin(long speed){ #if defined(__AVR_ATmega8__) - UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXCIE) | _BV(TXEN); // enable rx, tx inerrputs - UBRRH = ((F_CPU / 16 + speed / 2) / speed - 1) >> 8; // usart speed - UBRRL = ((F_CPU / 16 + speed / 2) / speed - 1); + UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXCIE) | _BV(TXEN); // enable rx, tx inerrputs + UBRRH = ((F_CPU / 16 + speed / 2) / speed - 1) >> 8; // usart speed + UBRRL = ((F_CPU / 16 + speed / 2) / speed - 1); #else - UCSR0B = (_BV(RXCIE0) | _BV(RXEN0) | _BV(TXCIE0) | _BV(TXEN0)); // enable rx, tx inerrputs - UBRR0H = ((F_CPU / 16 + speed / 2) / speed - 1) >> 8; // usart speed - UBRR0L = ((F_CPU / 16 + speed / 2) / speed - 1); + UCSR0B = (_BV(RXCIE0) | _BV(RXEN0) | _BV(TXCIE0) | _BV(TXEN0)); // enable rx, tx inerrputs + UBRR0H = ((F_CPU / 16 + speed / 2) / speed - 1) >> 8; // usart speed + UBRR0L = ((F_CPU / 16 + speed / 2) / speed - 1); #endif - rxBegin = rxEnd = 0; - txBegin = txEnd = txOverflow = 0; - txFull = 0; + rxBegin = rxEnd = 0; + txBegin = txEnd = txOverflow = 0; + txFull = 0; } -//-------------------------------------------------------------------------------- //USART Rx Complete #if defined(__AVR_ATmega8__) SIGNAL(SIG_UART_RECV) @@ -35,15 +31,13 @@ SIGNAL(USART_RX_vect) #endif { #if defined(__AVR_ATmega8__) - bSerial.rxBuffer[bSerial.rxEnd] = UDR; + bSerial.rxBuffer[bSerial.rxEnd] = UDR; #else - bSerial.rxBuffer[bSerial.rxEnd] = UDR0; + bSerial.rxBuffer[bSerial.rxEnd] = UDR0; #endif - if (bSerial.rxEnd < RX_BUFF_SIZE) bSerial.rxEnd++; + if (bSerial.rxEnd < RX_BUFF_SIZE) bSerial.rxEnd++; } -//-------------------------------------------------------------------------------- -//-------------------------------------------------------------------------------- //USART Tx Complete #if defined(__AVR_ATmega8__) SIGNAL(SIG_UART_TRANS) @@ -51,153 +45,132 @@ SIGNAL(SIG_UART_TRANS) SIGNAL(USART_TX_vect) #endif { - if (bSerial.txEnd != bSerial.txBegin || bSerial.txFull != 0) { + if (bSerial.txEnd != bSerial.txBegin || bSerial.txFull != 0){ #if defined(__AVR_ATmega8__) - UDR = bSerial.txBuffer[bSerial.txBegin]; // Send buffer + UDR = bSerial.txBuffer[bSerial.txBegin]; // Send buffer #else - UDR0 = bSerial.txBuffer[bSerial.txBegin]; // Send buffer + UDR0 = bSerial.txBuffer[bSerial.txBegin]; // Send buffer #endif - bSerial.txFull = 0; - bSerial.txBegin++; - if (bSerial.txBegin == TX_BUFF_SIZE) bSerial.txBegin = 0; - } + bSerial.txFull = 0; + bSerial.txBegin++; + if (bSerial.txBegin == TX_BUFF_SIZE) bSerial.txBegin = 0; + } } -//-------------------------------------------------------------------------------- // send byte to serial or buffer if bisy -//-------------------------------------------------------------------------------- -void BuffSerial::sendByte(uint8_t data) -//-------------------------------------------------------------------------------- -{ - if (txFull) { - txOverflow++; - } else { - uint8_t oldSREG = SREG; - cli(); +void BuffSerial::sendByte(uint8_t data){ + if (txFull){ + txOverflow++; + }else{ + uint8_t oldSREG = SREG; + cli(); #if defined(__AVR_ATmega8__) - if (txEnd != txBegin || (UCSRA & _BV(UDRE)) == 0) { + if (txEnd != txBegin || (UCSRA & _BV(UDRE)) == 0){ #else - if (txEnd != txBegin || (UCSR0A & _BV(UDRE0)) == 0) { + if (txEnd != txBegin || (UCSR0A & _BV(UDRE0)) == 0){ #endif - txBuffer[txEnd] = data; - txEnd++; - if (txEnd == TX_BUFF_SIZE) txEnd = 0; - if (txEnd == txBegin) txFull = 1; // buffer overflow - } else { + txBuffer[txEnd] = data; + txEnd++; + if (txEnd == TX_BUFF_SIZE) txEnd = 0; + if (txEnd == txBegin) txFull = 1; // buffer overflow + }else{ #if defined(__AVR_ATmega8__) - UDR = data; + UDR = data; #else - UDR0 = data; + UDR0 = data; #endif - } - SREG = oldSREG; - } + } + SREG = oldSREG; + } } // print string -//-------------------------------------------------------------------------------- -void BuffSerial::print(const char *pBuf) -//-------------------------------------------------------------------------------- -{ - while (*pBuf) { - sendByte(*pBuf++); - } +void BuffSerial::print(const char *pBuf){ + while (*pBuf) { + sendByte(*pBuf++); + } } -//-------------------------------------------------------------------------------- -void BuffSerial::print(const char pBuf) -//-------------------------------------------------------------------------------- -{ - sendByte(pBuf); +void BuffSerial::print(const char pBuf){ + sendByte(pBuf); } -//-------------------------------------------------------------------------------- -void BuffSerial::println(const char *pBuf) -//-------------------------------------------------------------------------------- -{ - print(pBuf); - println(); +// print string from flash +void BuffSerial::print_p(const char *pBuf){ + char c; + while ((c = pgm_read_byte_near( pBuf++ ))) { + sendByte(c); + } } -//-------------------------------------------------------------------------------- -void BuffSerial::println(const char pBuf) -//-------------------------------------------------------------------------------- -{ - print(pBuf); - println(); +void BuffSerial::println(const char *pBuf){ + print(pBuf); + println(); } -//-------------------------------------------------------------------------------- -void BuffSerial::println(void) -//-------------------------------------------------------------------------------- -{ - print("\r\n"); +void BuffSerial::println(const char pBuf){ + print(pBuf); + println(); } -//-------------------------------------------------------------------------------- -void BuffSerial::printHex4(uint8_t data) -//-------------------------------------------------------------------------------- -{ - uint8_t c = data & 0x0f; - c += c < 10 ? '0' : 'A' - 10 ; - sendByte(c); +void BuffSerial::println(void){ + print("\r\n"); } -//-------------------------------------------------------------------------------- -void BuffSerial::printHex8(uint8_t data) -//-------------------------------------------------------------------------------- -{ - printHex4(data >> 4); - printHex4(data); +void BuffSerial::println_p(const char *pBuf){ + print_p(pBuf); + println(); } -//-------------------------------------------------------------------------------- -void BuffSerial::printDec(uint8_t data) -//-------------------------------------------------------------------------------- -{ - uint8_t buf[3]; - uint8_t i = 0; - if (data == 0) { - sendByte('0'); - return; - } +void BuffSerial::printHex4(uint8_t data){ + uint8_t c = data & 0x0f; + c += c < 10 ? '0' : 'A' - 10 ; + sendByte(c); +} - while (data > 0) { - buf[i++] = data % 10; - data /= 10; - } - for (; i > 0; i--) - sendByte((buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); +void BuffSerial::printHex8(uint8_t data){ + printHex4(data >> 4); + printHex4(data); +} + +void BuffSerial::printDec(uint8_t data){ + uint8_t buf[3]; + uint8_t i = 0; + if (data == 0){ + sendByte('0'); + return; + } + + while (data > 0){ + buf[i++] = data % 10; + data /= 10; + } + for (; i > 0; i--) + sendByte((buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); } // check rx buffer not empty -//-------------------------------------------------------------------------------- -bool BuffSerial::rxEnabled(void) -//-------------------------------------------------------------------------------- -{ - return rxEnd; +bool BuffSerial::rxEnabled(void){ + return rxEnd; } -//-------------------------------------------------------------------------------- -uint8_t BuffSerial::rxRead(void) -//-------------------------------------------------------------------------------- -{ +uint8_t BuffSerial::rxRead(void){ #if defined(__AVR_ATmega8__) - cbi(UCSRB, RXCIE); // disable RX complete interrupt + cbi(UCSRB, RXCIE); // disable RX complete interrupt #else - cbi(UCSR0B, RXCIE0); // disable RX complete interrupt + cbi(UCSR0B, RXCIE0); // disable RX complete interrupt #endif - uint8_t readkey = rxBuffer[rxBegin]; // read begin of received Buffer - rxBegin++; - if (rxBegin == rxEnd) rxBegin = rxEnd = 0; // if Buffer is empty reset Buffer + uint8_t readkey = rxBuffer[rxBegin]; // read begin of received Buffer + rxBegin++; + if (rxBegin == rxEnd) rxBegin = rxEnd = 0; // if Buffer is empty reset Buffer #if defined(__AVR_ATmega8__) - sbi(UCSRB, RXCIE); // enable RX complete interrupt + sbi(UCSRB, RXCIE); // enable RX complete interrupt #else - sbi(UCSR0B, RXCIE0); // enable RX complete interrupt + sbi(UCSR0B, RXCIE0); // enable RX complete interrupt #endif - return readkey; + return readkey; } BuffSerial bSerial; diff --git a/AVC_LAN_logger/AVCLan_mini/BuffSerial.h b/AVC_LAN_logger/AVCLan_mini/BuffSerial.h index b24067f..0f83417 100644 --- a/AVC_LAN_logger/AVCLan_mini/BuffSerial.h +++ b/AVC_LAN_logger/AVCLan_mini/BuffSerial.h @@ -1,7 +1,9 @@ /* - BuffSerial.h v.01 - serial with transmit buffer library for Wiring - Created by Kochetkov Aleksey, 03.07.2009 + BuffSerial.h - serial with transmit buffer library for Wiring + Created by Kochetkov Aleksey, 28.11.2009 + Version 0.1.2 */ +#include #ifndef BuffSerial_h #define BuffSerial_h @@ -11,6 +13,7 @@ #define TX_BUFF_SIZE 240 // max 65535 #define RX_BUFF_SIZE 25 // max 255 #define TX_BUFF_MAX_LEN TX_BUFF_SIZE - 1 +#define BUFFSERIAL_VERSION "0.1.2" #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) @@ -19,28 +22,30 @@ #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif -class BuffSerial { - public: - uint8_t rxBuffer[RX_BUFF_SIZE]; - uint8_t rxBegin; - uint8_t rxEnd; - uint8_t txBuffer[TX_BUFF_SIZE]; - uint16_t txBegin; - uint16_t txEnd; - uint8_t txFull; - uint16_t txOverflow; - void begin(long); - void sendByte(uint8_t); - void print(const char*); - void print(const char); - void println(const char*); - void println(const char); - void println(void); - void printHex4(uint8_t); - void printHex8(uint8_t); - void printDec(uint8_t); - bool rxEnabled(void); - uint8_t rxRead(void); +class BuffSerial{ + public: + uint8_t rxBuffer[RX_BUFF_SIZE]; + uint8_t rxBegin; + uint8_t rxEnd; + uint8_t txBuffer[TX_BUFF_SIZE]; + uint16_t txBegin; + uint16_t txEnd; + uint8_t txFull; + uint16_t txOverflow; + void begin(long); + void sendByte(uint8_t); + void print(const char*); + void print(const char); + void print_p(const char*); + void println(const char*); + void println(const char); + void println(void); + void println_p(const char*); + void printHex4(uint8_t); + void printHex8(uint8_t); + void printDec(uint8_t); + bool rxEnabled(void); + uint8_t rxRead(void); }; extern BuffSerial bSerial; diff --git a/logs/teraterm_parse.log b/logs/teraterm_parse.log new file mode 100644 index 0000000..2ab6201 --- /dev/null +++ b/logs/teraterm_parse.log @@ -0,0 +1,1711 @@ +< d 183 131 02807C +< d 131 183 040D31023E +< d 183 131 02807C +< b 100 1FF 020030 +< d 131 183 0409013139 +< d 183 131 02807C +< d 131 183 040D31023E +< d 183 131 02807C +< b 183 1FF 020870 +< d 131 183 0409013139 +< d 183 131 02807C +< d 131 183 040D31023E +< d 183 131 02807C +< d 183 100 0501020D312D +< d 100 183 028069 +< d 183 100 0405830275 +< d 100 183 028069 +< d 100 183 0A020700020701244B1083 +< d 183 100 028069 +< d 100 183 060383020D31B3 +< d 183 100 028069 +< d 100 183 08060301000201837F +< d 183 131 040A010D16 +< d 131 183 02807C +< d 183 100 028069 +< d 100 183 0204ED +< d 183 100 028069 +< d 100 183 0710003101020032 +< d 183 131 030B3139 +< d 131 183 02807C +< d 183 100 028069 +< d 183 131 060E02028331C6 +< d 131 183 02807C +< d 100 183 06102431000254 +< d 183 100 028069 +< d 100 183 06104B31003CB5 +!2 +< d 131 183 02807C +< d 131 183 0969310D0001100900C4 +!2 +< d 100 183 0840000D030207034B +< d 183 131 02807C +< d 183 131 0A020700020701244B1096 +!2 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 02807C +< d 131 183 0959310D0001020520C2 +!2 +< d 131 183 02807C +< d 183 131 02807C +< d 183 131 080603010002018392 +< d 131 183 02807C +< d 183 131 07180D310302005C +< d 131 183 02807C +< d 183 131 06182431020271 +< d 131 183 02807C +< d 183 131 06184B31023CD2 +< d 131 183 02807C +< d 183 131 08190D3106015902BB +< d 131 183 02807C +< d 131 183 0859310D0001698083 +< d 183 131 02807C +< d 183 131 08590D3102012001BD - Display FULL +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 08190D310601596922 +< d 131 183 02807C +< d 183 100 08110D000601400357 +< d 100 183 028069 +< d 100 183 08400031030207036F +< d 183 100 028069 +< d 183 131 08480D310302070397 +< d 131 183 02807C +< d 131 183 0819310D06014803AB +< d 183 131 02807C +< d 183 100 08113100060140037B +< d 100 183 028069 +< d 100 183 09600231000110BC3A8A +< d 183 100 028069 +< d 100 183 10600231000100041300E000001D00009F +< d 183 100 028069 +< d 100 183 0940003103020700026F +< d 183 131 09680231020110BC3AA7 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 09480D31030207000297 +< d 131 183 02807C +< d 131 183 0819310D06014800A8 +< d 183 131 02807C +< d 183 131 10680231020100041300E000001D0000BC +< d 131 183 02807C +< d 183 100 081131000601400078 +< d 100 183 028069 +< d 100 183 0D60073100010000021010FF40EE +< d 183 100 028069 +< d 100 183 0F6007310001010F0A828896A90002F4 +< d 183 100 028069 +< d 100 183 0C60073100011006221168003D +!2 +< d 131 183 02807C +< d 183 100 028069 +< d 100 183 116007310001020000000000000000000093 +< d 183 100 028069 +< d 183 131 0F6807310201010F0A828896A9000211 +< d 131 183 02807C +< d 183 131 0C68073102011006221168005A +< d 131 183 02807C +< d 183 131 1168073102010200000000000000000000B0 +< d 131 183 02807C +< d 183 100 09503102000102000076 +< d 100 183 028069 +< d 100 183 08110231040150028A +< d 183 100 028069 +< d 100 183 10600231000100041300E000001D00009F +< d 183 100 028069 +< d 183 131 10680231020100041300E000001D0000BC +< d 131 183 02807C +< d 100 183 0D60073100010000021010FF50FE +< d 183 100 028069 +< d 183 131 0D68073102010000021010FF501B +< d 131 183 02807C +< d 183 131 08590D3102012001BD - Display FULL +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 08590D3102012001BD - Display FULL +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 07100D000100010D +< d 100 183 028069 +< d 183 100 0B600D010001402047000008 +< d 100 183 028069 +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 07100D000100010D +< d 100 183 028069 +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 08590D31020122712F - Display OFF +< d 131 183 02807C +< d 131 183 0819310D04015922D9 +< d 183 131 02807C +< d 183 131 09590D3102019100002E - Action Display HALF +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 09590D31020194FF0030 - Action CAM OFF +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 10600231000200031300E000001D00009F +< d 183 100 028069 +< d 183 131 10680231020200031300E000001D0000BC +< d 131 183 02807C +< d 100 183 10600231000200021300E000001D00009E +< d 183 100 028069 +< d 183 131 10680231020200021300E000001D0000BB +< d 131 183 02807C +< d 100 183 10600231000200011300E000001D00009D +< d 183 100 028069 +< d 183 131 10680231020200011300E000001D0000BA +< d 131 183 02807C +< d 100 183 10600231000200021300E000001D00009E +< d 183 100 028069 +< d 183 131 10680231020200021300E000001D0000BB +< d 131 183 02807C +< d 100 183 10600231000200031300E000001D00009F +< d 183 100 028069 +< d 183 131 10680231020200031300E000001D0000BC +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 10600231000200041300E000001D0000A0 +< d 183 100 028069 +< d 183 131 10680231020200041300E000001D0000BD +< d 131 183 02807C +< d 100 183 10600231000200051300E000001D0000A1 +< d 183 100 028069 +< d 183 131 10680231020200051300E000001D0000BE +< d 131 183 02807C +< d 100 183 10600231000200061300E000001D0000A2 +< d 183 100 028069 +< d 183 131 10680231020200061300E000001D0000BF +< d 131 183 02807C +< d 100 183 10600231000200071300E000001D0000A3 +< d 183 100 028069 +< d 183 131 10680231020200071300E000001D0000C0 +< d 131 183 02807C +< d 100 183 10600231000200061300E000001D0000A2 +< d 183 100 028069 +< d 183 131 10680231020200061300E000001D0000BF +< d 131 183 02807C +< d 100 183 10600231000200051300E000001D0000A1 +< d 183 100 028069 +< d 183 131 10680231020200051300E000001D0000BE +< d 131 183 02807C +< d 100 183 06100231000131 +< d 183 100 028069 +< d 183 131 0618023102014E +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!6 +< d 131 183 0409013139 +< d 183 131 02807C +< d 131 183 040D31023E +< d 183 131 02807C +< b 183 1FF 020870 +< d 131 183 0409013139 +< d 183 131 02807C +< d 131 183 040D31023E +< d 183 131 02807C +< d 183 100 0501020D312D +< d 100 183 028069 +< d 183 100 0405830275 +< d 100 183 028069 +< d 100 183 0A020700020701244B1083 +< d 183 100 028069 +< d 100 183 060383020D31B3 +< d 183 100 028069 +< d 100 183 08060301000201837F +< d 183 131 040A010D16 +< d 131 183 02807C +< d 183 100 028069 +< d 100 183 0204ED +< d 183 100 028069 +< d 100 183 0710003101020032 +< d 183 131 030B3139 +< d 131 183 02807C +< d 183 100 028069 +< d 183 131 060E02028331C6 +< d 131 183 02807C +< d 100 183 06102431000254 +< d 183 100 028069 +< d 100 183 06104B31003CB5 +< d 183 131 020C08 +< d 131 183 02807C +< d 131 183 0969310D0001100900C4 +!2 +< d 100 183 0840000D030207034B +< d 183 131 02807C +< d 131 183 1869310D0001012058A8050000000000000000C6DBE905006F +!2 +< d 131 183 02807C +< d 183 100 028069 +< d 183 131 02807C +< d 131 183 0959310D0001020520C2 +!2 +< d 131 183 02807C +< d 183 131 02807C +< d 183 131 080603010002018392 +< d 131 183 02807C +< d 183 131 07180D310302005C +< d 131 183 02807C +< d 183 131 06182431020271 +< d 131 183 02807C +< d 183 131 06184B31023CD2 +< d 131 183 02807C +< d 183 131 08190D3106015902BB +< d 131 183 02807C +< d 131 183 0859310D0001698083 +< d 183 131 02807C +< d 183 131 08590D3102012001BD - Display FULL +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 08190D310601596922 +< d 131 183 02807C +< d 183 100 08110D000601400357 +< d 100 183 028069 +< d 100 183 08400031030207036F +< d 183 100 028069 +< d 183 131 08480D310302070397 +< d 131 183 02807C +< d 131 183 0819310D06014803AB +< d 183 131 02807C +< d 183 100 08113100060140037B +< d 100 183 028069 +< d 100 183 09600231000110BC3A8A +< d 183 100 028069 +< d 100 183 10600231000100051300E000001D0000A0 +< d 183 100 028069 +< d 100 183 0940003103020700026F +< d 183 131 09680231020110BC3AA7 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 09480D31030207000297 +< d 131 183 02807C +< d 131 183 0819310D06014800A8 +< d 183 131 02807C +< d 183 131 10680231020100051300E000001D0000BD +< d 131 183 02807C +< d 183 100 081131000601400078 +< d 100 183 028069 +< d 100 183 0D60073100010000021010FF40EE +< d 183 100 028069 +< d 100 183 0F6007310001010F0A828896A90002F4 +< d 183 100 028069 +< d 100 183 0C60073100011006221168003D +!2 +< d 131 183 02807C +< d 183 100 028069 +< d 100 183 116007310001020000000000000000000093 +< d 183 100 028069 +< d 183 131 0F6807310201010F0A828896A9000211 +< d 131 183 02807C +< d 183 131 0C68073102011006221168005A +< d 131 183 02807C +< d 183 131 1168073102010200000000000000000000B0 +< d 131 183 02807C +< d 183 100 09503102000102000076 +< d 100 183 028069 +< d 100 183 08110231040150028A +< d 183 100 028069 +< d 100 183 10600231000100051300E000001D0000A0 +< d 183 100 028069 +< d 183 131 10680231020100051300E000001D0000BD +< d 131 183 02807C +< d 100 183 0D60073100010000021010FF50FE +< d 183 100 028069 +< d 183 131 0D68073102010000021010FF501B +< d 131 183 02807C +< d 183 131 08590D3102012001BD - Display FULL +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 08590D3102012001BD - Display FULL +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 07100D000100010D +< d 100 183 028069 +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 07100D000100010D +< d 100 183 028069 +< d 100 183 10600231000200061300E000001D0000A2 +< d 183 100 028069 +< d 183 131 10680231020200061300E000001D0000BF +< d 131 183 02807C +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 100 183 10600231000200071300E000001D0000A3 +< d 183 100 028069 +< d 183 131 10680231020200071300E000001D0000C0 +< d 131 183 02807C +< d 183 131 08590D3102012211CF - Display HALF +< d 131 183 02807C +< d 131 183 0819310D04015922D9 +< d 183 131 02807C +< d 183 131 09590D31020191020030 - Action Display hulf color +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 09590D31020194FF0030 - Action CAM OFF +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +< d 100 183 10600231000200061300E000001D0000A2 +< d 183 100 028069 +< d 183 131 10680231020200061300E000001D0000BF +< d 131 183 02807C +< d 100 183 06100231000131 +< d 183 100 028069 +< d 183 131 0618023102014E +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 06100231000131 +< d 183 100 028069 +< d 100 183 0940003103024B0000B1 +< d 183 100 028069 +< d 183 131 0618023102014E +< d 131 183 02807C +< d 183 131 09480D3103024B0000D9 +< d 131 183 02807C +< d 131 183 0819310D06014800A8 +< d 183 131 02807C +< d 183 100 081131000601400078 +< d 100 183 028069 +< d 100 183 1D604B310002101F4E00BF0000000000AAC000000000AAC100FBEE0001DD +< d 183 100 028069 +< d 100 183 20604B31000200F460FFFFFF0F000F07FFFFFFFF21300F000F240020302000005A +!2 +< d 183 100 028069 +< d 100 183 1F604B310002016666660000000514051400000000000098FF05140000003029 +!2 +< d 183 100 028069 +< d 100 183 10604B310002080F00000FFF0F010F243D +< d 183 100 028069 +< d 100 183 1B604B310002090F0000000F000FFF0FFF0FFF0FFF0FFF0FFF0FFF69 +!2 +< d 183 100 028069 +< d 131 183 02807C +< d 100 183 1D604B3100020A0F000F0000000FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF7A +!2 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 10684B310202080F00000FFF0F010F245A +< d 131 183 02807C +< d 183 131 1B684B310202090F0000000F000FFF0FFF0FFF0FFF0FFF0FFF0FFF86 +< d 131 183 02807C +< d 183 131 1D684B3102020A0F000F0000000FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF97 +< d 131 183 02807C +< d 100 183 0970003103024B0000E1 +< d 183 100 028069 +< d 183 131 09780D3103024B000009 +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1030F000F07FFFFFFFF21300F000F2400203020000051 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1030F000F07FFFFFFFF21300F000F240020302000006E +< d 131 183 02807C +< d 100 183 19604B310003700100524F4F54FFFFFFFFFFFFFFFFFFFFFFFF88 +< d 183 100 028069 +< d 100 183 19604B310003700110FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +< d 183 100 028069 +< d 183 131 19684B310203700100524F4F54FFFFFFFFFFFFFFFFFFFFFFFFA5 +< d 131 183 02807C +< d 183 131 19684B310203700110FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +< d 131 183 02807C +< d 100 183 19604B310003710202004E004F004100320053007600670066FA +< d 183 100 028069 +< d 100 183 19604B310003710212004D006C004C0056002E00310032003888 +< d 183 100 028069 +< d 183 131 19684B310203710202004E004F00410032005300760067006617 +< d 131 183 02807C +< d 183 131 19684B310203710212004D006C004C0056002E003100320038A5 +< d 131 183 02807C +< d 183 100 0A50314B000114F00722EB +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1040F000F07FFFFFFFF21300F000F2400203020000052 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1040F000F07FFFFFFFF21300F000F240020302000006F +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F071222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F071222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +< d 131 183 02807C +< d 100 183 19604B310003720400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +< d 183 100 028069 +< d 100 183 19604B310003720410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +< d 183 100 028069 +< d 183 131 19684B310203720400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +< d 131 183 02807C +< d 183 131 19684B310203720410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +< d 131 183 02807C +< d 100 183 19604B310003740400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +< d 183 100 028069 +< d 100 183 19604B310003740410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +< d 183 100 028069 +< d 183 131 19684B310203740400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +< d 131 183 02807C +< d 183 131 19684B310203740410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +< d 131 183 02807C +< d 100 183 19604B310003730400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +< d 183 100 028069 +< d 100 183 19604B310003730410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +< d 183 100 028069 +< d 183 131 19684B310203730400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +< d 131 183 02807C +< d 183 131 19684B310203730410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1050F000F07FFFFFFFF21300F000F2400203020000053 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1050F000F07FFFFFFFF21300F000F2400203020000070 +< d 131 183 02807C +< d 100 183 19604B310003750400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +< d 183 100 028069 +< d 100 183 19604B310003750410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +< d 183 100 028069 +< d 183 131 19684B310203750400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +< d 131 183 02807C +< d 183 131 19684B310203750410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1060F000F07FFFFFFFF21300F000F2400203020000054 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1060F000F07FFFFFFFF21300F000F2400203020000071 +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1070F000F07FFFFFFFF21300F000F2400203020000055 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1070F000F07FFFFFFFF21300F000F2400203020000072 +< d 131 183 02807C +< d 100 183 0970003103024B0000E1 +< d 183 100 028069 +< d 183 131 09780D3103024B000009 +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1080F000F07FFFFFFFF21300F000F2400203020000056 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1080F000F07FFFFFFFF21300F000F2400203020000073 +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1090F000F07FFFFFFFF21300F000F2400203020000057 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1090F000F07FFFFFFFF21300F000F2400203020000074 +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1100F000F07FFFFFFFF21300F000F240020302000005E +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1100F000F07FFFFFFFF21300F000F240020302000007B +< d 131 183 02807C +< d 100 183 20604B31000300F460FFF1110F000F07FFFFFFFF21300F000F240020302000005F +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1110F000F07FFFFFFFF21300F000F240020302000007C +< d 131 183 02807C +< d 183 100 0950314B000117F000C4 +< d 100 183 028069 +< d 100 183 08114B3104035017EA +< d 183 100 028069 +< d 100 183 11604B3100030B0F00000FFF0F010F240143 +< d 183 100 028069 +< d 183 131 11684B3102030B0F00000FFF0F010F240160 +< d 131 183 02807C +< d 183 100 0B50314B000119F0000000C8 +< d 100 183 028069 +< d 100 183 08114B3104035019EC +< d 183 100 028069 +< d 100 183 1E604B3100030D0F000F0000000FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF0180 +< d 183 100 028069 +< d 183 131 1E684B3102030D0F000F0000000FFF0FFF0FFF0FFF0FFF0FFF0FFF0FFF019D +< d 131 183 02807C +< d 183 100 0A50314B000114F00100C3 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F01020200300076004700360054006400550043F1 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F0102120052007400420037002E00310032003896 +< d 183 131 1E684B310203770F00000F010202003000760047003600540064005500430E +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F0102120052007400420037002E003100320038B3 +< d 131 183 02807C +< d 183 100 0A50314B000114F00122E5 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F010222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F010222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +< d 131 183 02807C +< d 183 100 0A50314B000114F00200C4 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1120F000F07FFFFFFFF21300F000F2400203020000060 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1120F000F07FFFFFFFF21300F000F240020302000007D +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F0202020032006E0043003400760067004B004907 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F020212006A006A0057006A002E003100320038ED +< d 183 131 1E684B310203770F00000F0202020032006E0043003400760067004B004924 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F020212006A006A0057006A002E0031003200380A +< d 131 183 02807C +< d 183 100 0A50314B000114F00222E6 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F0202220020002800310029FFFFFFFFFFFFFFFF39 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F0202220020002800310029FFFFFFFFFFFFFFFF56 +< d 131 183 02807C +< d 183 100 0A50314B000114F00300C5 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1130F000F07FFFFFFFF21300F000F2400203020000061 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1130F000F07FFFFFFFF21300F000F240020302000007E +< d 131 183 02807C +< d 100 183 0970003103024B0000E1 +< d 183 100 028069 +< d 183 131 09780D3103024B000009 +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F0302020032006E0043003400760067004B004908 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F030212006A006A0057006A002E003100320038EE +< d 183 131 1E684B310203770F00000F0302020032006E0043003400760067004B004925 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F030212006A006A0057006A002E0031003200380B +< d 131 183 02807C +< d 183 100 0A50314B000114F00322E7 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F030222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F030222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +< d 131 183 02807C +< d 183 100 0A50314B000114F00400C6 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F040202003700610047004700750042006B00642D +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F0402120073003400580039002E00310032003892 +< d 183 131 1E684B310203770F00000F040202003700610047004700750042006B00644A +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F0402120073003400580039002E003100320038AF +< d 131 183 02807C +< d 183 100 0A50314B000114F00422E8 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1140F000F07FFFFFFFF21300F000F2400203020000062 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1140F000F07FFFFFFFF21300F000F240020302000007F +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F040222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F040222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +< d 131 183 02807C +< d 183 100 0A50314B000114F00500C7 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F0502020044007400500056004A0072007700697C +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F050212005200740053004F002E003100320038C3 +!2 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F050212005200740053004F002E003100320038E0 +< d 131 183 02807C +< d 183 100 0A50314B000114F00522E9 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F050222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F050222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +< d 131 183 02807C +< d 183 100 0A50314B000114F00600C8 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1150F000F07FFFFFFFF21300F000F2400203020000063 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1150F000F07FFFFFFFF21300F000F2400203020000080 +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F060202004A00340069006700550030006E00793D +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F06021200710053004E0057002E003100320038C5 +< d 183 131 1E684B310203770F00000F060202004A00340069006700550030006E00795A +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F06021200710053004E0057002E003100320038E2 +< d 131 183 02807C +< d 183 100 0A50314B000114F00622EA +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F060222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F060222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +< d 131 183 02807C +< d 183 100 0A50314B000114F00700C9 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1160F000F07FFFFFFFF21300F000F2400203020000064 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1160F000F07FFFFFFFF21300F000F2400203020000081 +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F071202004E004F0041003200530076006700663A +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F071212004D006C004C0056002E003100320038C8 +< d 183 131 1E684B310203770F00000F071202004E004F00410032005300760067006657 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F071212004D006C004C0056002E003100320038E5 +< d 131 183 02807C +< d 183 100 0A50314B000114F00722EB +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F071222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F071222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +< d 131 183 02807C +< d 183 100 0A50314B000114F00800CA +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F080202004E006200480038004E006B0062006F3F +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F08021200410035007A0036002E00310032003884 +< d 183 131 1E684B310203770F00000F080202004E006200480038004E006B0062006F5C +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F08021200410035007A0036002E003100320038A1 +< d 131 183 02807C +< d 183 100 0A50314B000114F00822EC +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1170F000F07FFFFFFFF21300F000F2400203020000065 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1170F000F07FFFFFFFF21300F000F2400203020000082 +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F080222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F080222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +< d 131 183 02807C +< d 183 100 0A50314B000114F00900CB +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F090202004E006A00470035004B00390076006519 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F0902120066003300790050002E003100320038C1 +< d 183 131 1E684B310203770F00000F090202004E006A00470035004B00390076006536 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F0902120066003300790050002E003100320038DE +< d 131 183 02807C +< d 183 100 0A50314B000114F00922ED +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F090222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F090222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +< d 131 183 02807C +< d 183 100 0A50314B000114F01000D2 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1180F000F07FFFFFFFF21300F000F2400203020000066 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1180F000F07FFFFFFFF21300F000F2400203020000083 +< d 131 183 02807C +< d 100 183 0970003103024B0000E1 +< d 183 100 028069 +< d 183 131 09780D3103024B000009 +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F100202004F006300410057006B0071006B005775 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F1002120041006C00710067002E003100320038EB +< d 183 131 1E684B310203770F00000F100202004F006300410057006B0071006B005792 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F1002120041006C00710067002E00310032003808 +< d 131 183 02807C +< d 183 100 0A50314B000114F01022F4 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F100222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F100222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +< d 131 183 02807C +< d 183 100 0A50314B000114F01100D3 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1190F000F07FFFFFFFF21300F000F2400203020000067 +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1190F000F07FFFFFFFF21300F000F2400203020000084 +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F1102020052007400780063006300560054004682 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F1102120043003400750032002E00310032003885 +< d 183 131 1E684B310203770F00000F110202005200740078006300630056005400469F +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F1102120043003400750032002E003100320038A2 +< d 131 183 02807C +< d 183 100 0A50314B000114F01122F5 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F110222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F110222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +< d 131 183 02807C +< d 183 100 0A50314B000114F01200D4 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F120202005400370072007A004600580039006C49 +< d 183 100 028069 +< d 100 183 1E604B310003770F00000F1202120077007000650068002E0031003200381C +< d 183 131 1E684B310203770F00000F120202005400370072007A004600580039006C66 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B310203770F00000F1202120077007000650068002E00310032003839 +< d 131 183 02807C +< d 183 100 0A50314B000114F01222F6 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 20604B31000300F460FFF1200F000F07FFFFFFFF21300F000F240020302000006E +< d 183 100 028069 +< d 183 131 20684B31020300F460FFF1200F000F07FFFFFFFF21300F000F240020302000008B +< d 131 183 02807C +< d 100 183 1E604B310003770F00000F120222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +< d 183 100 028069 +< d 183 131 1E684B310203770F00000F120222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +< d 131 183 02807C +< d 183 100 0A50314B000114F01300D5 +< d 100 183 028069 +< d 100 183 08114B3104035014E7 +< d 183 100 028069 +< d 100 183 06100231000030 +< d 183 100 028069 +< d 100 183 084000310302000166 +< d 183 100 028069 +< d 183 131 0618023102004D +< d 131 183 02807C +< d 183 131 08480D31030200018E +< d 131 183 02807C +< d 131 183 0819310D06014801A9 +< d 183 131 02807C +< d 183 100 081131000601400179 +< d 100 183 028069 +< d 100 183 06104B31003CB5 +< d 183 100 028069 +< d 183 131 06184B31023CD2 +< d 131 183 02807C +< d 100 183 1E604B31003C770F00000F1302020056004F0077006E004E0043005100396E +< d 183 100 028069 +< d 100 183 1E604B31003C770F00000F1302120054003500370074002E003100320038D6 +< d 183 131 1E684B31023C770F00000F1302020056004F0077006E004E0043005100398B +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 1E684B31023C770F00000F1302120054003500370074002E003100320038F3 +< d 131 183 02807C +< d 100 183 06100231000030 +< d 183 100 028069 +< d 183 131 0618023102004D +< d 131 183 02807C +< d 100 183 07100031D3020004 +< d 183 100 028069 +< d 100 183 106002310000000A1300E000001D0000A4 +< d 183 100 028069 +< d 183 131 07180D31D302002C +< d 131 183 02807C +< d 183 131 106802310200000A1300E000001D0000C1 +< d 131 183 02807C +< d 100 183 0710003103020034 +< d 183 100 028069 +< d 100 183 10600231000000061300E000001D0000A0 +< d 183 100 028069 +< d 183 131 07180D310302005C +< d 131 183 02807C +< d 183 131 10680231020000061300E000001D0000BD +< d 131 183 02807C +< d 100 183 06100231000030 +< d 183 100 028069 +< d 183 131 0618023102004D +< d 131 183 02807C +< d 183 100 0B600D01000140204900000A +< d 100 183 028069 +< d 100 183 09600231000110BC3A8A +< d 183 100 028069 +< d 100 183 10600231000100061300E000001D0000A1 +< d 183 100 028069 +< d 100 183 0940003103020700026F +< d 183 131 09680231020110BC3AA7 +< d 183 100 028069 +< d 131 183 02807C +< d 183 131 09480D31030207000297 +< d 131 183 02807C +< d 131 183 0819310D06014800A8 +< d 183 131 02807C +< d 183 131 10680231020100061300E000001D0000BE +< d 131 183 02807C +< d 183 100 081131000601400078 +< d 100 183 028069 +< d 100 183 0D60073100010000021010FF40EE +< d 183 100 028069 +< d 100 183 0F6007310001010F0A828896A90002F4 +< d 183 100 028069 +< d 100 183 0C60073100011006221168003D +!2 +< d 131 183 02807C +< d 183 100 028069 +< d 100 183 116007310001020000000000000000000093 +< d 183 100 028069 +< d 183 131 0F6807310201010F0A828896A9000211 +< d 131 183 02807C +< d 183 131 0C68073102011006221168005A +< d 131 183 02807C +< d 183 131 1168073102010200000000000000000000B0 +< d 131 183 02807C +< d 100 183 0D60073100010000021010FF50FE +< d 183 100 028069 +< d 183 131 0D68073102010000021010FF501B +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 09590D3102019100002E - Action Display HALF +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 09590D31020194000031 - Action Cam ON +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +< d 183 131 06170D3102146B +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 09590D31020191020030 - Action Display hulf color +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 09590D31020194FF0030 - Action CAM OFF +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402050000011 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 10600231000200071300E000001D0000A3 +< d 183 100 028069 +< d 183 131 10680231020200071300E000001D0000C0 +< d 131 183 02807C +< d 100 183 10600231000200061300E000001D0000A2 +< d 183 100 028069 +< d 183 131 10680231020200061300E000001D0000BF +< d 131 183 02807C +< d 100 183 06100231000131 +< d 183 100 028069 +< d 183 131 0618023102014E +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 10600231000200051300E000001D0000A1 +< d 183 100 028069 +< d 183 131 10680231020200051300E000001D0000BE +< d 131 183 02807C +< d 100 183 10600231000200041300E000001D0000A0 +< d 183 100 028069 +< d 183 131 10680231020200041300E000001D0000BD +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 10600231000200051300E000001D0000A1 +< d 183 100 028069 +< d 183 131 10680231020200051300E000001D0000BE +< d 131 183 02807C +< d 100 183 10600231000200061300E000001D0000A2 +< d 183 100 028069 +< d 183 131 10680231020200061300E000001D0000BF +< d 131 183 02807C +< d 100 183 06100231000131 +< d 183 100 028069 +< d 183 131 0618023102014E +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402051000012 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402051000012 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402052000013 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402053000014 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402054000015 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402054000015 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402055000016 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 10600231000200071300E000001D0000A3 +< d 183 100 028069 +< d 183 131 10680231020200071300E000001D0000C0 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 10600231000200081300E000001D0000A4 +< d 183 100 028069 +< d 183 131 10680231020200081300E000001D0000C1 +< d 131 183 02807C +< d 100 183 06100231000131 +< d 183 100 028069 +< d 183 131 0618023102014E +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 183 100 0B600D010001402056000017 +< d 100 183 028069 +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 09590D3102019100002E - Action Display HALF +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 09590D31020194000031 - Action Cam ON +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +< d 183 131 06170D3102146B +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 09590D31020191020030 - Action Display hulf color +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 09590D31020194FF0030 - Action CAM OFF +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 09590D3102019100002E - Action Display HALF +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 09590D31020194000031 - Action Cam ON +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +< d 183 131 06170D3102146B +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 09590D31020191020030 - Action Display hulf color +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 08590D3102012101BE - BUTTON PRESS +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 09590D31020194FF0030 - Action CAM OFF +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +< d 100 183 0970003103020700029F +< d 183 100 028069 +< d 183 131 09780D310302070002C7 +< d 131 183 02807C +!2 +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +< d 131 183 0409013139 +< d 183 131 02807C +< d 131 183 040D31023E +< d 183 131 02807C +< d 183 131 040A010D16 +< d 131 183 02807C +< d 183 131 030B3139 +< d 131 183 02807C +< d 183 131 060E02028331C6 +< d 131 183 02807C +< d 183 131 020C08 +< d 131 183 02807C +< d 131 183 0969310D0001100900C4 +< d 183 131 02807C +< d 183 131 020C08 +< d 131 183 1869310D0001012058A8050000000000000000C6DBE905006F +< d 183 131 02807C +< d 131 183 02807C +< d 131 183 0959310D0001020520C2 +< d 183 131 02807C +< d 183 131 020C08 +< d 131 183 02807C +< d 183 131 020C08 +< d 131 183 02807C +< d 183 131 08190D3106015902BB +< d 131 183 02807C +< d 131 183 0859310D0001698083 +< d 183 131 02807C +< d 183 131 08590D3100012001BB +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 08190D310601596922 +< d 131 183 02807C +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +< d 183 131 08590D3100012001BB +< d 131 183 02807C +< d 131 183 0819310D04015920D7 +< d 183 131 02807C +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +< d 183 131 06170D31020158 +< d 131 183 02807C +< d 183 131 06170D31020158 +< d 131 183 02807C +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +!5 +< d 131 183 02807C +< d 131 183 0819310D04015921D8 +< d 183 131 02807C +< d 183 131 08590D3100012211CD +< d 131 183 02807C +< d 131 183 0819310D04015922D9 +< d 183 131 02807C + +< d 131 183 02807C +< d 131 183 0819310D0401599148 +< d 183 131 02807C +< d 183 131 09590D31020194000031 - Action Cam ON +< d 131 183 02807C +< d 131 183 0819310D040159944B +< d 183 131 02807C + +< d 131 183 02807C +< d 131 183 0819310D04015922D9 +< d 183 131 02807C +