@ -10612,8 +10612,13 @@ function onOpen(openInfo) {
FC . resetState ( ) ;
// request configuration data
// request configuration data. Start with MSPv1 and
// upgrade to MSPv2 if possible.
MSP . protocolVersion = MSP . constants . PROTOCOL _V1 ;
MSP . send _message ( MSPCodes . MSP _API _VERSION , false , false , function ( ) {
if ( CONFIG . apiVersion && semver . gte ( CONFIG . apiVersion , "2.0.0" ) ) {
MSP . protocolVersion = MSP . constants . PROTOCOL _V2 ;
}
GUI . log ( chrome . i18n . getMessage ( 'apiVersionReceived' , [ CONFIG . apiVersion ] ) ) ;
if ( semver . gte ( CONFIG . apiVersion , CONFIGURATOR . apiVersionAccepted ) ) {
@ -11787,6 +11792,8 @@ var MSP = {
UNSUPPORTED : '!' . charCodeAt ( 0 ) ,
} ,
constants : {
PROTOCOL _V1 : 1 ,
PROTOCOL _V2 : 2 ,
JUMBO _FRAME _MIN _SIZE : 255 ,
} ,
decoder _states : {
@ -11794,20 +11801,22 @@ var MSP = {
PROTO _IDENTIFIER : 1 ,
DIRECTION _V1 : 2 ,
DIRECTION _V2 : 3 ,
PAYLOAD _LENGTH _V1 : 4 ,
PAYLOAD _LENGTH _JUMBO _LOW : 5 ,
PAYLOAD _LENGTH _JUMBO _HIGH : 6 ,
PAYLOAD _LENGTH _V2 _LOW : 7 ,
PAYLOAD _LENGTH _V2 _HIGH : 8 ,
CODE _V1 : 9 ,
CODE _JUMBO _V1 : 10 ,
CODE _V2 _LOW : 11 ,
CODE _V2 _HIGH : 12 ,
PAYLOAD _V1 : 13 ,
PAYLOAD _V2 : 14 ,
CHECKSUM _V1 : 15 ,
CHECKSUM _V2 : 16 ,
FLAG _V2 : 4 ,
PAYLOAD _LENGTH _V1 : 5 ,
PAYLOAD _LENGTH _JUMBO _LOW : 6 ,
PAYLOAD _LENGTH _JUMBO _HIGH : 7 ,
PAYLOAD _LENGTH _V2 _LOW : 8 ,
PAYLOAD _LENGTH _V2 _HIGH : 9 ,
CODE _V1 : 10 ,
CODE _JUMBO _V1 : 11 ,
CODE _V2 _LOW : 12 ,
CODE _V2 _HIGH : 13 ,
PAYLOAD _V1 : 14 ,
PAYLOAD _V2 : 15 ,
CHECKSUM _V1 : 16 ,
CHECKSUM _V2 : 17 ,
} ,
protocolVersion : 1 , // this.constants.PROTOCOL_V1
state : 0 , // this.decoder_states.IDLE
message _direction : 1 ,
code : 0 ,
@ -11844,12 +11853,15 @@ var MSP = {
this . state = this . decoder _states . DIRECTION _V1 ;
break ;
case this . symbols . PROTO _V2 :
// eventually, MSPv2
this . state = this . decoder _states . DIRECTION _V2 ;
break ;
default :
console . log ( "Unknown protocol char " + String . fromCharCode ( data [ i ] ) ) ;
this . state = this . decoder _states . IDLE ;
}
break ;
case this . decoder _states . DIRECTION _V1 : // direction (should be >)
case this . decoder _states . DIRECTION _V2 :
this . unsupported = 0 ;
switch ( data [ i ] ) {
case this . symbols . FROM _MWC :
@ -11862,7 +11874,13 @@ var MSP = {
this . unsupported = 1 ;
break ;
}
this . state = this . decoder _states . PAYLOAD _LENGTH _V1 ;
this . state = this . state == this . decoder _states . DIRECTION _V1 ?
this . decoder _states . PAYLOAD _LENGTH _V1 :
this . decoder _states . FLAG _V2 ;
break ;
case this . decoder _states . FLAG _V2 :
// Ignored for now
this . state = this . decoder _states . CODE _V2 _LOW ;
break ;
case this . decoder _states . PAYLOAD _LENGTH _V1 :
this . message _length _expected = data [ i ] ;
@ -11875,6 +11893,17 @@ var MSP = {
}
break ;
case this . decoder _states . PAYLOAD _LENGTH _V2 _LOW :
this . message _length _expected = data [ i ] ;
this . state = this . decoder _states . PAYLOAD _LENGTH _V2 _HIGH ;
break ;
case this . decoder _states . PAYLOAD _LENGTH _V2 _HIGH :
this . message _length _expected |= data [ i ] << 8 ;
this . _initialize _read _buffer ( ) ;
this . state = this . message _length _expected > 0 ?
this . decoder _states . PAYLOAD _V2 :
this . state = this . decoder _states . CHECKSUM _V2 ;
break ;
case this . decoder _states . CODE _V1 :
case this . decoder _states . CODE _JUMBO _V1 :
this . code = data [ i ] ;
@ -11890,6 +11919,14 @@ var MSP = {
this . state = this . decoder _states . CHECKSUM _V1 ;
}
break ;
case this . decoder _states . CODE _V2 _LOW :
this . code = data [ i ] ;
this . state = this . decoder _states . CODE _V2 _HIGH ;
break ;
case this . decoder _states . CODE _V2 _HIGH :
this . message _length _expected |= data [ i ] << 8 ;
this . state = this . decoder _states . PAYLOAD _LENGTH _V2 _LOW ;
break ;
case this . decoder _states . PAYLOAD _LENGTH _JUMBO _LOW :
this . message _length _expected = data [ i ] ;
this . state = this . decoder _states . PAYLOAD _LENGTH _JUMBO _HIGH ;
@ -11900,11 +11937,14 @@ var MSP = {
this . state = this . decoder _states . PAYLOAD _V1 ;
break ;
case this . decoder _states . PAYLOAD _V1 :
case this . decoder _states . PAYLOAD _V2 :
this . message _buffer _uint8 _view [ this . message _length _received ] = data [ i ] ;
this . message _length _received ++ ;
if ( this . message _length _received >= this . message _length _expected ) {
this . state = this . decoder _states . CHECKSUM _V1 ;
this . state = this . state == this . decoder _states . PAYLOAD _V1 ?
this . decoder _states . CHECKSUM _V1 :
this . decoder _states . CHECKSUM _V2 ;
}
break ;
case this . decoder _states . CHECKSUM _V1 :
@ -11921,26 +11961,20 @@ var MSP = {
for ( var ii = 0 ; ii < this . message _length _received ; ii ++ ) {
this . message _checksum ^= this . message _buffer _uint8 _view [ ii ] ;
}
if ( this . message _checksum == data [ i ] ) {
// message received, process
mspHelper . processData ( this ) ;
} else {
console . log ( 'code: ' + this . code + ' - crc failed' ) ;
this . packet _error ++ ;
$ ( 'span.packet-error' ) . html ( this . packet _error ) ;
this . _dispatch _message ( data [ i ] ) ;
break ;
case this . decoder _states . CHECKSUM _V2 :
this . message _checksum = 0 ;
this . message _checksum = this . _crc8 _dvb _s2 ( this . message _checksum , 0 ) ; // flag
this . message _checksum = this . _crc8 _dvb _s2 ( this . message _checksum , this . code & 0xFF ) ;
this . message _checksum = this . _crc8 _dvb _s2 ( this . message _checksum , ( this . code & 0xFF00 ) >> 8 ) ;
this . message _checksum = this . _crc8 _dvb _s2 ( this . message _checksum , this . message _length _expected & 0xFF ) ;
this . message _checksum = this . _crc8 _dvb _s2 ( this . message _checksum , ( this . message _length _expected & 0xFF00 ) >> 8 ) ;
for ( var ii = 0 ; ii < this . message _length _received ; ii ++ ) {
this . message _checksum = this . _crc8 _dvb _s2 ( this . message _checksum , this . message _buffer _uint8 _view [ ii ] ) ;
}
/ *
* Free port
* /
helper . mspQueue . freeHardLock ( ) ;
// Reset variables
this . message _length _received = 0 ;
this . state = this . decoder _states . IDLE ;
this . _dispatch _message ( data [ i ] ) ;
break ;
default :
/ *
* Free port
@ -11957,6 +11991,26 @@ var MSP = {
this . message _buffer _uint8 _view = new Uint8Array ( this . message _buffer ) ;
} ,
_dispatch _message : function ( expected _checksum ) {
if ( this . message _checksum == expected _checksum ) {
// message received, process
mspHelper . processData ( this ) ;
} else {
console . log ( 'code: ' + this . code + ' - crc failed' ) ;
this . packet _error ++ ;
$ ( 'span.packet-error' ) . html ( this . packet _error ) ;
}
/ *
* Free port
* /
helper . mspQueue . freeHardLock ( ) ;
// Reset variables
this . message _length _received = 0 ;
this . state = this . decoder _states . IDLE ;
} ,
/ * *
*
* @ param { MSP } mspData
@ -11979,48 +12033,60 @@ var MSP = {
} ,
send _message : function ( code , data , callback _sent , callback _msp ) {
var bufferOut ,
bufView ,
i ;
// always reserve 6 bytes for protocol overhead !
if ( data ) {
var size = data . length + 6 ,
checksum ;
bufferOut = new ArrayBuffer ( size ) ;
bufView = new Uint8Array ( bufferOut ) ;
bufView [ 0 ] = 36 ; // $
bufView [ 1 ] = 77 ; // M
bufView [ 2 ] = 60 ; // <
bufView [ 3 ] = data . length ;
bufView [ 4 ] = code ;
checksum = bufView [ 3 ] ^ bufView [ 4 ] ;
for ( i = 0 ; i < data . length ; i ++ ) {
bufView [ i + 5 ] = data [ i ] ;
checksum ^= bufView [ i + 5 ] ;
}
bufView [ 5 + data . length ] = checksum ;
} else {
bufferOut = new ArrayBuffer ( 6 ) ;
bufView = new Uint8Array ( bufferOut ) ;
var payloadLength = data && data . length ? data . length : 0 ;
var length ;
var buffer ;
var view ;
var checksum ;
var ii ;
switch ( this . protocolVersion ) {
case this . constants . PROTOCOL _V1 :
length = payloadLength + 6 ;
buffer = new ArrayBuffer ( length ) ;
view = new Uint8Array ( buffer ) ;
view [ 0 ] = this . symbols . BEGIN ;
view [ 1 ] = this . symbols . PROTO _V1 ;
view [ 2 ] = this . symbols . TO _MWC ;
view [ 3 ] = payloadLength ;
view [ 4 ] = code ;
checksum = view [ 3 ] ^ view [ 4 ] ;
for ( ii = 0 ; ii < payloadLength ; ii ++ ) {
view [ ii + 5 ] = data [ ii ] ;
checksum ^= data [ ii ] ;
}
view [ length - 1 ] = checksum ;
break ;
case this . constants . PROTOCOL _V2 :
length = payloadLength + 9 ;
buffer = new ArrayBuffer ( length ) ;
view = new Uint8Array ( buffer ) ;
view [ 0 ] = this . symbols . BEGIN ;
view [ 1 ] = this . symbols . PROTO _V2 ;
view [ 2 ] = this . symbols . TO _MWC ;
view [ 3 ] = 0 ; // flag: reserved, set to 0
view [ 4 ] = code & 0xFF ; // code lower byte
view [ 5 ] = ( code & 0xFF00 ) >> 8 ; // code upper byte
view [ 6 ] = payloadLength & 0xFF ; // payloadLength lower byte
view [ 7 ] = ( payloadLength & 0xFF00 ) >> 8 ; // payloadLength upper byte
for ( ii = 0 ; ii < payloadLength ; ii ++ ) {
view [ 8 + ii ] = data [ ii ] ;
}
checksum = 0 ;
for ( ii = 3 ; ii < length - 1 ; ii ++ ) {
checksum = this . _crc8 _dvb _s2 ( checksum , view [ ii ] ) ;
}
view [ length - 1 ] = checksum ;
break ;
default :
throw "Invalid MSP protocol version " + this . protocolVersion ;
bufView [ 0 ] = 36 ; // $
bufView [ 1 ] = 77 ; // M
bufView [ 2 ] = 60 ; // <
bufView [ 3 ] = 0 ; // data length
bufView [ 4 ] = code ; // code
bufView [ 5 ] = bufView [ 3 ] ^ bufView [ 4 ] ; // checksum
}
var message = new MspMessageClass ( ) ;
message . code = code ;
message . messageBody = bufferOut ;
message . messageBody = buffer ;
message . onFinish = callback _msp ;
message . onSend = callback _sent ;
@ -12034,6 +12100,17 @@ var MSP = {
helper . mspQueue . put ( message ) ;
return true ;
} ,
_crc8 _dvb _s2 : function ( crc , ch ) {
crc ^= ch ;
for ( var ii = 0 ; ii < 8 ; ++ ii ) {
if ( crc & 0x80 ) {
crc = ( ( crc << 1 ) & 0xFF ) ^ 0xD5 ;
} else {
crc = ( crc << 1 ) & 0xFF ;
}
}
return crc ;
} ,
promise : function ( code , data ) {
var self = this ;