Broken alsalib record

This commit is contained in:
IMback
2017-12-30 20:53:12 +01:00
parent 1dd7aca03b
commit 2e79a898e8
9 changed files with 106 additions and 34 deletions

View File

@ -2,21 +2,56 @@
AmpManager::AmpManager(Microcontroller *micro, int relayNumber, QAudioDeviceInfo device, QObject *parent) : QObject(parent), _micro(micro), _relayNumber(relayNumber)
{
QAudioFormat format;
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
/* Open PCM device for recording (capture). */
rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0) {
fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc));
exit(1);
}
_audioDevice = new QAudioInput(device/*, format*/);
/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(&params);
/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);
/* Set the desired hardware parameters. */
/* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);
s
/* One channel (mono) */
snd_pcm_hw_params_set_channels(handle, params, 1);
/* 16000 bits/second sampling rate */
val = 16000;
snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);
/* Set period size to 2048 frames. */
frames = 2048;
snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);
/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc));
exit(1);
}
/* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params, &frames, &dir);
size = frames * 2; /* 2 bytes/sample, 1 channels */
char* buffer = new char[size]();
}
AmpManager::~AmpManager()
{
abort();
delete _audioDevice;
snd_pcm_drain(handle);
snd_pcm_close(handle);
}
void AmpManager::run()

View File

@ -10,9 +10,9 @@
#include <QTimer>
#include <QByteArray>
#include <QtDebug>
#include <QAudioInput>
#include <QAudioDeviceInfo>
#include <QIODevice>
#include <alsa/asoundlib.h>
#include "microcontroller.h"
@ -38,8 +38,12 @@ private:
Microcontroller *_micro;
int _relayNumber;
QAudioInput* _audioDevice;
QIODevice* _ioDevice = nullptr;
char* _buffer;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
snd_pcm_uframes_t frames;
char *buffer;
bool relayState = false;

View File

@ -94,7 +94,7 @@ int main(int argc, char *argv[])
AmpManager amp(&micro, 0, QAudioDeviceInfo::defaultInputDevice());
AmpManager amp(&micro, 0);
MainWindow w(&settings, &micro, parser.isSet(secondaryOption));
QObject::connect(&micro, SIGNAL(textRecived(QString)), &w, SLOT(changeHeaderLableText(QString)));

View File

@ -143,6 +143,11 @@ void MainWindow::slotBSpeakerAutoToggle(int state)
ui->checkBox_bspeaker->setEnabled(!state);
}
void MainWindow::slotDoorOpenTimeout()
{
ui->checkBox_doorOpen->setChecked(true);
}
void MainWindow::slotInfMirrorAutoToggle(int state)
{
ui->checkBox_inf->setEnabled(!state);

View File

@ -77,6 +77,8 @@ private slots:
//Night
void slotChangedNightTime(const QTime time);
//door
void slotDoorOpenTimeout();
public slots:

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>859</width>
<height>549</height>
<width>862</width>
<height>570</height>
</rect>
</property>
<property name="sizePolicy">
@ -502,6 +502,20 @@
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QCheckBox" name="checkBox_doorOpen">
<property name="text">
<string>CheckBox</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>

View File

@ -116,22 +116,35 @@ void Microcontroller::processMicroReturn()
{
QString workbuff = _buffer;
workbuff.remove(0, 2);
QStringList workbufList = workbuff.split(',');
int numberOfRelays = workbufList[0].toInt();
if(workbufList.size() >= numberOfRelays+1)
if(_buffer.size() > 2 && _buffer[0] == "S" && _buffer[1] == "T")
{
bool hasChanged = false;
_relayStates.resize(numberOfRelays, false);
for(int i = 0; i < numberOfRelays; i++)
workbuff.remove(0, 2);
QStringList workbufList = workbuff.split(',');
int numberOfRelays = workbufList[0].toInt();
if(workbufList.size() >= numberOfRelays+1)
{
if(_relayStates[i] != (bool)workbufList[i+1].toInt())
bool hasChanged = false;
_relayStates.resize(numberOfRelays, false);
for(int i = 0; i < numberOfRelays; i++)
{
_relayStates[i] = (bool)workbufList[i+1].toInt();
hasChanged = true;
if(_relayStates[i] != (bool)workbufList[i+1].toInt())
{
_relayStates[i] = (bool)workbufList[i+1].toInt();
hasChanged = true;
}
}
if(hasChanged)relayStateChanged(_relayStates);
}
if(hasChanged)relayStateChanged(_relayStates);
}
else if(workbuff.contains("Door Open Warning"))
{
doorOpenTimeout();
}
else if(workbuff.size() > 2 && workbuff[0]=='D' && workbuff[1]=='2')
{
if(workbuff[3] == 'O') doorOpen(1);
else if(workbuff[3] == 'C') doorClosed(1);
}
}
@ -145,10 +158,7 @@ void Microcontroller::doTick()
_buffer.push_back(charBuf);
if( _buffer.endsWith('\n') )
{
if(_buffer.size() > 2 && _buffer[0] == "S" && _buffer[1] == "T")
{
processMicroReturn();
}
processMicroReturn();
textRecived(_buffer);
_buffer.clear();
}

View File

@ -53,7 +53,9 @@ public slots:
signals:
void textRecived(const QString string);
void relayStateChanged(std::vector<bool> relayStates);
void doorOpenTimeout();
void doorOpened(int id);
void doorClosed(int id);
};
#endif // MICROCONTROLLER_H

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>358</width>
<height>279</height>
<height>320</height>
</rect>
</property>
<property name="windowTitle">
@ -25,7 +25,7 @@
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Night Relays</string>
<string>Soldering iron</string>
</property>
</widget>
</item>