diff --git a/ckeystonecomm.cpp b/ckeystonecomm.cpp index 5b1d73c..231c7b1 100644 --- a/ckeystonecomm.cpp +++ b/ckeystonecomm.cpp @@ -13,12 +13,6 @@ #define HEAD 0xFE #define END 0xFD -#define MSC_DATA_LENGTH (100 * 1024) -#define MAX_SEGMENT_SIZE 8191 -#define MAX_IMAGE_SIZE 100 * 1024 // bytes, ETSI TS 101 499 -#define MAX_NAME_LENGTH 100 -#define EXPECTED_IMAGE_LENGTH 1000 - // Set GPIO function #define DATA_IN 0 #define DATA_OUT 1 @@ -45,6 +39,41 @@ #define ANTENNA_RELAY_PIN 11 +QString programTypeText[] = +{ + "", + "News", + "Current Affairs", + "Information", + "Sport", + "Education", + "Drama", + "Arts", + "Science", + "Talk", + "Pop Music", + "Rock Music", + "Easy Listening", + "Light Classical", + "Classical Music", + "Other Music", + "Weather", + "Finance", + "Children", + "Factual", + "Religion", + "Phone In", + "Travel", + "Leisure", + "Jazz and Blues", + "Country Music", + "National Music", + "Oldies Music", + "Folk Music", + "Documentary", + "Undefined", + "Undefined" +}; cKeyStoneCOMM::cKeyStoneCOMM(const QString& commPort, QObject *parent) : QObject{parent}, @@ -55,7 +84,10 @@ cKeyStoneCOMM::cKeyStoneCOMM(const QString& commPort, QObject *parent) : m_initialized{false}, m_totalProgram{0}, m_currentProgram{0}, - m_mutePrevVolume{0} + m_mutePrevVolume{0}, + m_mainTransportID{0}, + m_MSCDataIndex{0}, + m_imageDataIndex{0} { } @@ -467,6 +499,16 @@ QString cKeyStoneCOMM::programName() return(getProgramName(m_currentMode, m_currentProgram, 1)); } +QString cKeyStoneCOMM::programType() +{ + int8_t programType = getProgramType(m_currentMode, m_currentProgram); + + if(programType < 0 || programType > 31) + return(""); + + return(programTypeText[programType]); +} + QString cKeyStoneCOMM::programText() { return(getProgramText()); @@ -853,7 +895,7 @@ QString cKeyStoneCOMM::getProgramText() programText = QString::fromWCharArray((wchar_t *)&tempBuffer[0], unicodesize-1).trimmed(); #endif - return(0); + return(programText); } else if((input[1] == 0x00) && (input[2] == 0x02)) @@ -870,6 +912,48 @@ QString cKeyStoneCOMM::getProgramText() return(programText); } +int8_t cKeyStoneCOMM::getProgramType(char mode, long dabIndex) +{ + uint16_t dwBytes; + unsigned char input[9] = {0}; + unsigned char output[] = {HEAD,0x01,0x2C,0x01,0x00,0x04,0xFF,0xFF,0xFF,0xFF,END}; + unsigned char strChannel[4] = {0}; + + if((mode != STREAM_MODE_DAB) && (mode != STREAM_MODE_FM)) + return(-1); + + if(mode == STREAM_MODE_DAB) + { + memcpy(&strChannel[0], &dabIndex, sizeof(long)); + output[6] = strChannel[3]; + output[7] = strChannel[2]; + output[8] = strChannel[1]; + output[9] = strChannel[0]; + } + + if(!writeSerialBytes(output, 11, &dwBytes)) + return(-1); + + if(dwBytes != 11) + return(-1); + + if(!readSerialBytes(input, &dwBytes)) + return(-1); + + if(dwBytes != 8) + return(-1); + + if(goodHeader(input, dwBytes)) + { + if((input[1] == 0x01) && (input[2] == 0x2C)) + return(input[6]); + else + return(-1); + } + else + return(-1); +} + QString cKeyStoneCOMM::getProgramName(char mode, long dabIndex, char namemode) { uint16_t dwBytes; @@ -981,3 +1065,53 @@ void cKeyStoneCOMM::serialReadError(QSerialPort::SerialPortError error) #endif } } + + +bool cKeyStoneCOMM::clearDatabase() +{ + uint16_t dwBytes; + unsigned char input[8] = {0}; + unsigned char output[] = {HEAD,0x00,0x01,0x01,0x00,0x01,0x01,END}; + + if(!writeSerialBytes(output, 8, &dwBytes)) + return(false); + + // need to check the return + if(!readSerialBytes(input, &dwBytes)) + return(false); + else + { + if(goodHeader(input, dwBytes)) + { + if(input[2] == 0x01) + { + QThread::msleep(1000); + +// while(!isSysReady()) +// { +// QThread::msleep(1000); +// } + + return(true); + } + else + return(false); + } + else + return(false); + } + + return(true); +} + +bool cKeyStoneCOMM::clearFM() +{ + return(true); +} + +bool cKeyStoneCOMM::clearDAB() +{ + clearDatabase(); + + return(true); +} diff --git a/ckeystonecomm.h b/ckeystonecomm.h index 1250ce7..4a7222e 100644 --- a/ckeystonecomm.h +++ b/ckeystonecomm.h @@ -10,6 +10,12 @@ #define TEXT_BUFFER_LEN 300 +#define MSC_DATA_LENGTH (100 * 1024) +#define MAX_SEGMENT_SIZE 8191 +#define MAX_IMAGE_SIZE 100 * 1024 // bytes, ETSI TS 101 499 +#define MAX_NAME_LENGTH 100 +#define EXPECTED_IMAGE_LENGTH 1000 + class cKeyStoneCOMM : public QObject { @@ -44,7 +50,11 @@ public: int8_t volume(); int8_t signalStrength(); QString programName(); + QString programType(); QString programText(); + + bool clearFM(); + bool clearDAB(); signals: private: @@ -65,13 +75,28 @@ private: int8_t m_currentVolume; int8_t m_mutePrevVolume; + uint16_t m_mainTransportID; + bool m_startCollectData; + uint8_t m_MSCData[100 * 1024]; + uint32_t m_MSCDataIndex; + + unsigned char m_imageData[MAX_IMAGE_SIZE]; + uint32_t m_imageDataIndex; + char m_imageFileName[MAX_NAME_LENGTH]; + bool hardMute(); bool hardUnmute(); bool hardResetRadio(); + int16_t getTotalProgram(); + int8_t getSignalStrength(int* biterror); + QString getProgramText(); + int8_t getProgramType(char mode, long dabIndex); QString getProgramName(char mode, long dabIndex, char namemode); + bool clearDatabase(); + bool readSerialBytes (unsigned char* buffer, uint16_t* bytesreadreturn); bool writeSerialBytes(unsigned char* buffer, uint16_t nNumberOfBytesToWrite, uint16_t* lpNumberOfBytesWritten); bool goodHeader(unsigned char* input, uint16_t dwBytes); @@ -80,12 +105,64 @@ private: bool GPIO_SetLevel(char pin, char level); bool GPIO_GetLevel(char pin, char* level); bool GPIO_SetFunction(char pin, char pinfunction, char drive); - - int16_t getTotalProgram(); - int8_t getSignalStrength(int* biterror); private slots: void serialReadReady(); void serialReadError(QSerialPort::SerialPortError error); }; #endif // CKEYSTONECOMM_H + +/* + long commVersion(void); + bool hardResetRadio(); + bool isSysReady(); + char getPlayStatus(); + long getPreset(char mode, char presetindex); + bool setPreset(char mode, char presetindex, unsigned long channel); + bool FMSearch(char direction); + bool DABAutoSearch(unsigned char startindex, unsigned char endindex); + bool DABAutoSearchNoClear(unsigned char startindex, unsigned char endindex); + bool getEnsembleName(long dabIndex, char namemode, wchar_t * programName); + int getDataRate(); + bool setStereoMode(char mode); + char getFrequency(); + char getStereoMode(); + char getStereo(); + bool clearDatabase(); + bool setBBEEQ(char BBEOn, char EQMode, char BBELo, char BBEHi, char BBECFreq, char BBEMachFreq, char BBEMachGain, char BBEMachQ, char BBESurr, char BBEMp, char BBEHpF, char BBEHiMode ); + bool getBBEEQ(char *BBEOn, char *EQMode, char *BBELo, char *BBEHi, char *BBECFreq, char *BBEMachFreq, char *BBEMachGain, char *BBEMachQ, char *BBESurr, char *BBEMp, char *BBEHpF, char *BBEHiMode); + bool setHeadroom(char headroom); + char getHeadroom(); + int16 getApplicationType(long dabIndex); + bool getApplicationData(); + int16 setApplicationType(uint16 appType1); + bool getProgramInfo(long dabIndex, unsigned char * ServiceComponentID, uint32 * ServiceID, uint16 * EnsembleID); + //BOOL MotQuery(void); + void getImage(wchar_t *ImageFileName); + //void MotReset(MotMode enMode); + char getDABSignalQuality(); + char getServCompType(long dabIndex); + + // RTC Clock Date + bool syncRTC(bool sync); + bool getRTC(unsigned char *sec, unsigned char *min, unsigned char *hour, unsigned char *day, unsigned char *month, unsigned char* year); + bool enableSyncClock(); + bool disableSyncClock(); + bool getClockStatus(); + + int getSamplingRate(); + + bool enableI2S(bool enable); + bool GPIO_SetFunction(char pin, char pinfunction, char drive); + bool GPIO_SetLevel(char pin, char level); + bool GPIO_GetLevel(char pin, char* level); + + // Local functions + void hardMute(); + void hardUnMute(); + bool readSerialBytes (HANDLE serialhandle, unsigned char *buffer, uint16 noofbytestoread, uint16 *bytesreadreturn, uint16 exitFD); + bool writeSerialBytes(HANDLE serialhandle, LPCVOID lpBuffer, uint16 nNumberOfBytesToWrite, uint16* lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); + bool goodHeader(unsigned char* input, uint16 dwBytes); + + bool parseMSCData(); +*/ diff --git a/cmainwindow.cpp b/cmainwindow.cpp index f14e1e8..05ff163 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -2,6 +2,9 @@ #include "ui_cmainwindow.h" +#define REFRESH_RATE 1000 + + cMainWindow::cMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::cMainWindow), @@ -14,9 +17,10 @@ cMainWindow::cMainWindow(QWidget *parent) : m_timerSignalStrength = new QTimer(this); connect(m_timerSignalStrength, &QTimer::timeout, this, &cMainWindow::updateSignalStrength); - m_timerSignalStrength->start(1000); + m_timerSignalStrength->start(REFRESH_RATE); m_keystoneCOMM->open(); + m_keystoneCOMM->startStream(cKeyStoneCOMM::STREAM_MODE_DAB, 2); } @@ -36,6 +40,7 @@ void cMainWindow::updateSignalStrength() int8_t signalStrength = m_keystoneCOMM->signalStrength(); ui->m_signalStrength->setText(QString("%1").arg(signalStrength)); ui->m_sender->setText(m_keystoneCOMM->programName()); + ui->m_type->setText(m_keystoneCOMM->programType()); ui->m_text->setText(m_keystoneCOMM->programText()); int16_t channel = m_keystoneCOMM->channel(); ui->m_channel->setText(QString("%1").arg(channel)); @@ -65,3 +70,7 @@ void cMainWindow::on_m_volumeUp_clicked() m_keystoneCOMM->volumePlus(); } +void cMainWindow::on_m_clearDAB_clicked() +{ + m_keystoneCOMM->clearDAB(); +} diff --git a/cmainwindow.h b/cmainwindow.h index b72eb82..582efbe 100644 --- a/cmainwindow.h +++ b/cmainwindow.h @@ -32,6 +32,7 @@ private slots: void on_m_channelUp_clicked(); void on_m_volumeDown_clicked(); void on_m_volumeUp_clicked(); + void on_m_clearDAB_clicked(); }; #endif // CMAINWINDOW_H diff --git a/cmainwindow.ui b/cmainwindow.ui index 1805636..d481f91 100644 --- a/cmainwindow.ui +++ b/cmainwindow.ui @@ -16,8 +16,56 @@ - + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + channel + + + + + + + + Channel: + + + + + + Type: + + + + + + + TextLabel + + + + + + + channel - + + + + Text: @@ -31,6 +79,34 @@ + + + + TextLabel + + + + + + + volume + + + + + + + + TextLabel + + + + + + + Volume: + + + @@ -38,93 +114,38 @@ - - - - Colume: - - - - + TextLabel - - - - Channel: - - - - - - - channel - - - - - - - - TextLabel - - - - + TextLabel - - - - TextLabel - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - TextLabel - - - - - - - channel + - - - - volume - - - + + - volume + + TextLabel + + + + + + + clear DAB