mirror of
				https://github.com/ElvishArtisan/rivendell.git
				synced 2025-11-03 15:43:51 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			445 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			445 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// edit_ttys.cpp
 | 
						|
//
 | 
						|
// Edit a Rivendell TTY Configuration
 | 
						|
//
 | 
						|
//   (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
 | 
						|
//
 | 
						|
//   This program is free software; you can redistribute it and/or modify
 | 
						|
//   it under the terms of the GNU General Public License version 2 as
 | 
						|
//   published by the Free Software Foundation.
 | 
						|
//
 | 
						|
//   This program is distributed in the hope that it will be useful,
 | 
						|
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
//   GNU General Public License for more details.
 | 
						|
//
 | 
						|
//   You should have received a copy of the GNU General Public
 | 
						|
//   License along with this program; if not, write to the Free Software
 | 
						|
//   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
//
 | 
						|
 | 
						|
#include <qmessagebox.h>
 | 
						|
 | 
						|
#include <rdapplication.h>
 | 
						|
#include <rddb.h>
 | 
						|
#include <rdescape_string.h>
 | 
						|
#include <rdmatrix.h>
 | 
						|
#include <rdstation.h>
 | 
						|
#include <rdtextvalidator.h>
 | 
						|
 | 
						|
#include "edit_ttys.h"
 | 
						|
#include "globals.h"
 | 
						|
 | 
						|
EditTtys::EditTtys(QString station,QWidget *parent)
 | 
						|
  : RDDialog(parent)
 | 
						|
{
 | 
						|
  setModal(true);
 | 
						|
 | 
						|
  //
 | 
						|
  // Fix the Window Size
 | 
						|
  //
 | 
						|
  setMinimumWidth(sizeHint().width());
 | 
						|
  setMaximumWidth(sizeHint().width());
 | 
						|
  setMinimumHeight(sizeHint().height());
 | 
						|
  setMaximumHeight(sizeHint().height());
 | 
						|
 | 
						|
  edit_station=station;
 | 
						|
  for(int i=0;i<MAX_TTYS;i++) {
 | 
						|
    edit_port_modified[i]=false;
 | 
						|
  }
 | 
						|
  setWindowTitle("RDAdmin- "+tr("Edit Serial Ports"));
 | 
						|
 | 
						|
  //
 | 
						|
  // Text Validator
 | 
						|
  //
 | 
						|
  RDTextValidator *validator=new RDTextValidator(this);
 | 
						|
 | 
						|
  //
 | 
						|
  // Port Selector
 | 
						|
  //
 | 
						|
  edit_port_box=new QComboBox(this);
 | 
						|
  edit_port_box->setGeometry(75,10,100,24);
 | 
						|
  edit_port_box->setInsertionPolicy(QComboBox::NoInsertion);
 | 
						|
  connect(edit_port_box,SIGNAL(activated(int)),this,SLOT(idSelectedData()));
 | 
						|
  QLabel *label=new QLabel(edit_port_box,tr("Port ID:"),this);
 | 
						|
  label->setGeometry(10,10,60,24);
 | 
						|
  label->setFont(labelFont());
 | 
						|
  label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
 | 
						|
  //
 | 
						|
  // Enable Button
 | 
						|
  //
 | 
						|
  edit_enable_button=new QCheckBox(this);
 | 
						|
  edit_enable_button->setGeometry(265,14,15,15);
 | 
						|
  connect(edit_enable_button,SIGNAL(stateChanged(int)),
 | 
						|
	  this,SLOT(enableButtonData(int)));
 | 
						|
  label=new QLabel(edit_enable_button,tr("Enabled"),this);
 | 
						|
  label->setGeometry(200,10,60,22);
 | 
						|
  label->setFont(labelFont());
 | 
						|
  label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
 | 
						|
  //
 | 
						|
  // The TTY Port
 | 
						|
  //
 | 
						|
  edit_port_edit=new QLineEdit(this);
 | 
						|
  edit_port_edit->setGeometry(145,54,100,20);
 | 
						|
  edit_port_edit->setValidator(validator);
 | 
						|
  edit_port_label=new QLabel(edit_port_edit,tr("TTY Device:"),this);
 | 
						|
  edit_port_label->setGeometry(20,54,120,20);
 | 
						|
  edit_port_label->setFont(labelFont());
 | 
						|
  edit_port_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Baudrate Selector
 | 
						|
  //
 | 
						|
  edit_baudrate_box=new QComboBox(this);
 | 
						|
  edit_baudrate_box->setGeometry(145,80,90,24);
 | 
						|
  edit_baudrate_box->setInsertionPolicy(QComboBox::NoInsertion);
 | 
						|
  edit_baudrate_label=new QLabel(edit_baudrate_box,tr("Baud Rate:"),this);
 | 
						|
  edit_baudrate_label->setGeometry(20,80,120,24);
 | 
						|
  edit_baudrate_label->setFont(labelFont());
 | 
						|
  edit_baudrate_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
 | 
						|
  //
 | 
						|
  // Parity Selector
 | 
						|
  //
 | 
						|
  edit_parity_box=new QComboBox(this);
 | 
						|
  edit_parity_box->setGeometry(145,108,90,24); 
 | 
						|
  edit_parity_box->setInsertionPolicy(QComboBox::NoInsertion);
 | 
						|
  edit_parity_label=new QLabel(edit_parity_box,tr("Parity:"),this);
 | 
						|
  edit_parity_label->setGeometry(20,108,120,24);
 | 
						|
  edit_parity_label->setFont(labelFont());
 | 
						|
  edit_parity_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
 | 
						|
  //
 | 
						|
  // Data Bits Selector
 | 
						|
  //
 | 
						|
  edit_databits_box=new QComboBox(this);
 | 
						|
  edit_databits_box->setGeometry(145,136,60,24);
 | 
						|
  edit_databits_box->setInsertionPolicy(QComboBox::NoInsertion);
 | 
						|
  edit_databits_label=new QLabel(edit_databits_box,tr("Data Bits:"),this);
 | 
						|
  edit_databits_label->setGeometry(20,136,120,24);
 | 
						|
  edit_databits_label->setFont(labelFont());
 | 
						|
  edit_databits_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
 | 
						|
  //
 | 
						|
  // Stop Bits Selector
 | 
						|
  //
 | 
						|
  edit_stopbits_box=new QComboBox(this);
 | 
						|
  edit_stopbits_box->setGeometry(145,164,60,24);
 | 
						|
  edit_stopbits_box->setInsertionPolicy(QComboBox::NoInsertion);
 | 
						|
  edit_stopbits_label=new QLabel(edit_stopbits_box,tr("Stop Bits:"),this);
 | 
						|
  edit_stopbits_label->setGeometry(20,164,120,24);
 | 
						|
  edit_stopbits_label->setFont(labelFont());
 | 
						|
  edit_stopbits_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
 | 
						|
  //
 | 
						|
  // Termination Character Selector
 | 
						|
  //
 | 
						|
  edit_termination_box=new QComboBox(this);
 | 
						|
  edit_termination_box->setGeometry(145,192,90,24);
 | 
						|
  edit_termination_box->setInsertionPolicy(QComboBox::NoInsertion);
 | 
						|
  edit_termination_label=
 | 
						|
    new QLabel(edit_termination_box,tr("Terminator:"),this);
 | 
						|
  edit_termination_label->setGeometry(20,192,120,24);
 | 
						|
  edit_termination_label->setFont(labelFont());
 | 
						|
  edit_termination_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 | 
						|
 | 
						|
  //
 | 
						|
  //  Close Button
 | 
						|
  //
 | 
						|
  QPushButton *close_button=new QPushButton(this);
 | 
						|
  close_button->setGeometry(210,230,80,50);
 | 
						|
  close_button->setFont(buttonFont());
 | 
						|
  close_button->setText(tr("&Close"));
 | 
						|
  connect(close_button,SIGNAL(clicked()),this,SLOT(closeData()));
 | 
						|
 | 
						|
  //
 | 
						|
  // Populate Data
 | 
						|
  //
 | 
						|
  for(int i=0;i<MAX_TTYS;i++) {
 | 
						|
    edit_port_box->insertItem(tr("Serial")+QString().sprintf("%d",i));
 | 
						|
  }
 | 
						|
  edit_baudrate_box->insertItem("50");
 | 
						|
  edit_baudrate_box->insertItem("75");
 | 
						|
  edit_baudrate_box->insertItem("110");
 | 
						|
  edit_baudrate_box->insertItem("134");
 | 
						|
  edit_baudrate_box->insertItem("150");
 | 
						|
  edit_baudrate_box->insertItem("200");
 | 
						|
  edit_baudrate_box->insertItem("300");
 | 
						|
  edit_baudrate_box->insertItem("600");
 | 
						|
  edit_baudrate_box->insertItem("1200");
 | 
						|
  edit_baudrate_box->insertItem("1800");
 | 
						|
  edit_baudrate_box->insertItem("2400");
 | 
						|
  edit_baudrate_box->insertItem("4800");
 | 
						|
  edit_baudrate_box->insertItem("9600");
 | 
						|
  edit_baudrate_box->insertItem("19200");
 | 
						|
  edit_baudrate_box->insertItem("38400");
 | 
						|
  edit_baudrate_box->insertItem("57600");
 | 
						|
  edit_baudrate_box->insertItem("115200");
 | 
						|
  edit_baudrate_box->insertItem("230400");
 | 
						|
 | 
						|
  edit_parity_box->insertItem(tr("None"));
 | 
						|
  edit_parity_box->insertItem(tr("Even"));
 | 
						|
  edit_parity_box->insertItem(tr("Odd"));
 | 
						|
 | 
						|
  edit_databits_box->insertItem("5");
 | 
						|
  edit_databits_box->insertItem("6");
 | 
						|
  edit_databits_box->insertItem("7");
 | 
						|
  edit_databits_box->insertItem("8");
 | 
						|
 | 
						|
  edit_stopbits_box->insertItem("1");
 | 
						|
  edit_stopbits_box->insertItem("2");
 | 
						|
 | 
						|
  edit_termination_box->insertItem(tr("None"));
 | 
						|
  edit_termination_box->insertItem(tr("CR"));
 | 
						|
  edit_termination_box->insertItem(tr("LF"));
 | 
						|
  edit_termination_box->insertItem(tr("CR/LF"));
 | 
						|
 | 
						|
  edit_id=edit_port_box->currentItem();
 | 
						|
  edit_tty=NULL;
 | 
						|
  ReadRecord(edit_id);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EditTtys::~EditTtys()
 | 
						|
{
 | 
						|
   delete edit_port_label;
 | 
						|
   delete edit_port_edit;
 | 
						|
   delete edit_baudrate_label;
 | 
						|
   delete edit_baudrate_box;
 | 
						|
   delete edit_databits_label;
 | 
						|
   delete edit_databits_box;
 | 
						|
   delete edit_stopbits_label;
 | 
						|
   delete edit_stopbits_box;
 | 
						|
   delete edit_parity_label;
 | 
						|
   delete edit_parity_box;
 | 
						|
   delete edit_termination_label;
 | 
						|
   delete edit_termination_box;
 | 
						|
   delete edit_tty;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
QSize EditTtys::sizeHint() const
 | 
						|
{
 | 
						|
  return QSize(300,290);
 | 
						|
} 
 | 
						|
 | 
						|
 | 
						|
QSizePolicy EditTtys::sizePolicy() const
 | 
						|
{
 | 
						|
  return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void EditTtys::idSelectedData()
 | 
						|
{
 | 
						|
  WriteRecord(edit_id);
 | 
						|
  edit_id=edit_port_box->currentItem();
 | 
						|
  ReadRecord(edit_id);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void EditTtys::enableButtonData(int state)
 | 
						|
{
 | 
						|
  QString sql;
 | 
						|
  RDSqlQuery *q;
 | 
						|
 | 
						|
  if(!state) {
 | 
						|
    sql=QString("select ")+
 | 
						|
      "NAME,"+    // 00
 | 
						|
      "MATRIX,"+  // 01
 | 
						|
      "TYPE "+    // 02
 | 
						|
      "from MATRICES where "+
 | 
						|
      "STATION_NAME=\""+RDEscapeString(edit_station)+"\" && "+
 | 
						|
      QString().sprintf("(PORT_TYPE=%d && PORT=%d) || ",
 | 
						|
			RDMatrix::TtyPort,edit_port_box->currentIndex())+
 | 
						|
      QString().sprintf("(PORT_TYPE_2=%d && PORT_2=%d)",
 | 
						|
			RDMatrix::TtyPort,edit_port_box->currentIndex());
 | 
						|
    q=new RDSqlQuery(sql);
 | 
						|
    if(q->first()) {
 | 
						|
      QMessageBox::information(this,"RDAdmin - "+tr("Error"),
 | 
						|
			       tr("This port is currently in use by the following Switcher/GPIO device")+":\n"+
 | 
						|
			       "\t"+tr("Matrix")+QString().sprintf(": %d.\n",q->value(1).toInt())+
 | 
						|
			       "\t"+tr("Type")+": "+RDMatrix::typeString((RDMatrix::Type)q->value(2).toInt())+"\n"+
 | 
						|
			       "\t"+tr("Description")+": "+q->value(0).toString());
 | 
						|
      delete q;
 | 
						|
      edit_enable_button->setChecked(true);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    delete q;
 | 
						|
  }
 | 
						|
 | 
						|
  if(state==0) {  // Off
 | 
						|
    SetEnable(false);
 | 
						|
  }
 | 
						|
 | 
						|
  if(state==2) {  // On
 | 
						|
    SetEnable(true);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void EditTtys::closeData()
 | 
						|
{
 | 
						|
  QString sql;
 | 
						|
  RDSqlQuery *q;
 | 
						|
 | 
						|
  WriteRecord(edit_id);
 | 
						|
 | 
						|
  RDStation *rmt_station=new RDStation(edit_station);
 | 
						|
  QHostAddress addr=rmt_station->address();
 | 
						|
  RDMacro macro;
 | 
						|
  
 | 
						|
  macro.setCommand(RDMacro::SY);
 | 
						|
  macro.setRole(RDMacro::Cmd);
 | 
						|
  macro.setEchoRequested(false);
 | 
						|
  for(int i=0;i<MAX_TTYS;i++) {
 | 
						|
    if(edit_port_modified[i]) {
 | 
						|
      sql=QString().sprintf("select MATRIX from MATRICES where PORT=%d",i);
 | 
						|
      q=new RDSqlQuery(sql);
 | 
						|
      if(q->first()) {
 | 
						|
	macro.setCommand(RDMacro::SZ);
 | 
						|
	macro.addArg(q->value(0).toInt());
 | 
						|
      }
 | 
						|
      else {
 | 
						|
	macro.setCommand(RDMacro::SY);
 | 
						|
	macro.addArg(i);
 | 
						|
      }
 | 
						|
      macro.setAddress(rmt_station->address());
 | 
						|
      rda->ripc()->sendRml(¯o);
 | 
						|
      delete q;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  delete rmt_station;
 | 
						|
 | 
						|
  done(0);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void EditTtys::ReadRecord(int id)
 | 
						|
{
 | 
						|
  if(edit_tty!=NULL) {
 | 
						|
    delete edit_tty;
 | 
						|
  }
 | 
						|
  edit_tty=new RDTty(edit_station,id,true);
 | 
						|
  edit_port_edit->setText(edit_tty->port());
 | 
						|
  switch(edit_tty->baudRate()) {
 | 
						|
  case 50:
 | 
						|
    edit_baudrate_box->setCurrentItem(0);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 75:
 | 
						|
    edit_baudrate_box->setCurrentItem(1);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 110:
 | 
						|
    edit_baudrate_box->setCurrentItem(2);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 134:
 | 
						|
    edit_baudrate_box->setCurrentItem(3);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 150:
 | 
						|
    edit_baudrate_box->setCurrentItem(4);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 200:
 | 
						|
    edit_baudrate_box->setCurrentItem(5);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 300:
 | 
						|
    edit_baudrate_box->setCurrentItem(6);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 600:
 | 
						|
    edit_baudrate_box->setCurrentItem(7);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 1200:
 | 
						|
    edit_baudrate_box->setCurrentItem(8);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 1800:
 | 
						|
    edit_baudrate_box->setCurrentItem(9);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 2400:
 | 
						|
    edit_baudrate_box->setCurrentItem(10);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 4800:
 | 
						|
    edit_baudrate_box->setCurrentItem(11);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 9600:
 | 
						|
    edit_baudrate_box->setCurrentItem(12);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 19200:
 | 
						|
    edit_baudrate_box->setCurrentItem(13);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 38400:
 | 
						|
    edit_baudrate_box->setCurrentItem(14);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 57600:
 | 
						|
    edit_baudrate_box->setCurrentItem(15);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 115200:
 | 
						|
    edit_baudrate_box->setCurrentItem(16);
 | 
						|
    break;
 | 
						|
 | 
						|
  case 230400:
 | 
						|
    edit_baudrate_box->setCurrentItem(17);
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    edit_baudrate_box->setCurrentItem(12);
 | 
						|
    break;	
 | 
						|
  }
 | 
						|
  edit_parity_box->setCurrentItem(edit_tty->parity());
 | 
						|
  edit_databits_box->setCurrentItem(edit_tty->dataBits()-5);
 | 
						|
  edit_stopbits_box->setCurrentItem(edit_tty->stopBits()-1);
 | 
						|
  edit_termination_box->setCurrentItem(edit_tty->termination());
 | 
						|
  edit_enable_button->setChecked(edit_tty->active());
 | 
						|
  SetEnable(edit_tty->active());
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void EditTtys::WriteRecord(int id)
 | 
						|
{
 | 
						|
  int baud;
 | 
						|
 | 
						|
  edit_tty->setActive(edit_enable_button->isChecked());
 | 
						|
  edit_tty->setPort(edit_port_edit->text());
 | 
						|
  sscanf((const char *)edit_baudrate_box->currentText(),"%d",&baud);
 | 
						|
  edit_tty->setBaudRate(baud);
 | 
						|
  edit_tty->setParity((RDTTYDevice::Parity)edit_parity_box->currentItem());
 | 
						|
  edit_tty->setDataBits(edit_databits_box->currentItem()+5);
 | 
						|
  edit_tty->setStopBits(edit_stopbits_box->currentItem()+1);
 | 
						|
  edit_tty->
 | 
						|
    setTermination((RDTty::Termination)edit_termination_box->currentItem());
 | 
						|
  edit_port_modified[id]=true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void EditTtys::SetEnable(bool state)
 | 
						|
{
 | 
						|
   edit_port_label->setEnabled(state);
 | 
						|
   edit_port_edit->setEnabled(state);
 | 
						|
   edit_baudrate_label->setEnabled(state);
 | 
						|
   edit_baudrate_box->setEnabled(state);
 | 
						|
   edit_databits_label->setEnabled(state);
 | 
						|
   edit_databits_box->setEnabled(state);
 | 
						|
   edit_stopbits_label->setEnabled(state);
 | 
						|
   edit_stopbits_box->setEnabled(state);
 | 
						|
   edit_parity_label->setEnabled(state);
 | 
						|
   edit_parity_box->setEnabled(state);
 | 
						|
   edit_termination_label->setEnabled(state);
 | 
						|
   edit_termination_box->setEnabled(state);
 | 
						|
}
 |