//stop any vibration
case 'A':
manager.stop();
+ command = 0;
break;
//unknown command: do nothing
default:
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{E39CA6E9-BA0B-4C12-8090-D5CE66CADF94}</ProjectGuid>\r
+ <Keyword>Qt4VSv1.0</Keyword>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup>\r
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>\r
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PreprocessorDefinitions>_USE_MATH_DEFINES;UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <Optimization>Disabled</Optimization>\r
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>\r
+ <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <AdditionalDependencies>TactonPlayerd.lib;qtmaind.lib;QtCored4.lib;QtGuid4.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <PreprocessorDefinitions>_USE_MATH_DEFINES;UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <DebugInformationFormat>\r
+ </DebugInformationFormat>\r
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>\r
+ <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+ <GenerateDebugInformation>false</GenerateDebugInformation>\r
+ <AdditionalDependencies>TactonPlayer.lib;qtmain.lib;QtCore4.lib;QtGui4.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="GeneratedFiles\Debug\moc_magiccircle.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
+ <ClCompile Include="GeneratedFiles\qrc_magiccircle.cpp">\r
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ </PrecompiledHeader>\r
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ </PrecompiledHeader>\r
+ </ClCompile>\r
+ <ClCompile Include="GeneratedFiles\Release\moc_magiccircle.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
+ <ClCompile Include="magiccircle.cpp" />\r
+ <ClCompile Include="main.cpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <CustomBuild Include="magiccircle.h">\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing magiccircle.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_USE_MATH_DEFINES -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing magiccircle.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_USE_MATH_DEFINES -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <CustomBuild Include="magiccircle.ui">\r
+ <FileType>Document</FileType>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Uic%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="GeneratedFiles\ui_magiccircle.h" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <CustomBuild Include="magiccircle.qrc">\r
+ <FileType>Document</FileType>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Rcc%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Rcc%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+ <ProjectExtensions>\r
+ <VisualStudio>\r
+ <UserProperties UicDir=".\GeneratedFiles" MocDir=".\GeneratedFiles\$(ConfigurationName)" MocOptions="" RccDir=".\GeneratedFiles" lupdateOnBuild="0" lupdateOptions="" lreleaseOptions="" QtVersion_x0020_Win32="4.8.2" />\r
+ </VisualStudio>\r
+ </ProjectExtensions>\r
+</Project>
\ No newline at end of file
--- /dev/null
+#include "magiccircle.h"\r
+\r
+#include <cmath>\r
+\r
+MagicCircle::MagicCircle(QWidget *parent, Qt::WFlags flags)\r
+ : QMainWindow(parent, flags), _timer(this), _angle(0), _clockwise(true)\r
+{\r
+ try\r
+ {\r
+ _tactonPlayer = new TactonPlayer("COM4");\r
+ }\r
+ catch(...)\r
+ {\r
+ _tactonPlayer = NULL;\r
+ }\r
+\r
+ setupUi(this);\r
+\r
+ layout()->setSizeConstraint(QLayout::SetFixedSize);\r
+\r
+ //set initial parameters\r
+ setDirection(_direction->currentText());\r
+ setResolution(_resolution->value());\r
+ setSpeed(_speed->value());\r
+\r
+ connect(_play, SIGNAL(clicked(bool)), this, SLOT(play(bool)));\r
+ connect(_stop, SIGNAL(clicked(bool)), this, SLOT(stop(bool)));\r
+\r
+ connect(_direction, SIGNAL(editTextChanged(const QString &)), this, SLOT(setDirection(const QString &)));\r
+ connect(_speed, SIGNAL(valueChanged(int)), this, SLOT(setSpeed(int)));\r
+ connect(_resolution, SIGNAL(valueChanged(int)), this, SLOT(setResolution(int)));\r
+\r
+ connect(this, SIGNAL(setAngle(float)), SLOT(tactileFeedback(float)));\r
+ connect(this, SIGNAL(setAngle(float)), SLOT(visualFeedback(float)));\r
+\r
+ connect(&_timer, SIGNAL(timeout()), this, SLOT(update()));\r
+}\r
+\r
+MagicCircle::~MagicCircle()\r
+{\r
+ stop(true);\r
+}\r
+\r
+void MagicCircle::play(bool)\r
+{\r
+ _timer.start();\r
+}\r
+\r
+void MagicCircle::stop(bool)\r
+{\r
+ _timer.stop();\r
+ _tactonPlayer->stopBuzz();\r
+}\r
+\r
+void MagicCircle::update()\r
+{\r
+ if (_clockwise)\r
+ _angle -= _stepsize;\r
+ else\r
+ _angle += _stepsize;\r
+\r
+ while (_angle < 0)\r
+ _angle += 360;\r
+\r
+ while (_angle >= 360)\r
+ _angle -= 360;\r
+\r
+ emit setAngle(_angle);\r
+}\r
+\r
+void MagicCircle::setDirection(const QString &direction)\r
+{\r
+ _clockwise = (direction == "Clockwise");\r
+}\r
+\r
+void MagicCircle::setSpeed(int speed)\r
+{\r
+ _timer.setInterval(_stepsize / speed * 1000);\r
+}\r
+\r
+void MagicCircle::setResolution(int res)\r
+{\r
+ _stepsize = 360.0 / res;\r
+ setSpeed(_speed->value());\r
+}\r
+\r
+void MagicCircle::tactileFeedback(float angle)\r
+{\r
+ unsigned char amplitudes[4];\r
+ memset(amplitudes, 0, 4);\r
+\r
+ //vertical\r
+ if (angle < 180)\r
+ amplitudes[1] = 255 * sin(angle * M_PI / 180);\r
+ else\r
+ amplitudes[3] = - 255 * sin(angle * M_PI / 180);\r
+\r
+ //horizontal\r
+ if (angle < 90 ||angle > 270)\r
+ amplitudes[0] = 255 * cos(angle * M_PI / 180);\r
+ else\r
+ amplitudes[2] = - 255 * cos(angle * M_PI / 180);\r
+\r
+ _tactonPlayer->buzz(_frequency->value(), 4, amplitudes);\r
+}\r
+\r
+void MagicCircle::visualFeedback(float)\r
+{\r
+}\r
--- /dev/null
+#ifndef MAGICCIRCLE_H\r
+#define MAGICCIRCLE_H\r
+\r
+#include <QtGui/QMainWindow>\r
+#include "ui_magiccircle.h"\r
+\r
+#include <QTimer>\r
+\r
+#include <TactonPlayer\TactonPlayer.hpp>\r
+\r
+class MagicCircle : public QMainWindow, Ui::MagicCircleClass\r
+{\r
+ Q_OBJECT\r
+\r
+ public:\r
+ MagicCircle(QWidget *parent = 0, Qt::WFlags flags = 0);\r
+ ~MagicCircle();\r
+\r
+ public slots:\r
+ void play(bool);\r
+ void stop(bool);\r
+ void update();\r
+ \r
+ void setDirection(const QString &);\r
+ void setSpeed(int);\r
+ void setResolution(int);\r
+\r
+ void tactileFeedback(float);\r
+ void visualFeedback(float);\r
+\r
+ signals:\r
+ void setAngle(float a); \r
+\r
+ private:\r
+ float _angle, _stepsize;\r
+ bool _clockwise;\r
+\r
+ TactonPlayer *_tactonPlayer;\r
+ QTimer _timer;\r
+};\r
+\r
+#endif // MAGICCIRCLE_H\r
--- /dev/null
+<RCC>\r
+ <qresource prefix="MagicCircle">\r
+ </qresource>\r
+</RCC>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ui version="4.0">\r
+ <class>MagicCircleClass</class>\r
+ <widget class="QMainWindow" name="MagicCircleClass">\r
+ <property name="geometry">\r
+ <rect>\r
+ <x>0</x>\r
+ <y>0</y>\r
+ <width>268</width>\r
+ <height>448</height>\r
+ </rect>\r
+ </property>\r
+ <property name="windowTitle">\r
+ <string>MagicCircle</string>\r
+ </property>\r
+ <widget class="QWidget" name="centralWidget">\r
+ <layout class="QVBoxLayout" name="verticalLayout">\r
+ <item>\r
+ <widget class="QGraphicsView" name="_canvas">\r
+ <property name="minimumSize">\r
+ <size>\r
+ <width>250</width>\r
+ <height>250</height>\r
+ </size>\r
+ </property>\r
+ <property name="maximumSize">\r
+ <size>\r
+ <width>250</width>\r
+ <height>250</height>\r
+ </size>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <layout class="QGridLayout" name="gridLayout_2">\r
+ <item row="2" column="1">\r
+ <widget class="QLabel" name="label_2">\r
+ <property name="text">\r
+ <string>Speed (degrees/s)</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="2" column="2">\r
+ <widget class="QSpinBox" name="_speed">\r
+ <property name="minimum">\r
+ <number>1</number>\r
+ </property>\r
+ <property name="maximum">\r
+ <number>720</number>\r
+ </property>\r
+ <property name="value">\r
+ <number>30</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="3" column="1">\r
+ <widget class="QLabel" name="label_3">\r
+ <property name="text">\r
+ <string>Resolution (steps/360°)</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="1" column="2">\r
+ <widget class="QComboBox" name="_direction">\r
+ <item>\r
+ <property name="text">\r
+ <string>Clockwise</string>\r
+ </property>\r
+ </item>\r
+ <item>\r
+ <property name="text">\r
+ <string>Counterclockwise</string>\r
+ </property>\r
+ </item>\r
+ </widget>\r
+ </item>\r
+ <item row="1" column="1">\r
+ <widget class="QLabel" name="label">\r
+ <property name="text">\r
+ <string>Direction</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="3" column="2">\r
+ <widget class="QSpinBox" name="_resolution">\r
+ <property name="minimum">\r
+ <number>4</number>\r
+ </property>\r
+ <property name="maximum">\r
+ <number>360</number>\r
+ </property>\r
+ <property name="value">\r
+ <number>16</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="0" column="1">\r
+ <widget class="QLabel" name="label_4">\r
+ <property name="text">\r
+ <string>Frequency</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="0" column="2">\r
+ <widget class="QSpinBox" name="_frequency">\r
+ <property name="minimum">\r
+ <number>1</number>\r
+ </property>\r
+ <property name="maximum">\r
+ <number>400</number>\r
+ </property>\r
+ <property name="value">\r
+ <number>250</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
+ </item>\r
+ <item>\r
+ <layout class="QHBoxLayout" name="horizontalLayout">\r
+ <item>\r
+ <widget class="QPushButton" name="_stop">\r
+ <property name="text">\r
+ <string>Stop</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item>\r
+ <widget class="QPushButton" name="_play">\r
+ <property name="text">\r
+ <string>Play</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ </layout>\r
+ </item>\r
+ </layout>\r
+ </widget>\r
+ </widget>\r
+ <layoutdefault spacing="6" margin="11"/>\r
+ <tabstops>\r
+ <tabstop>_frequency</tabstop>\r
+ <tabstop>_direction</tabstop>\r
+ <tabstop>_speed</tabstop>\r
+ <tabstop>_resolution</tabstop>\r
+ <tabstop>_play</tabstop>\r
+ <tabstop>_stop</tabstop>\r
+ <tabstop>_canvas</tabstop>\r
+ </tabstops>\r
+ <resources>\r
+ <include location="magiccircle.qrc"/>\r
+ </resources>\r
+ <connections/>\r
+</ui>\r
--- /dev/null
+#include "magiccircle.h"\r
+#include <QtGui/QApplication>\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ QApplication a(argc, argv);\r
+ MagicCircle w;\r
+ w.show();\r
+ return a.exec();\r
+}\r
# Visual Studio 2010\r
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TactonDebug", "TactonDebug\TactonDebug.vcxproj", "{245FF8C0-7CC0-4A37-9F07-6B3C8E29D089}"\r
EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MagicCircle", "MagicCircle\MagicCircle.vcxproj", "{E39CA6E9-BA0B-4C12-8090-D5CE66CADF94}"\r
+EndProject\r
Global\r
GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
Debug|Win32 = Debug|Win32\r
{245FF8C0-7CC0-4A37-9F07-6B3C8E29D089}.Debug|Win32.Build.0 = Debug|Win32\r
{245FF8C0-7CC0-4A37-9F07-6B3C8E29D089}.Release|Win32.ActiveCfg = Release|Win32\r
{245FF8C0-7CC0-4A37-9F07-6B3C8E29D089}.Release|Win32.Build.0 = Release|Win32\r
+ {E39CA6E9-BA0B-4C12-8090-D5CE66CADF94}.Debug|Win32.ActiveCfg = Debug|Win32\r
+ {E39CA6E9-BA0B-4C12-8090-D5CE66CADF94}.Debug|Win32.Build.0 = Debug|Win32\r
+ {E39CA6E9-BA0B-4C12-8090-D5CE66CADF94}.Release|Win32.ActiveCfg = Release|Win32\r
+ {E39CA6E9-BA0B-4C12-8090-D5CE66CADF94}.Release|Win32.Build.0 = Release|Win32\r
EndGlobalSection\r
GlobalSection(SolutionProperties) = preSolution\r
HideSolutionNode = FALSE\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
<ClCompile>\r
- <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_CORE_LIB;QT_GUI_LIB;QT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<AdditionalIncludeDirectories>.\GeneratedFiles;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\qtmain;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;.\;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
</ItemDefinitionGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
<ClCompile>\r
- <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<AdditionalIncludeDirectories>.\GeneratedFiles;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\qtmain;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;.\;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
<DebugInformationFormat>\r
</DebugInformationFormat>\r
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>\r
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
- <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I.\.." "-I." "-I." "-I." "tactondebug.h" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"</Command>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB -DQT_DLL "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I.\.."</Command>\r
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing %(Identity)...</Message>\r
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
- <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I.\.." "-I." "-I." "-I." "tactondebug.h" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"</Command>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_DLL "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I.\.."</Command>\r
</CustomBuild>\r
</ItemGroup>\r
<ItemGroup>\r
</ImportGroup>\r
<ProjectExtensions>\r
<VisualStudio>\r
- <UserProperties UicDir=".\GeneratedFiles" MocDir=".\GeneratedFiles\$(ConfigurationName)" MocOptions="" RccDir=".\GeneratedFiles" lupdateOnBuild="0" lupdateOptions="" lreleaseOptions="" QtVersion_x0020_Win32="4.7.3" />\r
+ <UserProperties UicDir=".\GeneratedFiles" MocDir=".\GeneratedFiles\$(ConfigurationName)" MocOptions="" RccDir=".\GeneratedFiles" lupdateOnBuild="0" lupdateOptions="" lreleaseOptions="" QtVersion_x0020_Win32="4.8.2" />\r
</VisualStudio>\r
</ProjectExtensions>\r
</Project>
\ No newline at end of file
QApplication a(argc, argv);\r
TactonDebug w;\r
w.show();\r
+ w.raise();\r
return a.exec();\r
}\r
{\r
try\r
{\r
- _tactonPlayer = new TactonPlayer("COM5");\r
+ _tactonPlayer = new TactonPlayer("COM4");\r
}\r
catch(...)\r
{\r
}\r
\r
setupUi(this);\r
+\r
+ layout()->setSizeConstraint(QLayout::SetFixedSize);\r
+\r
QObject::connect(frequencebox, SIGNAL(textChanged(const QString &)), this, SLOT(setFrequency(const QString &)));\r
QObject::connect(frequenceslider, SIGNAL(valueChanged(int)), this, SLOT(setFrequency(int)));\r
QObject::connect(amplitudebox, SIGNAL(textChanged(const QString &)), this, SLOT(setAmplitude(const QString &)));\r
#define POS2_LEFT 0x04\r
#define POS2_DOWN 0x08\r
\r
+#ifdef __MACOSX__\r
+#define EXPORTED\r
+#else\r
+#define EXPORTED __declspec(dllexport)\r
+#endif\r
+\r
class Tacton \r
{\r
public:\r
//2 for the duration\r
//2 for the frequency\r
//1 for the amplitude\r
- __declspec(dllexport) Tacton(unsigned int nbframes, unsigned char *desc);\r
+ EXPORTED Tacton(unsigned int nbframes, unsigned char *desc);\r
//creates a tacton using the CSV format\r
//1 field for the number of frames, then 4 fields per frame \r
//1 for the pattern\r
//1 for the duration\r
//1 for the frequency\r
//1 for the amplitude\r
- __declspec(dllexport) Tacton(char *desc);\r
- __declspec(dllexport) Tacton(unsigned int nbframes, unsigned char *patterns, unsigned int *durations, unsigned int *frequencies, unsigned char *amplitudes);\r
+ EXPORTED Tacton(char *desc);\r
+ EXPORTED Tacton(unsigned int nbframes, unsigned char *patterns, unsigned int *durations, unsigned int *frequencies, unsigned char *amplitudes);\r
//create a simple vibration\r
- __declspec(dllexport) Tacton(char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
- __declspec(dllexport) Tacton(const char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
- __declspec(dllexport) Tacton(unsigned char pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
- __declspec(dllexport) Tacton(const Tacton &t);\r
- __declspec(dllexport) ~Tacton();\r
+ EXPORTED Tacton(char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
+ EXPORTED Tacton(const char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
+ EXPORTED Tacton(unsigned char pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
+ EXPORTED Tacton(const Tacton &t);\r
+ EXPORTED ~Tacton();\r
\r
//changes the pattern using raw format\r
- __declspec(dllexport) void setPattern(char pattern);\r
- __declspec(dllexport) void setPattern(unsigned int frame, char pattern);\r
+ EXPORTED void setPattern(char pattern);\r
+ EXPORTED void setPattern(unsigned int frame, char pattern);\r
//changes the pattern using string format\r
- __declspec(dllexport) void setPattern(char *pattern);\r
- __declspec(dllexport) void setPattern(const char *pattern);\r
- __declspec(dllexport) void setPattern(unsigned int frame, char *pattern);\r
- __declspec(dllexport) void setPattern(unsigned int frame, const char *pattern);\r
+ EXPORTED void setPattern(char *pattern);\r
+ EXPORTED void setPattern(const char *pattern);\r
+ EXPORTED void setPattern(unsigned int frame, char *pattern);\r
+ EXPORTED void setPattern(unsigned int frame, const char *pattern);\r
//changes the duration\r
- __declspec(dllexport) void setDuration(unsigned int duration);\r
- __declspec(dllexport) void setDuration(unsigned int frame, unsigned int duration);\r
+ EXPORTED void setDuration(unsigned int duration);\r
+ EXPORTED void setDuration(unsigned int frame, unsigned int duration);\r
//changes the frequency\r
- __declspec(dllexport) void setFrequency(unsigned int frequency);\r
- __declspec(dllexport) void setFrequency(unsigned int frame, unsigned int frequency);\r
+ EXPORTED void setFrequency(unsigned int frequency);\r
+ EXPORTED void setFrequency(unsigned int frame, unsigned int frequency);\r
//changes the amplitude\r
- __declspec(dllexport) void setAmplitude(unsigned int amplitude);\r
- __declspec(dllexport) void setAmplitude(unsigned int frame, unsigned int amplitude);\r
+ EXPORTED void setAmplitude(unsigned int amplitude);\r
+ EXPORTED void setAmplitude(unsigned int frame, unsigned int amplitude);\r
\r
\r
//returns the number of frames\r
- __declspec(dllexport) const unsigned int getNbFrames() const;\r
+ EXPORTED const unsigned int getNbFrames() const;\r
\r
//returns the raw code (useful to send to the serial port)\r
- __declspec(dllexport) void *rawCode() const;\r
+ EXPORTED void *rawCode() const;\r
\r
private:\r
unsigned int _nbframes;\r
buffer[0] = 'N';\r
buffer[1] = (nbframes & 0xff00) >> 8;\r
buffer[2] = nbframes & 0xff;\r
+\r
memcpy(buffer + 3, t.rawCode(), 6 * nbframes);\r
_comport->WriteData(buffer, 3 + 6 * nbframes);\r
delete []buffer;\r
_comport->WriteData(buffer, 6);\r
}\r
\r
+void TactonPlayer::buzz(unsigned int frequency, unsigned int nbtactors, unsigned char *amplitudes)\r
+{\r
+ if (!_comport)\r
+ return;\r
+\r
+ unsigned char *buffer = new unsigned char[4 + nbtactors];\r
+ buffer[0] = 'B';\r
+ buffer[1] = nbtactors;\r
+ buffer[2] = (unsigned char)((frequency & 0x0000ff00) >> 8);\r
+ buffer[3] = (unsigned char)(frequency & 0x000000ff);\r
+ memcpy(buffer + 4, amplitudes, nbtactors);\r
+ _comport->WriteData(buffer, 4 + nbtactors);\r
+ delete[] buffer;\r
+}\r
+\r
+void TactonPlayer::stopBuzz()\r
+{\r
+ if (!_comport)\r
+ return;\r
+\r
+ _comport->WriteData("A", 1);\r
+}\r
+\r
void TactonPlayer::debugRead(char *res, int nb) const\r
{\r
if (_comport)\r
#include "Tacton.hpp"\r
\r
+#ifdef __MACOSX__\r
+#include <Serial.hpp>\r
+#define EXPORTED\r
+#else\r
#include <ArduinoSerial\Serial.hpp>\r
+#define EXPORTED __declspec(dllexport)\r
+#endif\r
\r
class TactonPlayer\r
{\r
public:\r
- __declspec(dllexport) TactonPlayer(const char *port = "COM5");\r
- __declspec(dllexport) ~TactonPlayer();\r
+ EXPORTED TactonPlayer(const char *port = "COM5");\r
+ EXPORTED ~TactonPlayer();\r
\r
//set the timestamp to 0, and watch for scheduled tactons\r
- void __declspec(dllexport) start();\r
+ EXPORTED void start();\r
//stop watching scheduled tactons, and erase registered tactons\r
- void __declspec(dllexport) stop();\r
+ EXPORTED void stop();\r
\r
//register a tacton\r
- __declspec(dllexport) void regist(const Tacton &t);\r
+ EXPORTED void regist(const Tacton &t);\r
//register a list of tactons in a file, returns the number of tactons loaded\r
- __declspec(dllexport) unsigned int registFile(char *filename);\r
+ EXPORTED unsigned int registFile(char *filename);\r
\r
//play a registered tacton\r
- __declspec(dllexport) void play(unsigned char index);\r
+ EXPORTED void play(unsigned char index);\r
//play a specified tacton\r
- __declspec(dllexport) void play(const Tacton &t);\r
+ EXPORTED void play(const Tacton &t);\r
//schedule the play of a registered tacton\r
- __declspec(dllexport) void schedule(unsigned char index, unsigned long timestamp);\r
+ EXPORTED void schedule(unsigned char index, unsigned long timestamp);\r
+\r
+ //sets a given frequency for all vibrators, and an amplitude for each vibrator\r
+ //vibrates until explicitely stop\r
+ EXPORTED void buzz(unsigned int frequency, unsigned int nbtactors, unsigned char *amplitudes);\r
+ //stop any vibration\r
+ EXPORTED void stopBuzz();\r
\r
//read on the serial port\r
- __declspec(dllexport) void debugRead(char *res, int nb) const;\r
+ EXPORTED void debugRead(char *res, int nb) const;\r
\r
private:\r
Serial *_comport;\r
<PropertyGroup Label="UserMacros" />\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
<LinkIncremental>true</LinkIncremental>\r
+ <TargetName>$(ProjectName)d</TargetName>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
<LinkIncremental>false</LinkIncremental>\r