mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-07-08 16:37:46 +02:00
2016-11-26 Fred Gleason <fredg@paravelsystems.com>
* Modified the LiveWire Multicast GPIO driver to generate GPO events using the 'I' event type.
This commit is contained in:
parent
3faa8dfbed
commit
b4247e217d
@ -15487,3 +15487,6 @@
|
|||||||
2016-10-20 Fred Gleason <fredg@paravelsystems.com>
|
2016-10-20 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Added a 'LockRdairplayMemory=' parameter to the [Hacks] section
|
* Added a 'LockRdairplayMemory=' parameter to the [Hacks] section
|
||||||
of rd.conf(5).
|
of rd.conf(5).
|
||||||
|
2016-11-26 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Modified the LiveWire Multicast GPIO driver to generate GPO
|
||||||
|
events using the 'I' event type.
|
||||||
|
@ -70,15 +70,26 @@ LiveWireMcastGpio::LiveWireMcastGpio(RDMatrix *matrix,QObject *parent)
|
|||||||
connect(livewire_gpi_timers.back(),SIGNAL(timeout()),
|
connect(livewire_gpi_timers.back(),SIGNAL(timeout()),
|
||||||
livewire_gpi_timer_mapper,SLOT(map()));
|
livewire_gpi_timer_mapper,SLOT(map()));
|
||||||
}
|
}
|
||||||
livewire_gpo_timer_mapper=new QSignalMapper(this);
|
livewire_gpo_out_timer_mapper=new QSignalMapper(this);
|
||||||
connect(livewire_gpo_timer_mapper,SIGNAL(mapped(int)),
|
connect(livewire_gpo_out_timer_mapper,SIGNAL(mapped(int)),
|
||||||
this,SLOT(gpoTimeoutData(int)));
|
this,SLOT(gpoOutTimeoutData(int)));
|
||||||
for(unsigned i=0;i<livewire_gpios;i++) {
|
for(unsigned i=0;i<livewire_gpios;i++) {
|
||||||
livewire_gpo_timers.push_back(new QTimer(this));
|
livewire_gpo_out_timers.push_back(new QTimer(this));
|
||||||
livewire_gpo_timer_mapper->setMapping(livewire_gpo_timers.back(),i);
|
livewire_gpo_out_timer_mapper->setMapping(livewire_gpo_out_timers.back(),i);
|
||||||
connect(livewire_gpo_timers.back(),SIGNAL(timeout()),
|
connect(livewire_gpo_out_timers.back(),SIGNAL(timeout()),
|
||||||
livewire_gpo_timer_mapper,SLOT(map()));
|
livewire_gpo_out_timer_mapper,SLOT(map()));
|
||||||
livewire_gpo_states.push_back(false);
|
livewire_gpo_out_states.push_back(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
livewire_gpo_in_timer_mapper=new QSignalMapper(this);
|
||||||
|
connect(livewire_gpo_in_timer_mapper,SIGNAL(mapped(int)),
|
||||||
|
this,SLOT(gpoInTimeoutData(int)));
|
||||||
|
for(unsigned i=0;i<livewire_gpios;i++) {
|
||||||
|
livewire_gpo_in_timers.push_back(new QTimer(this));
|
||||||
|
livewire_gpo_in_timer_mapper->setMapping(livewire_gpo_in_timers.back(),i);
|
||||||
|
connect(livewire_gpo_in_timers.back(),SIGNAL(timeout()),
|
||||||
|
livewire_gpo_in_timer_mapper,SLOT(map()));
|
||||||
|
livewire_gpo_in_states.push_back(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -150,8 +161,11 @@ LiveWireMcastGpio::~LiveWireMcastGpio()
|
|||||||
for(unsigned i=0;i<livewire_gpi_timers.size();i++) {
|
for(unsigned i=0;i<livewire_gpi_timers.size();i++) {
|
||||||
delete livewire_gpi_timers[i];
|
delete livewire_gpi_timers[i];
|
||||||
}
|
}
|
||||||
for(unsigned i=0;i<livewire_gpo_timers.size();i++) {
|
for(unsigned i=0;i<livewire_gpo_out_timers.size();i++) {
|
||||||
delete livewire_gpo_timers[i];
|
delete livewire_gpo_out_timers[i];
|
||||||
|
}
|
||||||
|
for(unsigned i=0;i<livewire_gpo_in_timers.size();i++) {
|
||||||
|
delete livewire_gpo_in_timers[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,12 +218,27 @@ void LiveWireMcastGpio::processCommand(RDMacro *cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cmd->arg(1).toString().lower()=="i") {
|
if(cmd->arg(1).toString().lower()=="i") {
|
||||||
|
slot=(cmd->arg(2).toInt()-1)/5;
|
||||||
|
line=(cmd->arg(2).toInt()-1)%5;
|
||||||
|
if(livewire_source_numbers[slot]<=0) {
|
||||||
|
cmd->acknowledge(false);
|
||||||
|
emit rmlEcho(cmd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(cmd->arg(4).toInt()>0) {
|
||||||
|
livewire_gpo_in_timers[cmd->arg(2).toInt()-1]->
|
||||||
|
start(cmd->arg(4).toInt(),true);
|
||||||
|
}
|
||||||
|
ProcessGpoIn(livewire_source_numbers[slot],line,cmd->arg(3).toInt());
|
||||||
|
livewire_gpo_in_states[cmd->arg(2).toInt()-1]=cmd->arg(3).toInt();
|
||||||
|
/*
|
||||||
emit gpiChanged(livewire_matrix,cmd->arg(2).toInt()-1,
|
emit gpiChanged(livewire_matrix,cmd->arg(2).toInt()-1,
|
||||||
cmd->arg(3).toInt());
|
cmd->arg(3).toInt());
|
||||||
if(cmd->arg(4).toInt()>0) {
|
if(cmd->arg(4).toInt()>0) {
|
||||||
livewire_gpi_timers[cmd->arg(2).toInt()-1]->
|
livewire_gpi_timers[cmd->arg(2).toInt()-1]->
|
||||||
start(cmd->arg(4).toInt(),true);
|
start(cmd->arg(4).toInt(),true);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
if(cmd->arg(1).toString().lower()=="o") {
|
if(cmd->arg(1).toString().lower()=="o") {
|
||||||
slot=(cmd->arg(2).toInt()-1)/5;
|
slot=(cmd->arg(2).toInt()-1)/5;
|
||||||
@ -220,11 +249,11 @@ void LiveWireMcastGpio::processCommand(RDMacro *cmd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(cmd->arg(4).toInt()>0) {
|
if(cmd->arg(4).toInt()>0) {
|
||||||
livewire_gpo_timers[cmd->arg(2).toInt()-1]->
|
livewire_gpo_out_timers[cmd->arg(2).toInt()-1]->
|
||||||
start(cmd->arg(4).toInt(),true);
|
start(cmd->arg(4).toInt(),true);
|
||||||
}
|
}
|
||||||
ProcessGpo(livewire_source_numbers[slot],line,cmd->arg(3).toInt());
|
ProcessGpoOut(livewire_source_numbers[slot],line,cmd->arg(3).toInt());
|
||||||
livewire_gpo_states[cmd->arg(2).toInt()-1]=cmd->arg(3).toInt();
|
livewire_gpo_out_states[cmd->arg(2).toInt()-1]=cmd->arg(3).toInt();
|
||||||
}
|
}
|
||||||
cmd->acknowledge(true);
|
cmd->acknowledge(true);
|
||||||
emit rmlEcho(cmd);
|
emit rmlEcho(cmd);
|
||||||
@ -266,14 +295,26 @@ void LiveWireMcastGpio::gpiTimeoutData(int gpi)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LiveWireMcastGpio::gpoTimeoutData(int gpo)
|
void LiveWireMcastGpio::gpoInTimeoutData(int gpo)
|
||||||
{
|
{
|
||||||
int slot=gpo/5;
|
int slot=gpo/5;
|
||||||
int line=gpo%5;
|
int line=gpo%5;
|
||||||
|
|
||||||
if(livewire_source_numbers[slot]>0) {
|
if(livewire_source_numbers[slot]>0) {
|
||||||
ProcessGpo(livewire_source_numbers[slot],line,!livewire_gpo_states[gpo]);
|
ProcessGpoIn(livewire_source_numbers[slot],line,!livewire_gpo_in_states[gpo]);
|
||||||
livewire_gpo_states[gpo]=!livewire_gpo_states[gpo];
|
livewire_gpo_in_states[gpo]=!livewire_gpo_in_states[gpo];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LiveWireMcastGpio::gpoOutTimeoutData(int gpo)
|
||||||
|
{
|
||||||
|
int slot=gpo/5;
|
||||||
|
int line=gpo%5;
|
||||||
|
|
||||||
|
if(livewire_source_numbers[slot]>0) {
|
||||||
|
ProcessGpoOut(livewire_source_numbers[slot],line,!livewire_gpo_out_states[gpo]);
|
||||||
|
livewire_gpo_out_states[gpo]=!livewire_gpo_out_states[gpo];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -296,7 +337,54 @@ void LiveWireMcastGpio::ProcessGpi(const QHostAddress &src_addr,int chan,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LiveWireMcastGpio::ProcessGpo(int chan,unsigned line,bool state)
|
void LiveWireMcastGpio::ProcessGpoIn(int chan,unsigned line,bool state)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Destination Address
|
||||||
|
//
|
||||||
|
struct sockaddr_in sa;
|
||||||
|
memset(&sa,0,sizeof(sa));
|
||||||
|
sa.sin_family=AF_INET;
|
||||||
|
sa.sin_port=htons(RD_LIVEWIRE_GPIO_RECV_PORT);
|
||||||
|
sa.sin_addr.s_addr=
|
||||||
|
htonl(QHostAddress(RD_LIVEWIRE_GPIO_MCAST_ADDR).toIPv4Address());
|
||||||
|
|
||||||
|
uint8_t data[60]={0x03,0x00,0x02,0x07,0x36,0x0B,0x97,0xA9,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
'W','R','N','I',0x00,0x04,0x00,0x03,0xF6,
|
||||||
|
0x05,0x07,0xCA,0xFF,0xFF,0xFF,0xFD,0x07,
|
||||||
|
0x01,0xFF,0xFF,0xFF,0xFC,0x09,0x00,0x02,
|
||||||
|
0x15,0x07,0x00,0x12,0x00,0x8F,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0x09,0x00,0x02,0x15,0x07,0x00,
|
||||||
|
0x00,0x00,0x8F};
|
||||||
|
data[4]=0xFF&(livewire_gpio_send_serial>>24);
|
||||||
|
data[5]=0xFF&(livewire_gpio_send_serial>>16);
|
||||||
|
data[6]=0xFF&(livewire_gpio_send_serial>>8);
|
||||||
|
data[7]=0xFF&livewire_gpio_send_serial;
|
||||||
|
data[23]=0xFF&(chan>>8);
|
||||||
|
data[24]=0xFF&chan;
|
||||||
|
data[25]=0x08-(0x07&line);
|
||||||
|
if(state) {
|
||||||
|
data[27]|=0x40;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
data[27]&=~0x40;
|
||||||
|
}
|
||||||
|
data[27]&=~0x0A; // No pulse
|
||||||
|
sendto(livewire_gpio_write_socket,data,28,MSG_DONTWAIT,
|
||||||
|
(struct sockaddr *)(&sa),sizeof(sa));
|
||||||
|
livewire_gpio_send_serial++;
|
||||||
|
data[4]=0xFF&(livewire_gpio_send_serial>>24);
|
||||||
|
data[5]=0xFF&(livewire_gpio_send_serial>>16);
|
||||||
|
data[6]=0xFF&(livewire_gpio_send_serial>>8);
|
||||||
|
data[7]=0xFF&livewire_gpio_send_serial;
|
||||||
|
sendto(livewire_gpio_write_socket,data,60,MSG_DONTWAIT,
|
||||||
|
(struct sockaddr *)(&sa),sizeof(sa));
|
||||||
|
livewire_gpio_send_serial++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LiveWireMcastGpio::ProcessGpoOut(int chan,unsigned line,bool state)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Destination Address
|
// Destination Address
|
||||||
|
@ -57,12 +57,14 @@ class LiveWireMcastGpio : public Switcher
|
|||||||
private slots:
|
private slots:
|
||||||
void gpioActivatedData(int sock);
|
void gpioActivatedData(int sock);
|
||||||
void gpiTimeoutData(int gpo);
|
void gpiTimeoutData(int gpo);
|
||||||
void gpoTimeoutData(int gpo);
|
void gpoInTimeoutData(int gpo);
|
||||||
|
void gpoOutTimeoutData(int gpo);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ProcessGpi(const QHostAddress &src_addr,int chan,unsigned line,
|
void ProcessGpi(const QHostAddress &src_addr,int chan,unsigned line,
|
||||||
bool state,bool pulse);
|
bool state,bool pulse);
|
||||||
void ProcessGpo(int chan,unsigned line,bool state);
|
void ProcessGpoIn(int chan,unsigned line,bool state);
|
||||||
|
void ProcessGpoOut(int chan,unsigned line,bool state);
|
||||||
QString AddressString(uint32_t addr) const;
|
QString AddressString(uint32_t addr) const;
|
||||||
void subscribe(const QHostAddress &addr) const;
|
void subscribe(const QHostAddress &addr) const;
|
||||||
void subscribe(const uint32_t addr) const;
|
void subscribe(const uint32_t addr) const;
|
||||||
@ -81,9 +83,12 @@ class LiveWireMcastGpio : public Switcher
|
|||||||
std::map<uint32_t,uint32_t> livewire_gpio_recv_serials;
|
std::map<uint32_t,uint32_t> livewire_gpio_recv_serials;
|
||||||
QSignalMapper *livewire_gpi_timer_mapper;
|
QSignalMapper *livewire_gpi_timer_mapper;
|
||||||
std::vector<QTimer *> livewire_gpi_timers;
|
std::vector<QTimer *> livewire_gpi_timers;
|
||||||
QSignalMapper *livewire_gpo_timer_mapper;
|
QSignalMapper *livewire_gpo_in_timer_mapper;
|
||||||
std::vector<QTimer *> livewire_gpo_timers;
|
std::vector<QTimer *> livewire_gpo_in_timers;
|
||||||
std::vector<bool> livewire_gpo_states;
|
std::vector<bool> livewire_gpo_in_states;
|
||||||
|
QSignalMapper *livewire_gpo_out_timer_mapper;
|
||||||
|
std::vector<QTimer *> livewire_gpo_out_timers;
|
||||||
|
std::vector<bool> livewire_gpo_out_states;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user