12 - Листинг (1061393)
Текст из файла
Московский государственный технический университет
им. Н.Э. Баумана
УТВЕРЖДАЮ ___________________________ "___"_______________2011 г. | СОГЛАСОВАНО ___________________________ "___"_______________2011 г. |
Программа передачи двоичных файлов
"FireFile"
Исходные тексты программы
(вид документа)
Бумага формата А4;
(вид носителя)
16 листов
(количество листов)
Исполнители:
студенты группы ИУ5-79
Сидякин А.А.
Асанов Т.М.
Москва 2011
--- about.cpp ---------------------------------------------------------------------------------------------------
#include "about.h"
#include "ui_about.h"
About::About(QWidget *parent) :
QDialog(parent),
ui(new Ui::About)
{
ui->setupUi(this);
ui->label_2->setStyleSheet("QLabel {color : blue;}");
}
About::~About() {delete ui;}
==========================================================
--- about.h -------------------------------------------------------------------------------------------
#ifndef ABOUT_H
#define ABOUT_H
#include <QDialog>
namespace Ui {class About;}
class About : public QDialog
{
Q_OBJECT
public:
explicit About(QWidget *parent = 0);
~About();
private:
Ui::About *ui;
};
#endif // ABOUT_H
==========================================================
--- main.cpp -----------------------------------------------------------------------------------------
#include <QtGui/QApplication>
#include <QTextCodec>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
MainWindow w;
w.setWindowTitle(QString::fromUtf8("FireFile - передача файлов"));
w.show();
return a.exec();
}
==========================================================
--- functional.h --------------------------------------------------------------------------------------
#include <QSettings>
#include <QFile>
#include <QBitArray>
#include <QByteArray>
#include <QTextCodec>
#include "windows.h"
#define S_MARK -121 // 10000111 // системная метка
#define H_MARK -113 // 10001111 // метка рукопотрясения
#define H_RES_MARK -49 // 11001111 // ответное рукопотрясение
#define NAME_MARK -25 // 11100111 // метка имени файла
#define DATA_MARK -13 // 11110011 // метка содержимого файла
#define B_MARK -8 // обрыв, отмена
#define E_MARK -57 // ошибка
#define A_MARK -61 // всё отлично
#define NO_CHAR -128 // ничего не прочитано
#define MAX_ERRORS 3 // с какого числа ошибок оборвать передачу/приём
// --- кодирование и проверка закодированного -----------------------------------
// кодировать циклическим кодом
void EncodeCc (QBitArray *red)
{
QBitArray pack = *red;
for(int i=4; i>0; i--)
{
if (pack.testBit(i+2))
{
pack.setBit(i+2, false);
if(pack.testBit(i)) pack.setBit(i, false);
else pack.setBit(i, true);
if(pack.testBit(i-1)) pack.setBit(i-1, false);
else pack.setBit(i-1, true);
}
}
red->setBit(2, pack.testBit(2));
red->setBit(1, pack.testBit(1));
red->setBit(0, pack.testBit(0));
}
// проверить закодированное
bool CheckCc (QBitArray *red){
QBitArray pack = *red;
for(int i=4; i>0; i--)
{
if (pack.testBit(i+2))
{
pack.setBit(i+2, false);
if(pack.testBit(i)) pack.setBit(i, false);
else pack.setBit(i, true);
if(pack.testBit(i-1)) pack.setBit(i-1, false);
else pack.setBit(i-1, true);
}
}
if (!(pack.testBit(2)&&pack.testBit(1)&&pack.testBit(0))) return(true);
return(false);
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// --- отправка байта данных в порт --------------------------------------------
void SendByte(char ByteToSend, HANDLE PortHandle)
{
QByteArray Input(&ByteToSend);
QBitArray bits(8);
bits.fill(false);
for(int b=0; b<8; ++b) bits.setBit(b, Input[0]&(1<<b));
QBitArray Apack(8);
Apack.fill(false);
QBitArray Upack(8);
Upack.fill(false);
for (int i=7; i>= 0; i--)
{
if(i<4) Upack.setBit(i+3, bits.testBit(i));
else Apack.setBit((i-1), bits.testBit(i));
}
EncodeCc(&Apack);
EncodeCc(&Upack);
QByteArray Abyte = "";
QByteArray Ubyte = "";
for(int b=0; b<Apack.count(); ++b) Abyte[0] = (Abyte[0] | ((Apack[b]?1:0)<<(b%8)));
for(int b=0; b<Upack.count(); ++b) Ubyte[0] = (Ubyte[0] | ((Upack[b]?1:0)<<(b%8)));
CHAR AB = Abyte[0];
CHAR UB = Ubyte[0];
DWORD write_counter;
WriteFile(PortHandle, &AB, 1, &write_counter, NULL);
WriteFile(PortHandle, &UB, 1, &write_counter, NULL);
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// --- получение байта ---------------------------------------------------------
bool GetFullByte(CHAR FirstHalFBits, HANDLE PortHandle, CHAR &FullByte)
{
QByteArray FHByte(&FirstHalFBits);
QBitArray FBits(8);
FBits.fill(false);
QBitArray FHBit(8);
FHBit.fill(false);
for(int b=0; b<8; ++b) FHBit.setBit(b, FHByte[0]&(1<<b));
if(CheckCc(&FHBit)) {for (int i=0; i<=3; i++)
FBits.setBit(i+4, FHBit.testBit(i+3));} else return false;
// вторая половина байта
CHAR SHalFBits;
DWORD readen;
ReadFile(PortHandle, &SHalFBits, 1, &readen, NULL);
QByteArray SHByte(&SHalFBits);
QBitArray SHBit(8);
SHBit.fill(false);
for(int b=0; b<8; ++b) SHBit.setBit(b, SHByte[0]&(1<<b));
if(CheckCc(&SHBit)) {for (int i = 0; i <= 3; i++)
FBits.setBit(i, SHBit.testBit(i+3));} else return false;
QByteArray Fbyte = "";
for(int b=0; b<FBits.count(); ++b)
Fbyte[0] = (Fbyte[0] | ((FBits[b]?1:0)<<(b%8)));
FullByte = Fbyte[0];
return true;
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
==========================================================
--- mainwindow.cpp -------------------------------------------------------------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "functional.h"
#include <QKeyEvent>
#include <QtDebug>
#include <QFileDialog>
#define TIMEOUT 1000
// это будет там дальше нужно, чтобы определять, открывали ли уже порт
bool attmpt = false,
portAlreadyChoosen = false;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label_2->hide();
ui->progressBar->setRange(0, 1000); // потому что прогресс приёма не определить
logstr = tr("] <b>Запуск программы</b>");
string2log(logstr);
ui->log->append(tr("можете нажать <font color=blue><b>F1</b></font>"));
logstr = "-----------------------------------------";
ui->log->append(logstr);
logstr = tr("<i>выберите порт и настройте его</i>");
ui->log->append(logstr);
logstr = tr("");
ui->log->append(logstr);
ui->lineEdit->setText(tr("выберите файл для передачи..."));
ui->listenBtn->setEnabled(false);
ComListener = new DemonPorta();
config = new QSettings(qApp->applicationDirPath()+"/config.ini",
QSettings::IniFormat);
// а просто так, впишем в конфиг нулевые значения. Реально, просто так
config->setValue("port/Baud_Rate", 0);
config->setValue("port/DataBits", 0);
config->setValue("port/Parity", 0);
config->setValue("port/StopBits", 0);
config->setValue("file/fileToTransf", "");
config->setValue("file/pathForSave", "C:/");
// эта группа в лопосатых купальниках пишет в конфиг изменения настроек
connect(ui->comboBox_2, SIGNAL(currentIndexChanged(QString)),
this, SLOT(BaudRateChanged(QString)));
connect(ui->comboBox_3, SIGNAL(currentIndexChanged(int)),
this, SLOT(ParityChanged(int)));
connect(ui->comboBox_4, SIGNAL(currentIndexChanged(QString)),
this, SLOT(DataBitsChanged(QString)));
connect(ui->comboBox_5, SIGNAL(currentIndexChanged(int)),
this, SLOT(StopBitsChanged(int)));
// эти ребята дают Демону пользоваться GUI'ем
connect(ComListener, SIGNAL(wannaUseLog(QString)),
this, SLOT(toLog(QString)));
connect(ComListener, SIGNAL(setProgr(int)),
this, SLOT(setProgr(int)));
connect(ComListener, SIGNAL(progrFin()),
this, SLOT(finProgr()));
// а вот он вываливается из своей функции, чтобы крикнуть Демону, куда являться
connect(this, SIGNAL(curPortHandle(HANDLE)),
ComListener, SLOT(setPortHandle(HANDLE)));
}
MainWindow::~MainWindow()
{delete ui;}
void DemonPorta::setPortHandle(HANDLE curPort)
{portHandle = curPort;}
void MainWindow::toLog(QString strToLog)
{logstr = strToLog; string2log(logstr);}
void MainWindow::setProgr(int val)
{if(ui->progressBar->value()<997) ui->progressBar->setValue(val);}
void MainWindow::finProgr()
{ui->progressBar->setValue(ui->progressBar->maximum());}
// --- сохранение изменений настроек соединения в файл -------------------------
void MainWindow::BaudRateChanged(QString param)
{config->setValue("port/Baud_Rate", param);}
void MainWindow::DataBitsChanged(QString param)
{config->setValue("port/DataBits", param);}
void MainWindow::ParityChanged(int param)
{config->setValue("port/Parity", param-1);}
void MainWindow::StopBitsChanged(int param)
{config->setValue("port/StopBits", param-1);}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// --- когда нажали на кнопку выбора файла для передачи ------------------------
void MainWindow::on_selectFile_clicked()
{ui->lineEdit->setText(file.getOpenFileName());
config->setValue("file/fileToTransf", ui->lineEdit->text());}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// --- когда нажали на кнопку открытия порта -----------------------------------
void MainWindow::on_tryToConnect_clicked()
{
// заставить выбрать один из портов
if(ui->com1rbt->isChecked()==false && ui->com2rbt->isChecked()==false)
{
logstr = tr("] <font color=red>вы не выбрали порт</font>");
string2log(logstr);
return;
}
// заставить настроить порт
if(ui->comboBox_2->currentIndex()==0
|| ui->comboBox_3->currentIndex()==0
|| ui->comboBox_4->currentIndex()==0
|| ui->comboBox_5->currentIndex()==0)
{
logstr = tr("] <font color=red>необходимо сначала настроить порт</font>");
string2log(logstr);
return;
}
// если порт уже открыт
if(portAlreadyChoosen)
{
logstr = tr("] <font color=red>порт уже открыт</font>");
string2log(logstr);
return;
}
// смотря какой порт выбран
if(ui->com1rbt->isChecked()==true) portstr = "COM1"; else portstr = "COM2";
// попытаться открыть его
workPort = OpenPort(portstr);
attmpt = true; // попытка установления соединения состоялась
portAlreadyChoosen = true; // порт выбрали
disableSettingsChange();
if(workPort == INVALID_HANDLE_VALUE)
{
logstr = tr("] <font color=red>возможно, порт отключён или занят</font>");
string2log(logstr);
portAlreadyChoosen = false;
return;
}
else
{
ui->label->hide();
ui->label_2->show();
ui->groupBox->setEnabled(true);
ui->listenBtn->setEnabled(true);
emit curPortHandle(workPort);
}
}
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// --- когда нажали на кнопку закрытия порта -----------------------------------
void MainWindow::on_tryToDisconnect_clicked()
{
if(attmpt==false)
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.