cwEuCon.cpp,fader.h/cpp : Initial updates to support Euphonix application messages.
This commit is contained in:
parent
0d977a4647
commit
d8249ab99a
59
cwEuCon.cpp
59
cwEuCon.cpp
@ -308,7 +308,11 @@ namespace cw
|
||||
kSendHandshake_0_Id, // send [0x0a, ...]
|
||||
kWaitForBeat_1_Id, // wait for first heart beat -> then send [0x0c ...]
|
||||
kWaitForHandshake_2_Id, // wait for [0x0d ...] -> then send response_3_a
|
||||
kRunning_3_Id
|
||||
kResponse_3_A_Id,
|
||||
kResponse_3_B_Id,
|
||||
kResponse_4_A_Id,
|
||||
kResponse_4_B_Id,
|
||||
kRunning_Id
|
||||
};
|
||||
|
||||
typedef struct eucon_str
|
||||
@ -344,8 +348,22 @@ namespace cw
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc_t _send_response( socket::handle_t sockH, const char* packet )
|
||||
{
|
||||
rc_t rc = kOkRC;
|
||||
|
||||
// send the initial handshake
|
||||
if((rc = socket::send( sockH, packet, strlen(packet) )) != kOkRC )
|
||||
{
|
||||
rc = cwLogError(rc,"TCP '%s' request failed.");
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc_t _sendHandshake_0( socket::handle_t sockH, const char* label )
|
||||
{
|
||||
/*
|
||||
rc_t rc = kOkRC;
|
||||
unsigned char buf[88];
|
||||
memset(buf,0,88);
|
||||
@ -358,10 +376,13 @@ namespace cw
|
||||
}
|
||||
|
||||
return rc;
|
||||
*/
|
||||
return _send_response(sockH,RESPONSE_1);
|
||||
}
|
||||
|
||||
rc_t _sendHandshake_1( socket::handle_t sockH )
|
||||
{
|
||||
/*
|
||||
rc_t rc = kOkRC;
|
||||
unsigned char buf[4];
|
||||
memset(buf,0,4);
|
||||
@ -374,20 +395,10 @@ namespace cw
|
||||
}
|
||||
|
||||
return rc;
|
||||
*/
|
||||
return _send_response(sockH,RESPONSE_2);
|
||||
}
|
||||
|
||||
rc_t _send_response( const char* packet )
|
||||
{
|
||||
rc_t rc = kOkRC;
|
||||
|
||||
// send the initial handshake
|
||||
if((rc = socket::send( sockH, packet, strlen(packet) )) != kOkRC )
|
||||
{
|
||||
rc = cwLogError(rc,"TCP '%s' request failed.");
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void _udpReceiveCallback( void* arg, const void* data, unsigned dataByteCnt, const struct sockaddr_in* fromAddr )
|
||||
{
|
||||
@ -471,9 +482,29 @@ namespace cw
|
||||
case kWaitForHandshake_2_Id:
|
||||
if( hdr == 0x0d )
|
||||
{
|
||||
p->protoState = kRunning_3_Id;
|
||||
p->protoState = kResponse_3_A_Id;
|
||||
}
|
||||
break;
|
||||
|
||||
case kResponse_3_A_Id:
|
||||
_send_response(socketHandle(p->tcpH),RESPONSE_3_A);
|
||||
p->protoState = kResponse_3_B_Id;
|
||||
break;
|
||||
|
||||
case kResponse_3_B_Id:
|
||||
_send_response(socketHandle(p->tcpH),RESPONSE_3_B);
|
||||
p->protoState = kResponse_4_A_Id;
|
||||
break;
|
||||
|
||||
case kResponse_4_A_Id:
|
||||
_send_response(socketHandle(p->tcpH),RESPONSE_4_A);
|
||||
p->protoState = kResponse_4_B_Id;
|
||||
break;
|
||||
|
||||
case kResponse_4_B_Id:
|
||||
_send_response(socketHandle(p->tcpH),RESPONSE_4_B);
|
||||
p->protoState = kRunning_Id;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,11 +1,9 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef cwLINUX
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#ifdef ARDUINO
|
||||
#include <utility/util.h>
|
||||
#endif
|
||||
@ -40,6 +38,7 @@ int _print_name( printCallback_t printCbFunc, const unsigned char* s, const uns
|
||||
rpt(printCbFunc,"%s",x);
|
||||
if( incrFl )
|
||||
++n;
|
||||
|
||||
}
|
||||
|
||||
s += s[0]+1;
|
||||
|
183
dns_sd/fader.cpp
183
dns_sd/fader.cpp
@ -6,10 +6,26 @@
|
||||
#include "rpt.h"
|
||||
#include "fader.h"
|
||||
|
||||
#ifdef cwLINUX
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#ifdef ARDUINO
|
||||
#include <utility/util.h>
|
||||
#endif
|
||||
|
||||
fader::msgRef_t fader::_msgRefA[] =
|
||||
{
|
||||
{ 0x0a, 88 },
|
||||
{ 0x0c, 6 },
|
||||
{ 0x00, 8 },
|
||||
{ 0x19, 1044 },
|
||||
{ 0x04, 4 },
|
||||
{ 0xff, 0 } // end-of-list sentinel (both id and byteN are invalid)
|
||||
};
|
||||
|
||||
fader::fader( printCallback_t printCbFunc, const unsigned char faderMac[6], uint32_t faderInetAddr, hostCallback_t hostCbFunc, void* hostCbArg, unsigned ticksPerHeartBeat, unsigned chN )
|
||||
: _printCbFunc(printCbFunc), _inetAddr(faderInetAddr),_tickN(0),_chArray(nullptr),_hostCbFunc(hostCbFunc),_hostCbArg(hostCbArg),_protoState(kWaitForHandshake_0_Id),_ticksPerHeartBeat(ticksPerHeartBeat)
|
||||
: _printCbFunc(printCbFunc), _inetAddr(faderInetAddr),_tickN(0),_chArray(nullptr),_hostCbFunc(hostCbFunc),_hostCbArg(hostCbArg),_protoState(kWaitForHandshake_0_Id),_ticksPerHeartBeat(ticksPerHeartBeat),_msgTypeId(0xff),_msgByteIdx(0),_msgByteN(0)
|
||||
{
|
||||
memcpy(_mac,faderMac,6);
|
||||
|
||||
@ -19,6 +35,8 @@ fader::fader( printCallback_t printCbFunc, const unsigned char faderMac[6], uint
|
||||
{
|
||||
_chArray[i].position = 0;
|
||||
_chArray[i].muteFl = false;
|
||||
_chArray[i].incrFl = true;
|
||||
_chArray[i].touchFl = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,28 +45,70 @@ fader::~fader()
|
||||
delete[] _chArray;
|
||||
}
|
||||
|
||||
|
||||
|
||||
fader::rc_t fader::receive( const void* buf, unsigned bufByteN )
|
||||
{
|
||||
rc_t rc = kOkRC;
|
||||
const uint8_t* b = (const uint8_t*)buf; // current msg ptr
|
||||
const uint8_t* bend = b + bufByteN; // end of buffer ptr
|
||||
|
||||
while(b<bend)
|
||||
{
|
||||
// if this is the start of a new msg
|
||||
if( _msgByteN == 0 )
|
||||
{
|
||||
// store the size and type of this message
|
||||
_msgTypeId = b[0];
|
||||
_msgByteN = _get_msg_byte_count( _msgTypeId );
|
||||
_msgByteIdx = 0;
|
||||
}
|
||||
|
||||
// if this is a channel message
|
||||
if( _msgTypeId == 0 )
|
||||
{
|
||||
for(int i=0; _msgByteIdx < sizeof(_msg) && b+i<bend; ++i,++_msgByteIdx)
|
||||
_msg[_msgByteIdx] = b[i];
|
||||
}
|
||||
|
||||
// if the end, (and possibly the beginning) of the current msg is fully contained in the buffer ...
|
||||
if( (_msgByteN - _msgByteIdx) <= (bend-b) )
|
||||
{
|
||||
_on_msg_complete(_msgTypeId);
|
||||
b += _msgByteN - _msgByteIdx; // then we have reached the end of the msg
|
||||
_msgByteN = 0;
|
||||
_msgByteIdx = 0;
|
||||
}
|
||||
else // this msg overflows to the next TCP packet
|
||||
{
|
||||
_msgByteIdx += bend-b;
|
||||
b = bend;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
fader::rc_t fader::receive_old( const void* buf, unsigned bufByteN )
|
||||
{
|
||||
rc_t rc = kOkRC;
|
||||
const uint8_t* b = (const uint8_t*)buf;
|
||||
|
||||
_printCbFunc("FDR ");
|
||||
|
||||
switch( _protoState )
|
||||
{
|
||||
case kWaitForHandshake_0_Id:
|
||||
case kWaitForHandshake_0_Id: // wait for [ 0x0a ... ]
|
||||
if( bufByteN>0 && b[0] == 10 )
|
||||
{
|
||||
_printCbFunc("HS 0 ");
|
||||
_send_response_0();
|
||||
_send_response_0(); // send [ 0x0b ... ]
|
||||
_protoState = kWaitForHandshake_Tick_Id;
|
||||
}
|
||||
break;
|
||||
|
||||
case kWaitForHandshake_Tick_Id:
|
||||
case kWaitForHandshake_Tick_Id: // wait for next tick() - send first heart-beat
|
||||
break;
|
||||
|
||||
case kWaitForHandshake_1_Id:
|
||||
case kWaitForHandshake_1_Id: // wait for next message after heart-beat - send [ 0x0d, .... ]
|
||||
_printCbFunc("HS 1 ");
|
||||
_send_response_1();
|
||||
_protoState = kWaitForHeartBeat_Id;
|
||||
@ -78,6 +138,7 @@ fader::rc_t fader::tick()
|
||||
break;
|
||||
|
||||
case kWaitForHeartBeat_Id:
|
||||
//_auto_incr_fader(0);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -104,7 +165,7 @@ fader::rc_t fader::physical_fader_moved( uint16_t chanIdx, uint16_t value )
|
||||
return kOkRC;
|
||||
}
|
||||
|
||||
fader::rc_t fader::physical_mute_switched( uint16_t chanIdx, bool value )
|
||||
fader::rc_t fader::physical_mute_switched( uint16_t chanIdx, uint16_t value )
|
||||
{
|
||||
(void)chanIdx;
|
||||
(void)value;
|
||||
@ -163,3 +224,109 @@ void fader::_on_mute_receive( uint16_t chanIdx, bool value )
|
||||
(void)value;
|
||||
}
|
||||
|
||||
void fader::_send_fader( uint16_t chIdx )
|
||||
{
|
||||
uint16_t buf[] = { htons(chIdx),htons(0), 0, htons(_chArray[chIdx].position) };
|
||||
_send(buf,sizeof(buf));
|
||||
}
|
||||
|
||||
void fader::_send_touch( uint16_t chIdx, bool touchFl )
|
||||
{
|
||||
_chArray[chIdx].touchFl = touchFl;
|
||||
uint16_t buf[] = { htons(chIdx),htons(1),0, htons((uint16_t)touchFl) };
|
||||
_send(buf,sizeof(buf));
|
||||
}
|
||||
|
||||
void fader::_send_mute( uint16_t chIdx, bool muteFl )
|
||||
{
|
||||
_chArray[chIdx].muteFl = muteFl;
|
||||
uint16_t buf[] = { htons(chIdx),htons(0x200),0, htons((uint16_t)(!muteFl)) };
|
||||
_send(buf,sizeof(buf));
|
||||
}
|
||||
|
||||
|
||||
void fader::_auto_incr_fader( uint16_t chIdx )
|
||||
{
|
||||
ch_t* ch = _chArray+chIdx;
|
||||
|
||||
if( ch->position == 0 && ch->touchFl==false )
|
||||
{
|
||||
_send_touch(chIdx,true);
|
||||
}
|
||||
|
||||
if( ch->position > 1023 )
|
||||
{
|
||||
ch->position = 1023;
|
||||
ch->incrFl = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( ch->position < 0 )
|
||||
{
|
||||
ch->position = 0;
|
||||
ch->incrFl = true;
|
||||
_send_touch( chIdx, !ch->touchFl );
|
||||
_send_mute( chIdx, !ch->touchFl );
|
||||
}
|
||||
}
|
||||
|
||||
if( ch->touchFl )
|
||||
_send_fader(chIdx);
|
||||
|
||||
ch->position += ch->incrFl ? 5 : -5;
|
||||
|
||||
}
|
||||
|
||||
uint8_t fader::_get_msg_byte_count( uint8_t msgTypeId )
|
||||
{
|
||||
for(int i=0; _msgRefA[i].byteN != 0; ++i)
|
||||
if( msgTypeId == _msgRefA[i].id )
|
||||
return _msgRefA[i].byteN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fader::_handleChMsg(const uint8_t* msg)
|
||||
{
|
||||
}
|
||||
|
||||
// called when a new msg is received, b[0] is the msg type id
|
||||
void fader::_on_msg_complete( const uint8_t typeId )
|
||||
{
|
||||
switch( typeId )
|
||||
{
|
||||
case 0x0a:
|
||||
if( _protoState == kWaitForHandshake_0_Id )
|
||||
{
|
||||
_printCbFunc("HS 0 ");
|
||||
_send_response_0(); // send [ 0x0b ... ]
|
||||
_protoState = kWaitForHandshake_Tick_Id;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0c:
|
||||
break;
|
||||
|
||||
case 0x00:
|
||||
break;
|
||||
|
||||
case 0x04:
|
||||
break;
|
||||
|
||||
case 0x19:
|
||||
break;
|
||||
|
||||
default:
|
||||
rpt(_printCbFunc,"Unknown msg type.");
|
||||
}
|
||||
|
||||
// Any msg will trigger change of state from
|
||||
// kWaitForHandshake_1_Id to kWaitForHeartBeat_Id
|
||||
if( _protoState == kWaitForHandshake_1_Id )
|
||||
{
|
||||
_printCbFunc("HS 1 ");
|
||||
_send_response_1(); //send [ 0x0d, .... ]
|
||||
_protoState = kWaitForHeartBeat_Id;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ public:
|
||||
// based on host state changes.
|
||||
// Return kUnknownMsgRC if the received msg is not recognized.
|
||||
rc_t receive( const void* buf, unsigned bufByteN );
|
||||
rc_t receive_old( const void* buf, unsigned bufByteN );
|
||||
|
||||
// Called by the application to drive time dependent functions.
|
||||
// Return kTimeOut if the protocol state machine has timed out.
|
||||
@ -42,7 +43,10 @@ public:
|
||||
// the controls physical state changes.
|
||||
rc_t physical_fader_touched( uint16_t chIdx );
|
||||
rc_t physical_fader_moved( uint16_t chIdx, uint16_t newPosition );
|
||||
rc_t physical_mute_switched( uint16_t chIdx, bool newMuteFl );
|
||||
rc_t physical_mute_switched( uint16_t chIdx, uint16_t newMuteFl );
|
||||
|
||||
rc_t virtual_fader_moved( uint16_t chIdx, uint16_t newPosition );
|
||||
rc_t virtual_mute_switched( uint16_t chIdx, uint16_t newMuteFl );
|
||||
|
||||
private:
|
||||
typedef enum
|
||||
@ -55,10 +59,22 @@ private:
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t position;
|
||||
int16_t position;
|
||||
bool muteFl;
|
||||
bool incrFl;
|
||||
bool touchFl;
|
||||
|
||||
} ch_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t id; // message prefix - identifies the type of message
|
||||
uint16_t byteN; // length of the message in bytes
|
||||
} msgRef_t;
|
||||
|
||||
static msgRef_t _msgRefA[];
|
||||
|
||||
|
||||
printCallback_t _printCbFunc;
|
||||
uint32_t _inetAddr;
|
||||
unsigned _tickN;
|
||||
@ -70,12 +86,26 @@ private:
|
||||
unsigned char _mac[6];
|
||||
unsigned _ticksPerHeartBeat;
|
||||
|
||||
uint8_t _msgTypeId; //
|
||||
unsigned _msgByteIdx; // current index into the message being parsed.
|
||||
unsigned _msgByteN; // count of bytes in the message currently being parsed
|
||||
unsigned char _msg[8]; //
|
||||
|
||||
void _send_response_0();
|
||||
void _send_response_1();
|
||||
void _send_heartbeat();
|
||||
void _send( const void* buf, unsigned bufByteN );
|
||||
void _on_fader_receive( uint16_t chanIdx, uint16_t position );
|
||||
void _on_mute_receive( uint16_t chanIdx, bool muteFl );
|
||||
void _send_fader( uint16_t chIdx );
|
||||
void _send_touch( uint16_t chIdx, bool touchFl );
|
||||
void _send_mute( uint16_t chIdx, bool muteFl );
|
||||
void _auto_incr_fader( uint16_t chIdx );
|
||||
|
||||
|
||||
uint8_t _get_msg_byte_count( uint8_t msgTypeId );
|
||||
void _handleChMsg(const uint8_t* msg);
|
||||
void _on_msg_complete( const uint8_t typeId );
|
||||
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user