[Sv1-commits] SF.net SVN: sv1: [454] vamp-live-host/trunk
Brought to you by:
cannam
From: <ca...@us...> - 2006-12-08 18:18:29
|
Revision: 454 http://svn.sourceforge.net/sv1/?rev=454&view=rev Author: cannam Date: 2006-12-08 10:18:28 -0800 (Fri, 08 Dec 2006) Log Message: ----------- * action for writing to serial port Modified Paths: -------------- vamp-live-host/trunk/host/SimpleXMLRuleLoader.cpp vamp-live-host/trunk/vamp-live-host.pro Added Paths: ----------- vamp-live-host/trunk/host/FDWriteAction.cpp vamp-live-host/trunk/host/FDWriteAction.h Added: vamp-live-host/trunk/host/FDWriteAction.cpp =================================================================== --- vamp-live-host/trunk/host/FDWriteAction.cpp (rev 0) +++ vamp-live-host/trunk/host/FDWriteAction.cpp 2006-12-08 18:18:28 UTC (rev 454) @@ -0,0 +1,85 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +#include "FDWriteAction.h" + +#include <iostream> + +#include <termios.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include <QMutexLocker> + +std::map<QString, int> +FDWriteAction::m_fdMap; + +QString +FDWriteAction::m_previousData = ""; + +FDWriteAction::FDWriteAction(QString file, + QString data, + bool togglePrevious) : + m_data(data), + m_togglePrevious(togglePrevious) +{ + QMutexLocker locker(&m_mutex); + if (m_fdMap.find(file) != m_fdMap.end()) { + m_fd = m_fdMap[file]; + } else { + m_fd = open(file.toLocal8Bit().data(), O_WRONLY | O_NOCTTY); + if (m_fd < 0) { + perror("Failed to open output file"); + std::cerr << "ERROR: FDWriteAction: Unable to open \"" + << file.toStdString() << "\" for writing" << std::endl; + return; + } + struct termios t; + tcgetattr(m_fd, &t); + t.c_cflag = B9600 | CS8 | CLOCAL; + t.c_iflag = 0; + t.c_oflag = 0; + t.c_lflag = ICANON; + tcflush(m_fd, TCOFLUSH); + tcsetattr(m_fd, TCSANOW, &t); + m_fdMap[file] = m_fd; + } +} + +FDWriteAction::~FDWriteAction() +{ + // don't close fds -- lazily leave them for program exit rather + // than go to the bother of reference counting +} + +QString +FDWriteAction::getName() const +{ + return QString("fdwrite: \"%1\",%2") + .arg(m_data) + .arg(m_togglePrevious); +} + +void +FDWriteAction::fire() +{ + std::cerr << getName().toStdString() << ": fire" << std::endl; + + if (m_fd < 0) return; + QMutexLocker locker(&m_mutex); + if (m_togglePrevious) { + if (m_previousData == m_data) return; + if (m_previousData != "") { + // bug here + write(m_fd, m_previousData.toLocal8Bit().data(), m_previousData.length()); + usleep(100000); + } + } + // bug here + write(m_fd, m_data.toLocal8Bit().data(), m_data.length()); + m_previousData = m_data; + usleep(100000); +} + + Added: vamp-live-host/trunk/host/FDWriteAction.h =================================================================== --- vamp-live-host/trunk/host/FDWriteAction.h (rev 0) +++ vamp-live-host/trunk/host/FDWriteAction.h 2006-12-08 18:18:28 UTC (rev 454) @@ -0,0 +1,32 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +#ifndef _FD_WRITE_ACTION_H_ +#define _FD_WRITE_ACTION_H_ + +#include "Action.h" + +#include <map> + +#include <QMutex> + +class FDWriteAction : public Action +{ + Q_OBJECT + +public: + FDWriteAction(QString file, QString data, bool togglePrevious); + virtual ~FDWriteAction(); + + virtual QString getName() const; + virtual void fire(); + +protected: + int m_fd; + QString m_data; + bool m_togglePrevious; + QMutex m_mutex; + static std::map<QString, int> m_fdMap; + static QString m_previousData; +}; + +#endif Modified: vamp-live-host/trunk/host/SimpleXMLRuleLoader.cpp =================================================================== --- vamp-live-host/trunk/host/SimpleXMLRuleLoader.cpp 2006-12-08 18:17:29 UTC (rev 453) +++ vamp-live-host/trunk/host/SimpleXMLRuleLoader.cpp 2006-12-08 18:18:28 UTC (rev 454) @@ -4,6 +4,7 @@ #include "Rule.h" #include "ImageAction.h" #include "ExternalProcessAction.h" +#include "FDWriteAction.h" #include <QFile> #include <QIODevice> @@ -171,6 +172,16 @@ Action *action = new ExternalProcessAction(process, args); m_rule->addAction(action); std::cerr << "INFO: SimpleXMLRuleLoader: Added external process action" << std::endl; + } else if (type == "fdwrite") { + QString file = atts.value("file"); + QString data = atts.value("data"); + bool togglePrevious = false; + if (atts.value("togglePrevious") == "true") { + togglePrevious = true; + } + Action *action = new FDWriteAction(file, data, togglePrevious); + m_rule->addAction(action); + std::cerr << "INFO: SimpleXMLRuleLoader: Added fd write action" << std::endl; } else { std::cerr << "WARNING: SimpleXMLRuleLoader: Unknown action type \"" << type.toStdString() << "\"" << std::endl; Modified: vamp-live-host/trunk/vamp-live-host.pro =================================================================== --- vamp-live-host/trunk/vamp-live-host.pro 2006-12-08 18:17:29 UTC (rev 453) +++ vamp-live-host/trunk/vamp-live-host.pro 2006-12-08 18:18:28 UTC (rev 454) @@ -25,6 +25,7 @@ audioio/BufferingAudioCallbackRecordTarget.h \ host/Action.h \ host/ExternalProcessAction.h \ + host/FDWriteAction.h \ host/ImageAction.h \ host/ImageWindow.h \ host/Processor.h \ @@ -37,6 +38,7 @@ audioio/BufferingAudioCallbackRecordTarget.cpp \ host/host.cpp \ host/ExternalProcessAction.cpp \ + host/FDWriteAction.cpp \ host/ImageAction.cpp \ host/ImageWindow.cpp \ host/Processor.cpp \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |