You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.2 KiB
108 lines
2.2 KiB
6 months ago
|
/******************************************************************
|
||
|
Copyright © Deng Zhimao Co., Ltd. 1990-2030. All rights reserved.
|
||
|
* @projectName radio
|
||
|
* @brief radio.cpp
|
||
|
* @author Deng Zhimao
|
||
|
* @email 1252699831@qq.com
|
||
|
* @date 2020-08-19
|
||
|
*******************************************************************/
|
||
|
#include "radio.h"
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <unistd.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <QDebug>
|
||
|
#ifdef __arm__
|
||
|
#include <sys/ioctl.h>
|
||
|
#include <linux/i2c-dev.h>
|
||
|
#endif
|
||
|
|
||
|
#define I2C_DEV "/dev/i2c-3"
|
||
|
#define I2C_TEA5767_ID 0x60
|
||
|
|
||
|
myRadio::myRadio(QObject *parent) : QObject (parent)
|
||
|
{
|
||
|
muteFlag = false;
|
||
|
}
|
||
|
|
||
|
QString myRadio::readLevel()
|
||
|
{
|
||
|
return level;
|
||
|
}
|
||
|
|
||
|
unsigned char* myRadio::setRadioFreq(unsigned char radio[5], double frequency)
|
||
|
{
|
||
|
unsigned char frequencyH = 0;
|
||
|
unsigned char frequencyL = 0;
|
||
|
|
||
|
unsigned int frequencyB;
|
||
|
|
||
|
frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;
|
||
|
frequencyH = frequencyB >> 8;
|
||
|
frequencyL = frequencyB & 0XFF;
|
||
|
if (muteFlag)
|
||
|
radio[0] |= 0x80;
|
||
|
else
|
||
|
radio[0] = frequencyH;
|
||
|
radio[1] = frequencyL;
|
||
|
radio[2] = 0xB0;
|
||
|
radio[3] = 0x10;
|
||
|
radio[4] = 0x00;
|
||
|
return radio;
|
||
|
}
|
||
|
|
||
|
void myRadio::setFrequency(const QString str)
|
||
|
{
|
||
|
#ifdef __arm__
|
||
|
double frequency;
|
||
|
static unsigned char radio[5] = {0};
|
||
|
char* temChar;
|
||
|
int fd;
|
||
|
|
||
|
QByteArray ba = str.toLatin1();
|
||
|
temChar = ba.data();
|
||
|
|
||
|
//open i2c device
|
||
|
if ((fd = open(I2C_DEV, O_RDWR)) < 0) {
|
||
|
printf("error opening i2c dev %s \r\n", I2C_DEV);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//set slave id
|
||
|
if (ioctl (fd, I2C_SLAVE, I2C_TEA5767_ID) < 0) {
|
||
|
printf("error set i2c slave id %02x \r\n", I2C_TEA5767_ID);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
frequency = strtod(temChar, NULL);
|
||
|
|
||
|
|
||
|
write(fd, setRadioFreq(radio, frequency), 5);
|
||
|
|
||
|
int rlen = read(fd, radio, 5);
|
||
|
if (rlen == 5) {
|
||
|
unsigned int levelTemp = radio[3] >> 4;
|
||
|
level = QString::number(levelTemp);
|
||
|
}else {
|
||
|
level = "";
|
||
|
}
|
||
|
emit levelChanged();
|
||
|
//usleep(50000);
|
||
|
close(fd);
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
void myRadio::setMuteFlag(bool flag)
|
||
|
{
|
||
|
muteFlag = flag;
|
||
|
}
|
||
|
myRadio::~myRadio()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
|