Mercurial > public > ostc_companion
diff OSTCFrogOperations.cpp @ 8:21ce6187d32e
Minor changes done by automatic style checker
| author | Ideenmodellierer |
|---|---|
| date | Mon, 12 Jan 2026 13:51:17 +0000 |
| parents | 0b3630a29ad8 |
| children |
line wrap: on
line diff
--- a/OSTCFrogOperations.cpp Mon Jan 12 13:49:16 2026 +0000 +++ b/OSTCFrogOperations.cpp Mon Jan 12 13:51:17 2026 +0000 @@ -36,8 +36,8 @@ #include "OSTCFrogOperations.h" +#include "Utils/Exception.h" #include "Utils/Log.h" -#include "Utils/Exception.h" #include "HexFile.h" #include "SettingsDialog.h" @@ -48,30 +48,29 @@ #include <QStringList> // Byte extration, compatible littleendian or bigendian. -#define LOW(x) ((unsigned char)((x) % 256)) -#define HIGH(x) ((unsigned char)((x / (1<<8)) % 256)) -#define UPPER(x) ((unsigned char)((x / (1<<16)) % 256)) -#define UP32(x) ((unsigned char)((x / (1<<24)) % 256)) +#define LOW(x) ((unsigned char) ((x) % 256)) +#define HIGH(x) ((unsigned char) ((x / (1 << 8)) % 256)) +#define UPPER(x) ((unsigned char) ((x / (1 << 16)) % 256)) +#define UP32(x) ((unsigned char) ((x / (1 << 24)) % 256)) -#define IMAGE_ROUNDING 1024 -#define FIRMWARE_AREA 0x3E0000 -#define FIRMWARE_SIZE 0x01D000 +#define IMAGE_ROUNDING 1024 +#define FIRMWARE_AREA 0x3E0000 +#define FIRMWARE_SIZE 0x01D000 -extern QProgressBar* progress; +extern QProgressBar *progress; ////////////////////////////////////////////////////////////////////////////// OSTCFrogOperations::OSTCFrogOperations() - : _firmware(0), - _serialNumber(0), - _isOpen(false), - _commandMode(false) -{ -} + : _firmware(0) + , _serialNumber(0) + , _isOpen(false) + , _commandMode(false) +{} OSTCFrogOperations::~OSTCFrogOperations() { - if( _isOpen ) + if (_isOpen) disconnect(true); } @@ -82,6 +81,7 @@ ////////////////////////////////////////////////////////////////////////////// //QRegExp OSTCFrogOperations::portTemplate() const +#if 0 QRegularExpression OSTCFrogOperations::portTemplate() const { #if defined(Q_OS_MAC) @@ -92,14 +92,25 @@ // a list of connected stuff... return QRegExp("rfcomm.*", Qt::CaseInsensitive); #elif defined(Q_OS_WIN) -// return QRegExp("COM.*", Qt::CaseSensitive); - return QRegularExpression( - "COM([0-9]+)", - QRegularExpression::CaseInsensitiveOption - ); + // return QRegExp("COM.*", Qt::CaseSensitive); + return QRegularExpression("COM([0-9]+)", QRegularExpression::CaseInsensitiveOption); #endif } - +#endif +QRegularExpression OSTCFrogOperations::portTemplate() const +{ +#if defined(Q_OS_MAC) + // Mac-spezifischer regulärer Ausdruck + return QRegularExpression("tty[.]frog.*", QRegularExpression::CaseInsensitiveOption); +#elif defined(Q_OS_LINUX) + // Linux-spezifischer regulärer Ausdruck für rfcomm + // Funktioniert für Debian, Ubuntu, und SUSE (wie von Google beschrieben) + return QRegularExpression("rfcomm.*", QRegularExpression::CaseInsensitiveOption); +#elif defined(Q_OS_WIN) + // Windows-spezifischer regulärer Ausdruck für COM-Ports + return QRegularExpression("COM([0-9]+)", QRegularExpression::CaseInsensitiveOption); +#endif +} QStringList OSTCFrogOperations::listPorts() const { return listBluetoothPorts(); @@ -129,34 +140,34 @@ HardwareOperations::CompanionFeatures OSTCFrogOperations::supported() const { // No ICON, no PARAMETER, no FIRMWARE, no DUMPSCREEN yet... - return CompanionFeatures(NAME|DATE); + return CompanionFeatures(NAME | DATE); } bool OSTCFrogOperations::connect() { try { //---- Open the serial port------------------------------------------- - LOG_TRACE( QString("Open port %1...").arg(Settings::port) ); + LOG_TRACE(QString("Open port %1...").arg(Settings::port)); _isOpen = false; //---- Execute the start protocol ------------------------------------ static char animation[] = "/-\\|"; int reply = 0; - for(int retry=0; retry < 30; ++retry) { - _serial.open( Settings::port, "Frog"); + for (int retry = 0; retry < 30; ++retry) { + _serial.open(Settings::port, "Frog"); _serial.sleep(100); _serial.purge(); _serial.writeByte(0xBB); try { reply = _serial.readByte(); - if( reply == 0x4D ) + if (reply == 0x4D) break; + } catch (...) { } - catch(...) {} - LOG_TRACE( QString("Starting... %1").arg(animation[retry % sizeof animation])); + LOG_TRACE(QString("Starting... %1").arg(animation[retry % sizeof animation])); } - if( reply != 0x4D ) + if (reply != 0x4D) LOG_THROW("Not started"); //---- Enquire about Frog id ----------------------------------------- @@ -165,8 +176,7 @@ //---- Everything is ok ---------------------------------------------- _isOpen = true; return true; - } - catch(const Exception& e) { + } catch (const Exception &e) { _serial.close(); LOG_THROW("Cannot connect " << Settings::port << ": " << e.what()); } @@ -181,7 +191,8 @@ bool OSTCFrogOperations::disconnect(bool /*closing*/) { - if( !_isOpen ) return false; + if (!_isOpen) + return false; _serial.purge(); _serial.writeByte(0xFF); @@ -190,7 +201,7 @@ _serial.purge(); _serial.close(); - _description.clear(); // cleanup for interface updateStatus() + _description.clear(); // cleanup for interface updateStatus() _isOpen = false; return true; @@ -204,40 +215,40 @@ void OSTCFrogOperations::beginCommands() { - Q_ASSERT( !_commandMode ); + Q_ASSERT(!_commandMode); static char animation[] = "/-\\|"; - for(int i=0;; ++i) - { - if( i == 100 ) // 20.0 sec loop ? + for (int i = 0;; ++i) { + if (i == 100) // 20.0 sec loop ? LOG_THROW("Bad reply to open command"); _serial.sleep(100); _serial.purge(); - _serial.writeByte(0xAA); // Start byte + _serial.writeByte(0xAA); // Start byte int reply = 0; try { reply = _serial.readByte(); - } catch(...) {} - if( reply == 0x4B ) + } catch (...) { + } + if (reply == 0x4B) goto Started; - LOG_TRACE(QString("Connecting %1") - .arg(animation[i%4])); + LOG_TRACE(QString("Connecting %1").arg(animation[i % 4])); _serial.sleep(200); continue; -Started: + Started: unsigned char buffer[] = "\xAA\xAB\xAC"; _serial.writeBlock(buffer, 3); try { unsigned char reply = _serial.readByte(); - if( reply == 0x4C ) { + if (reply == 0x4C) { _commandMode = true; return; } - } catch(...) {} + } catch (...) { + } _serial.sleep(200); } @@ -247,15 +258,15 @@ void OSTCFrogOperations::endCommands() { - Q_ASSERT( _commandMode ); + Q_ASSERT(_commandMode); _serial.sleep(100); _serial.purge(); - _serial.writeByte(0xFF); // Exit service mode + _serial.writeByte(0xFF); // Exit service mode _serial.sleep(10); unsigned char buffer = _serial.readByte(); - if( buffer != 0xFF ) + if (buffer != 0xFF) LOG_THROW("End failed"); _commandMode = false; @@ -266,42 +277,40 @@ void OSTCFrogOperations::eraseRange(unsigned int addr, unsigned int size) { - Q_ASSERT( _commandMode ); + Q_ASSERT(_commandMode); // Convert size to number of pages, rounded up. size = ((size + 4095) / 4096); - if( size < 256 || addr != 0x300000 ) - { + if (size < 256 || addr != 0x300000) { unsigned char buffer[4]; // Erase just the needed pages. buffer[0] = UPPER(addr); buffer[1] = HIGH(addr); buffer[2] = LOW(addr); buffer[3] = LOW(size); - _serial.writeByte(0x42); // Command + _serial.writeByte(0x42); // Command _serial.sleep(10); _serial.writeBlock(buffer, 4); // Wait (120/4)ms by block of 4K, plus 3% VAT to be sure. _serial.sleep(40 + size * 31); - } - else - { + } else { // Erase the whole 512KB of icon memory... _serial.writeByte(0x41); _serial.sleep(3000); } try { - (void)_serial.readByte(); - } catch(...) {} + (void) _serial.readByte(); + } catch (...) { + } } ////////////////////////////////////////////////////////////////////////////// void OSTCFrogOperations::startWrite(unsigned int addr) { - Q_ASSERT( _commandMode ); + Q_ASSERT(_commandMode); unsigned char buffer[3]; buffer[0] = UPPER(addr); @@ -319,23 +328,21 @@ void OSTCFrogOperations::stopWrite() { - Q_ASSERT( _commandMode ); + Q_ASSERT(_commandMode); _serial.flush(); _serial.sleep(200); // Should be > 100ms. unsigned char reply = _serial.readByte(); - if( reply != 0x4C ) + if (reply != 0x4C) LOG_THROW("stopWrite"); } ////////////////////////////////////////////////////////////////////////////// -void OSTCFrogOperations::readBytes(unsigned int addr, - unsigned char* ptr, - unsigned int size) +void OSTCFrogOperations::readBytes(unsigned int addr, unsigned char *ptr, unsigned int size) { - Q_ASSERT( _commandMode ); + Q_ASSERT(_commandMode); unsigned char buffer[6]; buffer[0] = UPPER(addr); @@ -352,11 +359,11 @@ _serial.sleep(10); unsigned int len = _serial.readBlock(ptr, size); - if( len < size ) + if (len < size) LOG_THROW("readBytes too short"); unsigned char reply = _serial.readByte(); - if( reply != 0x4C ) + if (reply != 0x4C) LOG_THROW("readBytes"); } @@ -370,52 +377,52 @@ { //---- get model HardwareDescriptor hw = hardwareDescriptor(); - if( hw != HW_UNKNOWN_OSTC && hw != HW_Frog ) + if (hw != HW_UNKNOWN_OSTC && hw != HW_Frog) LOG_THROW("Not a Frog."); //---- get identity - _serial.sleep(100); // Make sure last command is finished. + _serial.sleep(100); // Make sure last command is finished. _serial.purge(); _serial.writeByte('i'); // 0x63 - unsigned char buffer[1+2+2+13+1] = {0}; + unsigned char buffer[1 + 2 + 2 + 13 + 1] = {0}; unsigned len = _serial.readBlock(buffer, sizeof buffer); - if( len != sizeof buffer || buffer[0] != 'i' || buffer[18] != 0x4D ) + if (len != sizeof buffer || buffer[0] != 'i' || buffer[18] != 0x4D) LOG_THROW("get identity data"); - _serialNumber = buffer[1] + buffer[2]*256; - _firmware = buffer[3]*256 + buffer[4]; + _serialNumber = buffer[1] + buffer[2] * 256; + _firmware = buffer[3] * 256 + buffer[4]; - _description = QString("%1 #%2, v%3.%4, %5") - .arg(model()) - .arg(_serialNumber, 4, 10, QChar('0')) - .arg(_firmware / 256).arg(_firmware % 256) - .arg( QString::fromLatin1((char*)buffer+5, 13) - .replace(QChar('\0'), "") - .trimmed() ); + _description + = QString("%1 #%2, v%3.%4, %5") + .arg(model()) + .arg(_serialNumber, 4, 10, QChar('0')) + .arg(_firmware / 256) + .arg(_firmware % 256) + .arg(QString::fromLatin1((char *) buffer + 5, 13).replace(QChar('\0'), "").trimmed()); LOG_TRACE("Found " << _description); } ////////////////////////////////////////////////////////////////////////////// -void OSTCFrogOperations::writeText(const QString& _msg) +void OSTCFrogOperations::writeText(const QString &_msg) { // Pad to 15 chars: QByteArray ascii = (_msg + QString(15, QChar(' '))).left(15).toLatin1(); - _serial.sleep(100); // Make sure last command is finished. + _serial.sleep(100); // Make sure last command is finished. _serial.purge(); - _serial.writeByte('n'); // 0x6E + _serial.writeByte('n'); // 0x6E unsigned char reply = _serial.readByte(); - if( reply != 'n' ) + if (reply != 'n') LOG_THROW("message start"); - _serial.writeBlock((unsigned char *)ascii.constData(), 15); + _serial.writeBlock((unsigned char *) ascii.constData(), 15); reply = _serial.readByte(); - if( reply != 0x4D ) + if (reply != 0x4D) LOG_THROW("message end"); } @@ -431,17 +438,17 @@ buffer[4] = date.date().day(); buffer[5] = date.date().year() % 100; - _serial.sleep(100); // Make sure last command is finished. + _serial.sleep(100); // Make sure last command is finished. _serial.purge(); _serial.writeByte('b'); // 0x62 unsigned char reply = _serial.readByte(); - if( reply != 'b' ) + if (reply != 'b') LOG_THROW("sync time"); - _serial. writeBlock( buffer, sizeof buffer); + _serial.writeBlock(buffer, sizeof buffer); reply = _serial.readByte(); - if( reply != 0x4D ) + if (reply != 0x4D) LOG_THROW("sync time end"); writeText("Set " + date.toString("MM/dd hh:mm")); @@ -458,19 +465,19 @@ void OSTCFrogOperations::setName(const QString &newName) { - QByteArray padded = (newName+QString(13, QChar(' '))).left(13).toLatin1(); + QByteArray padded = (newName + QString(13, QChar(' '))).left(13).toLatin1(); - _serial.sleep(100); // Make sure last command is finished. + _serial.sleep(100); // Make sure last command is finished. _serial.purge(); - _serial.writeByte('c'); // 0x63 + _serial.writeByte('c'); // 0x63 unsigned char reply = _serial.readByte(); - if( reply != 'c' ) + if (reply != 'c') LOG_THROW("set custom text"); - _serial.writeBlock((unsigned char*)padded.constData(), 13); + _serial.writeBlock((unsigned char *) padded.constData(), 13); reply = _serial.readByte(); - if( reply != 0x4D ) + if (reply != 0x4D) LOG_THROW("custom text end"); // Re-read new name: @@ -480,7 +487,7 @@ ////////////////////////////////////////////////////////////////////////////// -void OSTCFrogOperations::setIcons(const QString &/*fileName*/) +void OSTCFrogOperations::setIcons(const QString & /*fileName*/) { // beginCommands(); // eraseRange(0x000000, 0x00000); @@ -488,7 +495,7 @@ // stopWrite(); // endCommands(); - LOG_THROW( "Set icons: Not yet implemented." ); + LOG_THROW("Set icons: Not yet implemented."); } int OSTCFrogOperations::firmware() const @@ -508,12 +515,8 @@ /////////////////////////////////////////////////////////////////////////////// -static unsigned char frogSecretKey[16] = { - 111, 85, 190, 69, - 108,254, 242, 19, - 231, 49, 248,255, - 233, 48, 176,241 -}; +static unsigned char frogSecretKey[16] + = {111, 85, 190, 69, 108, 254, 242, 19, 231, 49, 248, 255, 233, 48, 176, 241}; void OSTCFrogOperations::loadFirmware(HexFile &hex, const QString &fileName) const { @@ -545,18 +548,22 @@ // Compute magic checksum's checksum. buffer[4] = 0x55; - buffer[4] ^= buffer[0]; buffer[4] =(buffer[4]<<1 | buffer[4]>>7); - buffer[4] ^= buffer[1]; buffer[4] =(buffer[4]<<1 | buffer[4]>>7); - buffer[4] ^= buffer[2]; buffer[4] =(buffer[4]<<1 | buffer[4]>>7); - buffer[4] ^= buffer[3]; buffer[4] =(buffer[4]<<1 | buffer[4]>>7); + buffer[4] ^= buffer[0]; + buffer[4] = (buffer[4] << 1 | buffer[4] >> 7); + buffer[4] ^= buffer[1]; + buffer[4] = (buffer[4] << 1 | buffer[4] >> 7); + buffer[4] ^= buffer[2]; + buffer[4] = (buffer[4] << 1 | buffer[4] >> 7); + buffer[4] ^= buffer[3]; + buffer[4] = (buffer[4] << 1 | buffer[4] >> 7); - _serial.sleep(100); // Make sure last command is finished. + _serial.sleep(100); // Make sure last command is finished. _serial.purge(); _serial.writeByte('P'); // 0x50 unsigned char reply = _serial.readByte(); - if( reply != 'P' ) - LOG_THROW( "Programming start" ); + if (reply != 'P') + LOG_THROW("Programming start"); _serial.writeBlock(buffer, sizeof buffer); _serial.sleep(4000); @@ -565,10 +572,8 @@ // with ot without reprogramming... _serial.close(); _isOpen = false; - } - catch(const Exception& e) { - LOG_TRACE(QString("Cannot upgrade: <font color='red'>%1</font>") - .arg(e.what())); + } catch (const Exception &e) { + LOG_TRACE(QString("Cannot upgrade: <font color='red'>%1</font>").arg(e.what())); // Unknown state: so make a hard cleanup: _commandMode = false;
