Checkpoint. Начало переноса кода работы с ардуинёй в отдельный класс. Вроде бы работает чтение. Остальное как нибудь потом...

This commit is contained in:
Sergey V. Karpesh 2019-12-22 02:02:53 +03:00
parent b8dbae2a6f
commit 58168358ab
6 changed files with 267 additions and 161 deletions

136
gui/arduino.cpp Normal file
View File

@ -0,0 +1,136 @@
#include "arduino.h"
#include <QDebug>
arduino::arduino(QSerialPort *port)
{
serialPort = port;
}
void arduino::send(const QByteArray &data)
{
serialPort->write(data);
}
void arduino::recieve()
{
while (!serialPort->atEnd()) {
buffer.append(serialPort->read(100));
emit blockComplete(buffer.length());
//qDebug() << "readed data: " << buffer.length();
}
if (buffer.length() >= bufSize)
emit readComplete(buffer);
}
void arduino::selectChip(chip type)
{
switch(type){
case NONE:
bufSize = 0;
break;
case C16:
bufSize = 0x07ff + 1;
send("a");
break;
case C32:
bufSize = 0x0fff + 1;
send("b");
break;
case C64:
bufSize = 0x1fff + 1;
send("c");
break;
case C128:
bufSize = 0x3fff + 1;
send("d");
break;
case C256:
bufSize = 0x7fff + 1;
send("e");
break;
case C512:
bufSize = 0xffff + 1;
send("f");
break;
}
emit chipUpdated(bufSize);
}
uint32_t arduino::getChipSize()
{
return bufSize;
}
void arduino::readChip()
{
buffer.clear();
serialDataConnection = QObject::connect(serialPort, SIGNAL(readyRead()), this, SLOT(recieve()));
send("r");
/*
static uint32_t count = 0;
const QByteArray data = serialPort->readAll();
if (data.count()){
memcpy(&(bufWork.data())[count], data.data(), data.count());
count += data.count();
}
ui->progressBar->setValue(count);
if (count >= bufSize){
ui->progressBar->setValue(bufSize);
QObject::disconnect(serialDataConnection);
updateButtons(true, true);
log(QString("Readed %1 bytes.").arg(count));
count = 0;
emit readComplete(data);
//emit bufferUpdated();
}
*/
}
void arduino::writeChip(QByteArray data)
{
QByteArray ack;
QByteArray buf;
buf.clear();
// +1 нужен для записи последнего блока
for (uint32_t i = 0; i <= bufSize; i++){
buf.append(data[i]);
if (i && ((i & 0xf) == 0)){
// 16 bytes block
send(buf);
buf.clear();
ack = serialPort->readAll();
ack.clear();
if (bufSize == 2048){
// Correct time to 27C16
while (serialPort->waitForReadyRead(320)){
ack.append(serialPort->readAll());
}
} else {
while (serialPort->waitForReadyRead(20)){
ack.append(serialPort->readAll());
}
}
if (ack.indexOf("Complete block ") == -1){
uint16_t address = 0;
uint8_t value = 0xff;
emit writeError(address, value);
return;
}
}
}
emit writeComplete();
}
void arduino::voltageMesurment(bool enable)
{
if (enable) {
send("v");
}
}

53
gui/arduino.h Normal file
View File

@ -0,0 +1,53 @@
#ifndef ARDUINO_H
#define ARDUINO_H
#include <QObject>
#include <QSerialPort>
class arduino : public QObject
{
Q_OBJECT
private:
uint32_t bufSize;
QByteArray buffer;
QSerialPort *serialPort = NULL;
QMetaObject::Connection serialDataConnection;
void send(const QByteArray &data);
private slots:
void recieve();
public:
enum chip {
NONE,
C16,
C32,
C64,
C128,
C256,
C512
};
explicit arduino(QSerialPort *port);
uint32_t getChipSize();
void selectChip(chip type);
void readChip();
void writeChip(QByteArray data);
void voltageMesurment(bool enable);
signals:
void chipUpdated(uint32_t size);
void blockComplete(uint32_t address);
void readComplete(QByteArray data);
void readError(uint16_t address, uint8_t value);
void writeComplete();
void writeError(uint16_t address, uint8_t value);
void voltage(float v);
};
#endif // ARDUINO_H

View File

@ -26,10 +26,12 @@ DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
mainwindow.cpp
mainwindow.cpp \
arduino.cpp
HEADERS += \
mainwindow.h
mainwindow.h \
arduino.h
FORMS += \
mainwindow.ui

View File

@ -18,7 +18,6 @@ MainWindow::MainWindow(QWidget *parent) :
{
ui->setupUi(this);
QObject::connect(this, SIGNAL(chipUpdated()), this, SLOT(resizeBuffers()));
//QObject::connect(this, SIGNAL(bufferUpdated()), this, SLOT(updateButtons()));
updatePortsConnection = QObject::connect(&updatePortsTimer, SIGNAL(timeout()), this, SLOT(reload_ports()));
@ -91,8 +90,12 @@ void MainWindow::openSerialPort(QString path)
readData.append(serialPort->readAll());
if (readData.indexOf("Arduino 27 Series programmer", 0) != -1){
log(QString("Connect successful"));
mArduino = new arduino(serialPort);
mArduino->selectChip(arduino::C256);
//mArduino->readChip();
chipSelected = true;
//QObject::connect(serialPort, SIGNAL(errorOccurred()), this, SLOT(closeSerialPort()));
QObject::connect(mArduino, SIGNAL(chipUpdated(uint32_t)), this, SLOT(resizeBuffers()));
chipSelectSetEnabled(true);
ui->updateButton->setEnabled(false);
@ -198,97 +201,17 @@ void MainWindow::updateButtons(bool actions, bool buffer)
void MainWindow::on_writeChipButton_clicked()
{
writeData("w");
writeChip();
mArduino->writeChip(bufWork);
}
void MainWindow::writeData(const QByteArray &data)
{
serialPort->write(data);
}
void MainWindow::writeChip()
{
QByteArray data;
QByteArray readData;
log(QString("Writing %1 bytes to chip...").arg(bufSize));
ui->progressBar->setMaximum(bufSize);
data.clear();
// +1 нужен для записи последнего блока
for (uint32_t i = 0; i <= bufSize; i++){
ui->progressBar->setValue(i);
data.append(bufWork[i]);
if (i && ((i & 0xf) == 0)){
// 16 bytes block
writeData(data);
//qDebug("Send block 0x%04X-0x%04X\n", (i - 16), (i - 1));
data.clear();
readData = serialPort->readAll();
readData.clear();
if (bufSize == 2048){
// Correct time to 27C16
while (serialPort->waitForReadyRead(320)){
readData.append(serialPort->readAll());
}
} else {
while (serialPort->waitForReadyRead(20)){
readData.append(serialPort->readAll());
}
}
if (readData.indexOf("Complete block ") == -1){
log(QString("Writing error"));
return;
}
}
}
log(QString("Writing successful"));
}
void MainWindow::on_readChipButton_clicked()
{
bufferClear = false;
bufCheck.fill(0);
readChip();
checkClearConnection = QObject::connect(this, SIGNAL(chipReaded()), this, SLOT(checkClear()));
}
void MainWindow::readChip()
{
updateButtons(false, false);
log(QString("Reading %1 bytes from chip...").arg(bufSize));
// clear serial buffer
QByteArray data = serialPort->readAll();
ui->progressBar->setMaximum(bufSize);
serialDataConnection = QObject::connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
writeData("r");
}
void MainWindow::readData()
{
static uint32_t count = 0;
const QByteArray data = serialPort->readAll();
if (data.count()){
memcpy(&(bufWork.data())[count], data.data(), data.count());
count += data.count();
}
ui->progressBar->setValue(count);
if (count >= bufSize){
ui->progressBar->setValue(bufSize);
QObject::disconnect(serialDataConnection);
updateButtons(true, true);
log(QString("Readed %1 bytes.").arg(count));
count = 0;
emit chipReaded();
emit bufferUpdated();
}
ui->progressBar->setMaximum(mArduino->getChipSize());
log(QString("Reading %1 bytes from chip...").arg(mArduino->getChipSize()));
mArduino->readChip();
progressBarConnection = QObject::connect(mArduino, SIGNAL(blockComplete(uint32_t)), this, SLOT(chipOperationProgressBar(uint32_t)));
checkClearConnection = QObject::connect(mArduino, SIGNAL(readComplete(QByteArray)), this, SLOT(checkClear()));
}
void MainWindow::checkClear()
@ -432,7 +355,7 @@ void MainWindow::showBuf()
}
}
void MainWindow::resizeBuffers()
void MainWindow::resizeBuffers(uint32_t size)
{
chipSelected = true;
@ -451,63 +374,51 @@ void MainWindow::on_verifyChipButton_clicked()
{
// Backup work buffer
bufCheck = bufWork;
readChip();
verifyDataConnection = QObject::connect(this, SIGNAL(chipReaded()), this, SLOT(verifyData()));
mArduino->readChip();
verifyDataConnection = QObject::connect(mArduino, SIGNAL(readComplete()), this, SLOT(verifyData()));
}
void MainWindow::on_c16Button_clicked()
{
log("Select 27C16 chip");
bufSize = 0x07ff + 1;
writeData("a");
emit chipUpdated();
mArduino->selectChip(arduino::C16);
}
void MainWindow::on_c32Button_clicked()
{
log("Select 27C32 chip");
bufSize = 0x0fff + 1;
writeData("b");
emit chipUpdated();
mArduino->selectChip(arduino::C32);
}
void MainWindow::on_c64Button_clicked()
{
log("Select 27C64 chip");
bufSize = 0x1fff + 1;
writeData("c");
emit chipUpdated();
mArduino->selectChip(arduino::C64);
}
void MainWindow::on_c128Button_clicked()
{
log("Select 27C128 chip");
bufSize = 0x3fff + 1;
writeData("d");
emit chipUpdated();
mArduino->selectChip(arduino::C128);
}
void MainWindow::on_c256Button_clicked()
{
log("Select 27C256 chip");
bufSize = 0x7fff + 1;
writeData("e");
emit chipUpdated();
mArduino->selectChip(arduino::C256);
}
void MainWindow::on_c512Button_clicked()
{
log("Select 27C512 chip");
bufSize = 0xffff + 1;
writeData("f");
emit chipUpdated();
mArduino->selectChip(arduino::C512);
}
void MainWindow::showVoltage()
{
writeData("v");
//writeData("v");
QByteArray readData = serialPort->readAll();
QString str = "Programming voltage: ";
int8_t pos;
@ -546,6 +457,11 @@ void MainWindow::on_voltageChipButton_toggled(bool checked)
}
}
void MainWindow::chipOperationProgressBar(uint32_t value)
{
ui->progressBar->setValue(value);
}
void MainWindow::on_progressBar_valueChanged(int value)
{
if (updateVoltageConnection){

View File

@ -1,6 +1,8 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "arduino.h"
#include <QMainWindow>
#include <QSerialPort>
#include <QListWidgetItem>
@ -26,9 +28,6 @@ signals:
void chipUpdated();
private slots:
void readData();
void showBuf();
void on_openFileButton_clicked();
@ -57,7 +56,7 @@ private slots:
void on_c512Button_clicked();
void resizeBuffers();
void resizeBuffers(uint32_t size);
void on_connectButton_clicked();
@ -79,14 +78,18 @@ private slots:
void on_progressBar_valueChanged(int value);
void chipOperationProgressBar(uint32_t value);
private:
Ui::MainWindow *ui;
QSerialPort *serialPort = NULL;
arduino *mArduino = NULL;
QTimer updatePortsTimer;
QTimer updateVoltageTimer;
QMetaObject::Connection updatePortsConnection;
QMetaObject::Connection progressBarConnection;
QMetaObject::Connection serialDataConnection;
QMetaObject::Connection verifyDataConnection;
QMetaObject::Connection checkClearConnection;
@ -102,16 +105,10 @@ private:
void log(QString str);
void readChip();
void openSerialPort(QString path);
void closeSerialPort();
void writeData(const QByteArray &data);
void writeChip();
void chipSelectSetEnabled (bool state);
};

View File

@ -1,3 +1,5 @@
#define TRUE 1
#define FALSE 0
/* 74HC595 control (address lines) */
#define shiftLatchPin A1
@ -63,11 +65,17 @@ void select_chip (chipType new_chip);
chipType chip = NONE;
Modes mode = WAIT;
uint8_t log_enable = FALSE;
uint16_t start_address = 0x0000;
uint16_t end_address = 0x0000;
#define BUF_LEN 16
uint8_t buf[BUF_LEN];
void message(const char* mes){
if (log_enable)
Serial.println(mes);
}
void setup() {
// 74HC595 (*2)
pinMode(shiftLatchPin, OUTPUT);
@ -105,9 +113,7 @@ void loop() {
mode = WAIT;
break;
}
#ifdef MESSAGES
Serial.println("Read mode.");
#endif
message("Read mode.");
read_mode();
if (chip == C16) digitalWrite(readVoltageEnable, LOW);
digitalWrite(chipEnable, LOW);
@ -115,7 +121,7 @@ void loop() {
for (uint16_t i = start_address; i <= end_address; i++) {
uint8_t data = read_byte(i);
Serial.write(&data, sizeof(data));
if (i == end_address) break;
if (i == end_address) break; // Защита от переполнения uint16
}
digitalWrite(outputEnable, HIGH);
digitalWrite(chipEnable, HIGH);
@ -127,11 +133,7 @@ void loop() {
mode = WAIT;
break;
}
#ifdef MESSAGES
Serial.print("n");
#endif
write_mode();
program_voltage_set(true);
message("Write mode");
/*for (int i = start_address; i <= end_address; i++) {
Serial.println(i, HEX);
write_byte(i, 0x89);
@ -139,7 +141,7 @@ void loop() {
for (uint16_t i = start_address; i <= end_address; i += BUF_LEN) {
Serial.print("Write block ");
Serial.println(i);
uint8_t count = Serial.readBytes(buf, BUF_LEN);
uint8_t count = Serial.readBytes((char*)buf, BUF_LEN);
if (count != BUF_LEN) {
Serial.print("Error on block");
Serial.println(i);
@ -148,16 +150,32 @@ void loop() {
break;
}
for (uint16_t j = 0; j < BUF_LEN; j++) {
// Write byte
write_mode();
program_voltage_set(true);
write_byte((i + j), buf[j]);
program_voltage_set(false);
// Verify byte
read_mode();
if (chip == C16) digitalWrite(readVoltageEnable, LOW);
digitalWrite(chipEnable, LOW);
digitalWrite(outputEnable, LOW);
uint8_t verify = get_data();
digitalWrite(outputEnable, HIGH);
digitalWrite(chipEnable, HIGH);
if (chip == C16) digitalWrite(readVoltageEnable, HIGH);
if (buf[j] != virify){
Serial.print("Error on address ");
Serial.println(i + j);
mode = WAIT;
}
}
Serial.print("Complete block ");
Serial.println(i);
if (i == end_address) break;
}
program_voltage_set(false);
#ifdef MESSAGES
Serial.println("Write success.");
#endif
message("Write success.");
mode = WAIT;
break;
case VOLTAGE:
@ -166,10 +184,8 @@ void loop() {
mode = WAIT;
break;
default:
#ifdef MESSAGES
if (chip == NONE) Serial.println("Chip not selected!");
Serial.println("Wait commands...");
#endif
if (chip == NONE) message("Chip not selected!");
message("Wait commands...");
while (Serial.available()) Serial.read();
do {} while (Serial.available() == 0);
char incomingByte = Serial.read();
@ -195,52 +211,38 @@ void select_chip (chipType new_chip) {
digitalWrite(powerEnable, LOW);
chip = new_chip;
end_address = 0x07ff;
#ifdef MESSAGES
Serial.println("Select 27C16 chip.");
#endif
message("Select 27C16 chip.");
break;
case C32:
digitalWrite(powerEnable, LOW);
chip = new_chip;
end_address = 0x0fff;
#ifdef MESSAGES
Serial.println("Select 27C32 chip.");
#endif
message("Select 27C32 chip.");
break;
case C64:
chip = new_chip;
end_address = 0x1fff;
#ifdef MESSAGES
Serial.println("Select 27C64 chip.");
#endif
message("Select 27C64 chip.");
break;
case C128:
chip = new_chip;
end_address = 0x3fff;
#ifdef MESSAGES
Serial.println("Select 27C128 chip.");
#endif
message("Select 27C128 chip.");
break;
case C256:
chip = new_chip;
end_address = 0x7fff;
#ifdef MESSAGES
Serial.println("Select 27C256 chip.");
#endif
message("Select 27C256 chip.");
break;
case C512:
chip = C512;
end_address = 0xffff;
#ifdef MESSAGES
Serial.println("Select 27C512 chip.");
#endif
message("Select 27C512 chip.");
break;
default:
chip = NONE;
end_address = 0x0000;
#ifdef MESSAGES
Serial.println("Chip not selected!");
#endif
message("Chip not selected!");
}
}