Code as text
-
main.cpp
#include "form.h"
#include <QApplication>
#include "ui_menuwindow.h"int main(int argc, char*argv[] ) {
QApplication app(argc, argv);
MWindow window;
window.show();
return app.exec();
}form.h
/media/ubuntu/rootfs/home/debian/jauk/Signalgenerator/CW/CW
#ifndef FORM_H
#define FORM_H
#include <QMainWindow>
#include <QMessageBox>
#include "ui_cwwindow.h"
#include "ui_menuwindow.h"const long fosc = 171798692 ; //Quartzoscillator frequency
class MWindow : public QMainWindow, private Ui::CwWindow {
Q_OBJECT
public:
MWindow(); // constructor
~MWindow() {} // destructordouble get_FR();
unsigned char get_Fb();
long long get_YIGFr();
unsigned int get_YIGDA();
unsigned int get_YIGFilter();
unsigned char get_Ndiv();
//double get_FrDDS();
long get_Phase();
unsigned char get_Koswitch();
unsigned char get_Att();
unsigned int get_Pow();private slots:
void analyseDialog();
void updatef();
void updatep();private:
double FR ; // input frequency [Hz]
double P; // output power [dBm] or [mW]
unsigned char Fb ; // frequency range
long long YIGFr ; //requiered YIG frequency
unsigned int YIGDA ; //requiered YIG D/A
unsigned int YIGFilter ; //requiered YIG Filter
unsigned char Ndiv ; //divider factor for PLL SDI
//double FrDDS ; //requiered DDS frequency = YIGFR/Ndiv -fosc (18667400.00Hz <= FrDDS <= 28201308.00Hz)
long Phase ; //decimal value of 32-bit frequency tuning word for DDS AD9851 = 25*FrDDS
unsigned char Koswitch ; //koaxswitch 3 to 8 decoder HCT 238
unsigned char Att ; //60dB attenuator step 10dB
unsigned int Pow; // input power range fine (0 - 10dB) SDIint decimals ;
double minimum;
double maximum;};
#endif
form.cpp
#include "form.h"
#include "i2ccwn.h"
#include <math.h>//Constructor
MWindow::MWindow() {
setupUi(this);
//Signal-Slot connection
connect( pushButton_2, SIGNAL( clicked() ),
this, SLOT(analyseDialog() ) );connect( pushButton, SIGNAL( clicked() ),
qApp, SLOT(quit() ) );connect( pushButton_2, SIGNAL( clicked() ),
this, SLOT(updatef() ) );connect( pushButton_2, SIGNAL( clicked() ),
this, SLOT(updatep() ) );
}void MWindow::analyseDialog() {
if(comboBox->currentText() == "GHz" ) {
doubleSpinBox->setMaximum ( 31.999999999 );
doubleSpinBox->setDecimals( 9 );
}else if(comboBox->currentText() == "MHz" ) {
doubleSpinBox->setMaximum ( 31999.999999 );
doubleSpinBox->setDecimals( 6 );
}else if(comboBox->currentText() == "KHz" ) {
doubleSpinBox->setMaximum ( 31999999.999 );
doubleSpinBox->setDecimals( 3 );}
else if(comboBox->currentText() == "Hz" ) {
doubleSpinBox->setMaximum ( 31999999999 );
doubleSpinBox->setDecimals( 0 );
}if( comboBox_2->currentText() == "dBm" ) {
doubleSpinBox_2-> setDecimals( 2 ) ;
doubleSpinBox_2-> setMinimum( -50.00 ) ;
doubleSpinBox_2-> setMaximum( 20.00 ) ;
}else if( comboBox_2->currentText() == "mW" ) { doubleSpinBox_2-> setDecimals( 5 ) ; doubleSpinBox_2-> setMinimum( 0.00001 ) ; doubleSpinBox_2-> setMaximum( 100.00000 ) ;
}
} // End of "analyseDialog()"
double MWindow::get_FR() {
if(comboBox->currentText() == "GHz" ) {
FR = doubleSpinBox->value() * 1000000000;
return FR;
}else if(comboBox->currentText() == "MHz" ) {
FR = doubleSpinBox->value() * 1000000;
return FR;
}else if(comboBox->currentText() == "KHz" ) {
FR = doubleSpinBox->value() * 1000;
return FR;
}else if(comboBox->currentText() == "Hz" ) {
FR = doubleSpinBox->value();
return FR;
}
} // End of "get_FR"unsigned char MWindow::get_Fb() {
//get_FR(); Segmentation fault
//cw->get_FR(); -------"----------
//this->get_FR(); -------"----------if( FR < 62500000 ) { "
Fb = 0; "
return Fb; "
}else if( (FR >= 62500000E+6) && (FR < 125000000 ) ) {
Fb = ( FR < 88000000 ) ?1 : 2;
return Fb;
}else if( (FR >= 125000000) && (FR < 250000000 ) ) {
Fb = ( FR < 177000000 ) ?3 : 4;
return Fb;
}else if( (FR >= 250000000) && (FR < 500000000 ) ) {
Fb = ( FR < 353000000 ) ?5 : 6;
return Fb;
}else if( (FR >= 500000000) && (FR < 1000000000 ) ) {
Fb = ( FR < 707000000 ) ?7 : 8;
return Fb;
}else if( (FR >= 1000000000) && (FR < 2000000000 ) ) {
Fb = ( FR < 1400000000 ) ?9 : 10;
return Fb;
}else if( (FR >= 2000000000) && (FR < 4000000000 ) ) {
Fb = ( FR < 2800000000 ) ?11 : 12;
return Fb;
}else if( (FR >= 4000000000) && (FR < 8000000000 ) ) {
Fb = ( FR < 5600000000 ) ?13 : 14;
return Fb;
}else if( (FR >= 8000000000) && (FR < 16000000000 ) ) {
Fb = ( FR < 11200000000 ) ?15 : 16;
return Fb;
}else if( (FR >= 16000000000) && (FR < 32000000000 ) ) {
Fb = ( FR < 22400000000 ) ?17 : 18;
return Fb;
}// Fb = 12;
// returnFb; Segmentation faultreturn 12; // OK without 'Segmentation fault' ...gibt '12' über I2C-Bus aus
} //End of "get_Fb"
unsigned char MWindow::get_Att() {
if( (comboBox_2->currentText() == "dBm" ) ) {
if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 20.0 ) ) {
Att = 0 ;
return Att;
}
else if( (doubleSpinBox_2-> value() > 0.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) {
Att = 10 ;
return Att;
}else if( (doubleSpinBox_2-> value() > -10.0 ) && (doubleSpinBox_2-> value() <= 0.0 ) ) { Att = 20 ; return Att; } else if( (doubleSpinBox_2-> value() > -20.0 ) && (doubleSpinBox_2-> value() <= -10.0 ) ) { Att = 30 ; return Att; } else if( (doubleSpinBox_2-> value() > -30.0 ) && (doubleSpinBox_2-> value() <= -20.0 ) ) { Att = 40 ; return Att; } else if( (doubleSpinBox_2-> value() > -40.0 ) && (doubleSpinBox_2-> value() <= -30.0 ) ) { Att = 50 ; return Att; } else if( (doubleSpinBox_2-> value() > -50.0 ) && (doubleSpinBox_2-> value() <= -40.0 ) ) { Att = 60 ; return Att; }
}
else if( (comboBox_2->currentText() == "mW" ) ) {
if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 100.0 ) ) {
Att = 0 ;
return Att;
}else if( (doubleSpinBox_2-> value() > 1.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) { Att = 10 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.1 ) && (doubleSpinBox_2-> value() <= 1.0 ) ) { Att = 20 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.01 ) && (doubleSpinBox_2-> value() <= 0.1 ) ) { Att = 30 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.001 ) && (doubleSpinBox_2-> value() <= 0.01 ) ) { Att = 40 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.0001 ) && (doubleSpinBox_2-> value() <= 0.001 ) ) { Att = 50 ; return Att; } else if( (doubleSpinBox_2-> value() > 0.00001 ) && (doubleSpinBox_2-> value() <= 0.0001 ) ) { Att = 60 ; return Att; }
}
} //End of "get_Att()"
unsigned int MWindow::get_Pow() {
if( (comboBox_2->currentText() == "dBm" ) ) {
if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 20.0 ) ) {
Pow = ( (doubleSpinBox_2-> value()-10.0) / 10) * 65536 ;
return Pow;
}else if( (doubleSpinBox_2-> value() > 0.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) { Pow = ( (doubleSpinBox_2-> value()-0.0 ) / 10) * 6/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -10.0 ) && (doubleSpinBox_2-> value() <= 0.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+10.0 ) / 10) * 5/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -20.0 ) && (doubleSpinBox_2-> value() <= -10.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+20.0 ) / 10) * 4/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -30.0 ) && (doubleSpinBox_2-> value() <= -20.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+30.0 ) / 10) * 3/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -40.0 ) && (doubleSpinBox_2-> value() <= -30.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+40.0 ) / 10) * 2/7 * 65536 ; return Pow; } else if( (doubleSpinBox_2-> value() > -50.0 ) && (doubleSpinBox_2-> value() <= -40.0 ) ) { Pow = ( (doubleSpinBox_2-> value()+50.0 ) / 10) * 1/7 * 65536 ; return Pow; }
}
else if( (comboBox_2->currentText() == "mW" ) ) {
if( (doubleSpinBox_2-> value() > 10.0 ) && (doubleSpinBox_2-> value() <= 100.0 ) ) {
// Pow = (log10(doubleSpinBox_2-> value() ) -log10(10.0) ) * 65536.0 ;
Pow = log10(doubleSpinBox_2-> value() / 10.0 ) * 65536.0 ;
return Pow;
}else if( (doubleSpinBox_2-> value() > 1.0 ) && (doubleSpinBox_2-> value() <= 10.0 ) ) {
// Pow = (log10(doubleSpinBox_2-> value() ) -log10(1.0) ) * 65536.0 ;
Pow = log10(doubleSpinBox_2-> value() / 1.0 ) * 6/7 * 65536.0 ;
return Pow;
}else if( (doubleSpinBox_2-> value() > 0.1 ) && (doubleSpinBox_2-> value() <= 1.0 ) ) {
// Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.1) ) * 5/7 * 65536.0 ;
Pow = log10(doubleSpinBox_2-> value() / 0.1 ) * 5/7 * 65536.0 ;
return Pow;
}else if( (doubleSpinBox_2-> value() > 0.01 ) && (doubleSpinBox_2-> value() <= 0.1 ) ) {
// Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.01) ) * 4/7 * 65536.0 ;
Pow = log10(doubleSpinBox_2-> value() / 0.01 ) * 4/7 * 65536.0 ;
return Pow;
}else if( (doubleSpinBox_2-> value() > 0.001 ) && (doubleSpinBox_2-> value() <= 0.01 ) ) {
// Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.001) ) * 3/7 * 65536.0 ;
Pow = log10(doubleSpinBox_2-> value() / 0.001 ) * 3/7 * 65536.0
Pow = log10(doubleSpinBox_2-> value() / 0.0001 ) * 2/7 * 65536.0 ;
return Pow;
}else if( (doubleSpinBox_2-> value() > 0.00001 ) && (doubleSpinBox_2-> value() <= 0.0001 ) ) {
// Pow = (log10(doubleSpinBox_2-> value() ) -log10(0.00001) ) * 1/7 * 65536.0 ;
Pow = log10(doubleSpinBox_2-> value() / 0.00001 ) * 1/7 * 65536.0 ;
return Pow;
}}
} // End of "get Pow"
long long MWindow::get_YIGFr() {
if( (FR >= 62500000) && (FR < 125000000 ) ) {
YIGFr = FR * 64;
return YIGFr ;
}else if( (FR >= 125000000) && (FR < 250000000 ) ) {
YIGFr = FR * 32;
return YIGFr ;
}else if( (FR >= 250000000) && (FR < 500000000 ) ) {
YIGFr = FR * 16;
return YIGFr ;
}else if( (FR >= 500000000) && (FR < 1000000000 ) ) {
YIGFr = FR * 8;
return YIGFr ;
}else if( (FR >= 1000000000) && (FR < 2000000000 ) ) {
YIGFr = FR * 4;
return YIGFr ;
}else if( (FR >= 2000000000) && (FR < 4000000000 ) ) {
YIGFr = FR * 2;
return YIGFr ;
}else if( (FR >= 4000000000) && (FR < 8000000000 ) ) {
YIGFr = FR ;
return YIGFr ;
}else if( (FR >= 8000000000) && (FR < 16000000000 ) ) {
YIGFr = FR / 2;
return YIGFr ;
}else if( (FR >= 16000000000) && (FR < 32000000000 ) ) {
YIGFr = FR / 4;
return YIGFr ;
}} // End of "get_YIGFr()
unsigned int MWindow::get_YIGDA() {
YIGDA = (YIGFr/4000000000 -1) * 65536 ;
return YIGDA ;
} // End of "get_YIGDA()"unsigned int MWindow::get_YIGFilter() {
YIGFilter = (YIGFr/4000000000 -1) * 65536 ;
return YIGFilter ;
} // End of "get_YIGFilter()"unsigned char MWindow::get_Koswitch() {
if ( FR < 10000000 ) {
Koswitch = 0b00000000 ;
return Koswitch;
}else if( ( FR >= 10000000) && ( FR < 62500000) ) {
Koswitch = 0b00100000 ;
return Koswitch;
}else if( ( FR >= 62500000) && ( FR < 4000000000) ) {
Koswitch = 0b01000000 ;
return Koswitch;
}else if( ( FR >= 4000000000) && ( FR < 8000000000) ) {
Koswitch = 0b01100000 ;
return Koswitch;
}else if( ( FR >= 8000000000) && ( FR < 16000000000) ) {
Koswitch = 0b10000000 ;
return Koswitch;
}else if( ( FR >= 16000000000) && ( FR < 32000000000) ) {
Koswitch = 0b10100000 ;
return Koswitch;
}} //End of "get_Koswitch()"
unsigned char MWindow::get_Ndiv() {
int n={0},FrDDS={0};
if( YIGFr > 6000000000) {
// (( n >= 31 ) && ( n <= 40 ) );
n = 31;
}else if( YIGFr <= 6000000000 ) {
// (( n >= 20 ) && ( n <= 30 ) );
n = 20;
}
do {
FrDDS = YIGFr/n - fosc ;
Ndiv = n++ ;
}
while (!( FrDDS >= 18677400 && FrDDS <= 28201308 ) );
if (n > 41) {
return 1;
}
return Ndiv;} // End of "get_Ndiv()"
long MWindow::get_Phase() {
Phase = 25 * (YIGFr / Ndiv - fosc) ;
return Phase;} //End of "get_Phase()"
//---------------SLOT Definition------------------
void MWindow::updatef(double) {
I2CCWn m_i2ccwn(2, 0x20); //object
//I2CCWn m_i2ccwnb; //object for default constructor callif(get_FR() !>= doubleSpinBox->value() ) {
FR = doubleSpinBox->value() ;
m_i2ccwn.writeFb();
}
}void MWindow::updatep(double) {
I2CCWn m_i2ccwn(2, 0x20); //object
// m_i2ccwn.writeAtt(); //Segmentation fault// if( att != Att) {
// Att = att;
// m_i2ccwn.writeAtt();
// }}
i2ccwn.h
#ifndef I2C_H_
#define I2C_H_#include <QObject>
#define BBB_I2C_1 "/dev/i2c-1"
#define BBB_I2C_2 "/dev/i2c-2"class I2CCWn{
private:
unsigned int bus;
unsigned int device;
int file;public:
I2CCWn(unsigned int bus, unsigned int device); //constructor declarationI2CCWn(); //default constructor declaration int open();
// virtual int write(unsigned char value);
// virtual unsigned char readRegister(unsigned int registerAddress);
// virtual unsigned char* readRegisters(unsigned int number, unsigned int fromAddress=0);
// virtual int writeRegister(unsigned int registerAddress, unsigned char value);
int writeRegister(unsigned int registerAddress, unsigned char value);
// virtual void debugDumpRegisters(unsigned int number = 0xff);
virtual void close();
virtual ~I2CCWn();void writeAtt(); void writePow(); //SDI void writeFb(); void writeYIGDA(); void writeYIGFilter(); void writeKoswitch(); void writeNdiv(); //SDI void writePhase();
// virtual ~I2CCWn();
};
//} /* namespace exploringBB */
#endif /* I2C_H_ */
i2ccwn.cpp
#include "i2ccwn.h"
#include "form.h"#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sstream>
#include <fcntl.h>
#include <iomanip>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
using namespace std;#define HEX(x) setw(2) << setfill('0') << hex << (int)(x)
class MWindow;
MWindow* cw; // Object
//MWindow cw; // Object---Must construct a QApplication before a QPaintDevice#define IODIRA 0x00 // Input/Output -Direction Register A
#define IODIRB 0x01 // Input/Output -Direction Register B
#define OLATA 0x14 // Output Latch A
#define OLATB 0x15 // Output Latch B// constructor
//I2CCWn::I2CCWn (unsigned int bus = 2, unsigned int device = 0x20) {
I2CCWn::I2CCWn (unsigned int bus, unsigned int device) {bus = bus;
device = device;
file = -1;
open();
writeRegister(IODIRA, 0x00); // 0x00 sets all 8bits of Input/Output -Direction Register A to Output
writeRegister(IODIRB, 0x00); // 0x00 sets all 8bits of Input/Output -Direction Register B to Output
}// constructor
I2CCWn::I2CCWn() {
// QObject (parent),
bus= 2;
device= 0x28; //device 0x20 or 0x28
file= -1;
open();
writeRegister(IODIRA, 0x00);
writeRegister(IODIRB, 0x00);
}// Method open
int I2CCWn::open(){
string name = BBB_I2C_2;if((this->file=::open(name.c_str(), O_RDWR)) < 0){
perror("I2C: failed to open the bus\n");
return 1;
}if(ioctl(this->file, I2C_SLAVE, this->device) < 0){
perror("I2C: Failed to connect to the device\n");
return 1;
}
return 0;
}int I2CCWn::writeRegister(unsigned int registerAddress, unsigned char value) {
unsigned char buffer[2];
buffer[0] = registerAddress;
buffer[1] = value;
if(::write(this->file, buffer, 2)!=2) {
perror("I2C: Failed write to the device\n");
return 1;
}
return 0;
}//Method to output Att on I2C
void I2CCWn:: writeAtt () {
writeRegister (OLATA,cw->get_Att());
writeRegister (OLATB, 0x0f);
writeRegister (OLATB, 0x10);
}/*
//Method to output Pow on I2C/SPIvoid I2CCWn:: writePow () {
device = 0x28;
writeRegister (0x28,0xf0,0x05); //Bridge SC18IS602B MSB_First, SPI-Clock 0 quit, Data clocked on trailing edge SPI
device = 0x20; //SPI clock rate 461kHz
writeRegister (OLATB, 0x15); //Synch AD5660-2 set
device = 0x28;
writeRegister (0x28,0x01,0x00,cw->get_Pow() ) i; //input Pow-data
// writeRegister (0x28,0x01,0x00,cw.get_Pow() ) i; //input Pow-data
device = 0x20;
writeRegister (OLATB, 0x16); //Synch AD5660-2 set 1
}
*///Method to output Fb on I2C
void I2CCWn:: writeFb () {
writeRegister (OLATA,cw->get_Fb());
writeRegister (OLATB, 0x0d);
writeRegister (OLATB, 0x0e);
}//Method to output YIGDA on I2C
void I2CCWn:: writeYIGDA () {
writeRegister (OLATA,cw->get_YIGDA()>>8 ); //Output high Byte
writeRegister (OLATB, 0x01);
writeRegister (OLATB, 0x02);
writeRegister (OLATA,cw->get_YIGDA() & 0x00ff ) ; //Output low Byte
writeRegister (OLATB, 0x01);
writeRegister (OLATB, 0x02);
writeRegister (OLATB, 0x03);
writeRegister (OLATB, 0x02);
}//Method to output YIGFilter on I2C
void I2CCWn:: writeYIGFilter () {
writeRegister (OLATA,cw->get_YIGDA()>>8 ); //Output high Byte
writeRegister (OLATB, 0x04);
writeRegister (OLATB, 0x05);
writeRegister (OLATA,cw->get_YIGDA() & 0x00ff ) ; //Output low Byte
writeRegister (OLATB, 0x04);
writeRegister (OLATB, 0x05);
writeRegister (OLATB, 0x06);
writeRegister (OLATB, 0x05);}
//Method to output Koswitch on I2C
void I2CCWn:: writeKoswitch () {
writeRegister (OLATB,cw->get_Koswitch()); //Output Koswitch
}//Method to output Ndiv on I2C/SDI
//Method to output Phase on I2C
void I2CCWn::writePhase () {
writeRegister (OLATA, 0x00); //W0 Output for 6x REFCLK Multiplyer disabled
writeRegister (OLATB, 0x08);
writeRegister (OLATB, 0x07);
writeRegister (OLATA,cw->get_Phase()>>24 ); //W1
writeRegister (OLATA,cw.get_Phase()>>24 ); //W1
writeRegister (OLATB, 0x08);
writeRegister (OLATB, 0x07);
writeRegister (OLATA,cw->get_Phase()>>16 & 0x00ff); //W2
writeRegister (OLATA,cw.get_Phase()>>16 & 0x00ff); //W2
writeRegister (OLATB, 0x08);
writeRegister (OLATB, 0x07);
writeRegister (OLATA,cw->get_Phase()>>8 & 0x0000ff); //W3
writeRegister (OLATA,cw.get_Phase()>>8 & 0x0000ff); //W3
writeRegister (OLATB, 0x08);
writeRegister (OLATB, 0x07);
writeRegister (OLATA,cw->get_Phase() & 0x000000ff); //W4
writeRegister (OLATA,cw.get_Phase() & 0x000000ff); //W4
writeRegister (OLATB, 0x08);
writeRegister (OLATB, 0x09);
writeRegister (OLATB, 0x07);
}void I2CCWn::close(){
::close(this->file);
this->file = -1;
}I2CCWn:: ~I2CCWn() {
if(file!=-1) this->close();
} -
Hi,
Please use coding tags when posting code. You can use the
</>
button from the post editor tool for that.I guess you posted that in relation to your other thread. You should edit your original post there with this code and please do not forget to put it in coding tags.