diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2013-11-27 19:52:03 +0100 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2013-11-27 19:52:03 +0100 | 
| commit | 9990b05efb6fcd806ec5d996310f4a945a0b0fac (patch) | |
| tree | cdfbacdd3b535ca594521265afaa4a1184c25201 | |
| parent | 21dbb51ed05bffa69f036c6b82842aa0069b624f (diff) | |
merge in the right hatire branch this time!
Signed-off-by: Stanislaw Halik <sthalik@misaki.pl>
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_arduino_type.h | 22 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_hatcontrols.ui | 985 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_tracker_hat.cpp | 622 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_tracker_hat.h | 122 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.cpp | 260 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.h | 56 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_tracker_hat_dll.cpp | 59 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.cpp | 99 | ||||
| -rw-r--r-- | ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.h | 43 | 
9 files changed, 1646 insertions, 622 deletions
| diff --git a/ftnoir_tracker_hatire/ftnoir_arduino_type.h b/ftnoir_tracker_hatire/ftnoir_arduino_type.h index 7f550579..bd5c4246 100644 --- a/ftnoir_tracker_hatire/ftnoir_arduino_type.h +++ b/ftnoir_tracker_hatire/ftnoir_arduino_type.h @@ -1,30 +1,30 @@  #ifndef FTNOIR_TARDUINO_TYPE_H  #define FTNOIR_TARDUINO_TYPE_H -#include <QtGlobal> - -// Arduino frame structure +// Arduino trame structure  #pragma pack(push,2)  struct TArduinoData  {  	quint16  Begin;    // Header trame 0xAAAA; -    quint16  Code;     // 0->999 Num Frame  >=2000  Info >=3000 Init  >=5000 Start Command  >=9000 Error -	float Gyro[3];   -	float Acc[3]; -    quint16  End;     // End frame   0x5555; +	quint16  Code;     // 0->999 Num Trame  >=2000  Info >=3000 Init  >=5000 Start Command  >=9000 Error  +	float Rot[3];   +	float Trans[3]; +	quint16  End;     // End trame   0x5555;  } ;  #pragma pack(pop)  +  inline QDataStream & operator >> ( QDataStream& in, TArduinoData& out )  { -	in.setByteOrder(QDataStream::LittleEndian );    	in.setFloatingPointPrecision(QDataStream::SinglePrecision );  -    in >> out.Begin   >> out.Code -       >> out.Gyro[0] >> out.Gyro[1] >> out.Gyro[2] -       >> out.Acc[0]  >> out.Acc[1]  >> out.Acc[2] +    in >> out.Begin  >> out.Code +       >> out.Rot[0] >> out.Rot[1]  >> out.Rot[2] +       >> out.Trans[0] >> out.Trans[1] >> out.Trans[2]         >> out.End;  	return in;  } + +  #endif diff --git a/ftnoir_tracker_hatire/ftnoir_hatcontrols.ui b/ftnoir_tracker_hatire/ftnoir_hatcontrols.ui index 97db404f..4446ca85 100644 --- a/ftnoir_tracker_hatire/ftnoir_hatcontrols.ui +++ b/ftnoir_tracker_hatire/ftnoir_hatcontrols.ui @@ -6,20 +6,20 @@     <rect>      <x>0</x>      <y>0</y> -    <width>370</width> -    <height>520</height> +    <width>307</width> +    <height>509</height>     </rect>    </property>    <property name="minimumSize">     <size> -    <width>370</width> -    <height>520</height> +    <width>0</width> +    <height>0</height>     </size>    </property>    <property name="maximumSize">     <size> -    <width>370</width> -    <height>520</height> +    <width>65536</width> +    <height>65536</height>     </size>    </property>    <property name="contextMenuPolicy"> @@ -30,7 +30,7 @@    </property>    <property name="windowIcon">     <iconset> -    <normaloff>images/hat.png</normaloff>images/hat.png</iconset> +    <normaloff>:/images/hat.ico</normaloff>:/images/hat.ico</iconset>    </property>    <property name="windowOpacity">     <double>1.000000000000000</double> @@ -41,69 +41,111 @@    <property name="autoFillBackground">     <bool>false</bool>    </property> -  <layout class="QGridLayout" name="gridLayout_5"> +  <layout class="QGridLayout" name="gridLayout_7"> +   <item row="1" column="2"> +    <widget class="QPushButton" name="btnCancel"> +     <property name="sizePolicy"> +      <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> +       <horstretch>0</horstretch> +       <verstretch>0</verstretch> +      </sizepolicy> +     </property> +     <property name="minimumSize"> +      <size> +       <width>80</width> +       <height>25</height> +      </size> +     </property> +     <property name="maximumSize"> +      <size> +       <width>80</width> +       <height>25</height> +      </size> +     </property> +     <property name="text"> +      <string>Cancel</string> +     </property> +    </widget> +   </item> +   <item row="1" column="0"> +    <widget class="QPushButton" name="btnOK"> +     <property name="sizePolicy"> +      <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> +       <horstretch>0</horstretch> +       <verstretch>0</verstretch> +      </sizepolicy> +     </property> +     <property name="minimumSize"> +      <size> +       <width>80</width> +       <height>25</height> +      </size> +     </property> +     <property name="maximumSize"> +      <size> +       <width>80</width> +       <height>25</height> +      </size> +     </property> +     <property name="text"> +      <string>OK</string> +     </property> +    </widget> +   </item>     <item row="0" column="0" colspan="3">      <widget class="QTabWidget" name="tabWidget">       <property name="minimumSize">        <size> -       <width>360</width> -       <height>470</height> +       <width>0</width> +       <height>0</height>        </size>       </property>       <property name="maximumSize">        <size> -       <width>360</width> -       <height>470</height> +       <width>65535</width> +       <height>65535</height>        </size>       </property>       <property name="currentIndex">        <number>0</number>       </property> -     <property name="usesScrollButtons"> -      <bool>true</bool> -     </property>       <widget class="QWidget" name="tab_config"> -      <attribute name="icon"> -       <iconset> -        <normaloff>:/images/hat.png</normaloff>:/images/hat.png</iconset> -      </attribute>        <attribute name="title">         <string>General</string>        </attribute> -      <layout class="QGridLayout" name="gridLayout_4"> -       <item row="0" column="0"> -        <widget class="QGroupBox" name="groupBox"> +      <layout class="QVBoxLayout" name="verticalLayout"> +       <item> +        <widget class="QGroupBox" name="groupBox_2">           <property name="title">            <string/>           </property> -         <layout class="QGridLayout" name="gridLayout_3"> -          <item row="2" column="0"> -           <widget class="QPushButton" name="btnCenter"> -            <property name="minimumSize"> -             <size> -              <width>80</width> -              <height>20</height> -             </size> -            </property> -            <property name="text"> -             <string>Center</string> +         <property name="flat"> +          <bool>true</bool> +         </property> +         <layout class="QGridLayout" name="gridLayout_2"> +          <property name="spacing"> +           <number>4</number> +          </property> +          <item row="0" column="0"> +           <widget class="QLabel" name="label_5"> +            <property name="sizePolicy"> +             <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> +              <horstretch>0</horstretch> +              <verstretch>0</verstretch> +             </sizepolicy>              </property> -           </widget> -          </item> -          <item row="2" column="1"> -           <widget class="QPushButton" name="btnReset"> -            <property name="minimumSize"> +            <property name="maximumSize">               <size> -              <width>80</width> -              <height>20</height> +              <width>65536</width> +              <height>16777215</height>               </size>              </property>              <property name="text"> -             <string>Reset</string> +             <string>Serial port</string>              </property>             </widget>            </item> -          <item row="1" column="1"> +          <item row="0" column="1">             <widget class="QComboBox" name="cbSerialPort">              <property name="sizePolicy">               <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> @@ -113,7 +155,7 @@              </property>              <property name="maximumSize">               <size> -              <width>100</width> +              <width>65535</width>                <height>16777215</height>               </size>              </property> @@ -128,20 +170,49 @@              </property>             </widget>            </item> -          <item row="1" column="0"> -           <widget class="QLabel" name="label_info"> -            <property name="text"> -             <string>Arduino serial port</string> -            </property> -            <property name="wordWrap"> -             <bool>true</bool> -            </property> -           </widget> -          </item>           </layout>          </widget>         </item> -       <item row="1" column="0"> +       <item> +        <widget class="QPushButton" name="btnZero"> +         <property name="minimumSize"> +          <size> +           <width>80</width> +           <height>20</height> +          </size> +         </property> +         <property name="text"> +          <string>Zero</string> +         </property> +        </widget> +       </item> +       <item> +        <widget class="QPushButton" name="btnCenter"> +         <property name="minimumSize"> +          <size> +           <width>80</width> +           <height>20</height> +          </size> +         </property> +         <property name="text"> +          <string>Center</string> +         </property> +        </widget> +       </item> +       <item> +        <widget class="QPushButton" name="btnReset"> +         <property name="minimumSize"> +          <size> +           <width>80</width> +           <height>20</height> +          </size> +         </property> +         <property name="text"> +          <string>Reset</string> +         </property> +        </widget> +       </item> +       <item>          <widget class="QGroupBox" name="groupBox_3">           <property name="minimumSize">            <size> @@ -150,77 +221,36 @@            </size>           </property>           <property name="title"> -          <string>Axis selection</string> +          <string>Axis Configuration</string>           </property>           <property name="alignment">            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>           </property> -         <layout class="QGridLayout" name="gridLayout_2"> -          <item row="6" column="2"> -           <widget class="QCheckBox" name="chkEnableZ"> -            <property name="maximumSize"> -             <size> -              <width>20</width> -              <height>16777215</height> -             </size> -            </property> -            <property name="toolTip"> -             <string>Enable Axis</string> -            </property> -            <property name="layoutDirection"> -             <enum>Qt::LeftToRight</enum> -            </property> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -          <item row="4" column="4"> -           <widget class="QCheckBox" name="chkInvertX"> -            <property name="maximumSize"> -             <size> -              <width>20</width> -              <height>16777215</height> -             </size> -            </property> -            <property name="toolTip"> -             <string>Invert Axis</string> -            </property> -            <property name="layoutDirection"> -             <enum>Qt::LeftToRight</enum> -            </property> -            <property name="styleSheet"> -             <string notr="true"/> -            </property> -            <property name="text"> -             <string/> -            </property> -           </widget> -          </item> -          <item row="4" column="3"> -           <widget class="QComboBox" name="cb_x"> +         <layout class="QGridLayout" name="gridLayout_6"> +          <item row="2" column="2"> +           <widget class="QComboBox" name="cb_pitch">              <property name="toolTip">               <string>Associate Axis</string>              </property>              <item>               <property name="text"> -              <string>X</string> +              <string>RotX</string>               </property>              </item>              <item>               <property name="text"> -              <string>Y</string> +              <string>RotY</string>               </property>              </item>              <item>               <property name="text"> -              <string>Z</string> +              <string>RotZ</string>               </property>              </item>             </widget>            </item> -          <item row="4" column="2"> -           <widget class="QCheckBox" name="chkEnableX"> +          <item row="1" column="1"> +           <widget class="QCheckBox" name="chkEnableYaw">              <property name="maximumSize">               <size>                <width>20</width> @@ -238,29 +268,8 @@              </property>             </widget>            </item> -          <item row="4" column="0"> -           <widget class="QLabel" name="label_x"> -            <property name="text"> -             <string>X</string> -            </property> -           </widget> -          </item> -          <item row="2" column="0"> -           <widget class="QLabel" name="label_pitch"> -            <property name="text"> -             <string>Pitch</string> -            </property> -           </widget> -          </item> -          <item row="6" column="0"> -           <widget class="QLabel" name="label_z"> -            <property name="text"> -             <string>Z</string> -            </property> -           </widget> -          </item> -          <item row="6" column="4"> -           <widget class="QCheckBox" name="chkInvertZ"> +          <item row="4" column="1"> +           <widget class="QCheckBox" name="chkEnableX">              <property name="maximumSize">               <size>                <width>20</width> @@ -268,42 +277,31 @@               </size>              </property>              <property name="toolTip"> -             <string>Invert Axis</string> +             <string>Enable Axis</string>              </property>              <property name="layoutDirection">               <enum>Qt::LeftToRight</enum>              </property> -            <property name="styleSheet"> -             <string notr="true"/> -            </property>              <property name="text">               <string/>              </property>             </widget>            </item> -          <item row="3" column="3"> -           <widget class="QComboBox" name="cb_yaw"> -            <property name="toolTip"> -             <string>Associate Axis</string> +          <item row="2" column="0"> +           <widget class="QLabel" name="label_pitch"> +            <property name="text"> +             <string>Pitch:</string>              </property> -            <item> -             <property name="text"> -              <string>Yaw</string> -             </property> -            </item> -            <item> -             <property name="text"> -              <string>Pitch</string> -             </property> -            </item> -            <item> -             <property name="text"> -              <string>Roll</string> -             </property> -            </item>             </widget>            </item> -          <item row="2" column="2"> +          <item row="0" column="1"> +           <widget class="QLabel" name="label"> +            <property name="text"> +             <string>Enable</string> +            </property> +           </widget> +          </item> +          <item row="2" column="1">             <widget class="QCheckBox" name="chkEnablePitch">              <property name="maximumSize">               <size> @@ -322,30 +320,29 @@              </property>             </widget>            </item> -          <item row="6" column="3"> -           <widget class="QComboBox" name="cb_z"> -            <property name="toolTip"> -             <string>Associate Axis</string> +          <item row="1" column="0"> +           <widget class="QLabel" name="label_yaw"> +            <property name="text"> +             <string>Yaw:</string>              </property> -            <item> -             <property name="text"> -              <string>X</string> -             </property> -            </item> -            <item> -             <property name="text"> -              <string>Y</string> -             </property> -            </item> -            <item> -             <property name="text"> -              <string>Z</string> -             </property> -            </item>             </widget>            </item> -          <item row="3" column="4"> -           <widget class="QCheckBox" name="chkInvertYaw"> +          <item row="0" column="3"> +           <widget class="QLabel" name="label_3"> +            <property name="text"> +             <string>Invert</string> +            </property> +           </widget> +          </item> +          <item row="5" column="0"> +           <widget class="QLabel" name="label_y"> +            <property name="text"> +             <string>Y:</string> +            </property> +           </widget> +          </item> +          <item row="3" column="3"> +           <widget class="QCheckBox" name="chkInvertRoll">              <property name="maximumSize">               <size>                <width>20</width> @@ -366,8 +363,15 @@              </property>             </widget>            </item> -          <item row="5" column="2"> -           <widget class="QCheckBox" name="chkEnableY"> +          <item row="4" column="0"> +           <widget class="QLabel" name="label_x"> +            <property name="text"> +             <string>X:</string> +            </property> +           </widget> +          </item> +          <item row="5" column="3"> +           <widget class="QCheckBox" name="chkInvertY">              <property name="maximumSize">               <size>                <width>20</width> @@ -375,18 +379,21 @@               </size>              </property>              <property name="toolTip"> -             <string>Enable Axis</string> +             <string>Invert Axis</string>              </property>              <property name="layoutDirection">               <enum>Qt::LeftToRight</enum>              </property> +            <property name="styleSheet"> +             <string notr="true"/> +            </property>              <property name="text">               <string/>              </property>             </widget>            </item> -          <item row="2" column="4"> -           <widget class="QCheckBox" name="chkInvertPitch"> +          <item row="6" column="3"> +           <widget class="QCheckBox" name="chkInvertZ">              <property name="maximumSize">               <size>                <width>20</width> @@ -407,30 +414,30 @@              </property>             </widget>            </item> -          <item row="1" column="3"> -           <widget class="QComboBox" name="cb_roll"> +          <item row="6" column="2"> +           <widget class="QComboBox" name="cb_z">              <property name="toolTip">               <string>Associate Axis</string>              </property>              <item>               <property name="text"> -              <string>Yaw</string> +              <string>X</string>               </property>              </item>              <item>               <property name="text"> -              <string>Pitch</string> +              <string>Y</string>               </property>              </item>              <item>               <property name="text"> -              <string>Roll</string> +              <string>Z</string>               </property>              </item>             </widget>            </item> -          <item row="3" column="2"> -           <widget class="QCheckBox" name="chkEnableYaw"> +          <item row="6" column="1"> +           <widget class="QCheckBox" name="chkEnableZ">              <property name="maximumSize">               <size>                <width>20</width> @@ -448,29 +455,37 @@              </property>             </widget>            </item> -          <item row="0" column="3"> -           <widget class="QLabel" name="label_2"> -            <property name="text"> -             <string>Input</string> -            </property> -           </widget> -          </item> -          <item row="0" column="4"> -           <widget class="QLabel" name="label_3"> -            <property name="text"> -             <string>Invert</string> +          <item row="5" column="2"> +           <widget class="QComboBox" name="cb_y"> +            <property name="toolTip"> +             <string>Associate Axis</string>              </property> +            <item> +             <property name="text"> +              <string>X</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>Y</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>Z</string> +             </property> +            </item>             </widget>            </item>            <item row="3" column="0"> -           <widget class="QLabel" name="label_yaw"> +           <widget class="QLabel" name="label_roll">              <property name="text"> -             <string>Yaw</string> +             <string>Roll:</string>              </property>             </widget>            </item> -          <item row="1" column="2"> -           <widget class="QCheckBox" name="chkEnableRoll"> +          <item row="4" column="3"> +           <widget class="QCheckBox" name="chkInvertX">              <property name="maximumSize">               <size>                <width>20</width> @@ -478,7 +493,7 @@               </size>              </property>              <property name="toolTip"> -             <string>Enable Axis</string> +             <string>Invert Axis</string>              </property>              <property name="layoutDirection">               <enum>Qt::LeftToRight</enum> @@ -491,8 +506,8 @@              </property>             </widget>            </item> -          <item row="5" column="3"> -           <widget class="QComboBox" name="cb_y"> +          <item row="4" column="2"> +           <widget class="QComboBox" name="cb_x">              <property name="toolTip">               <string>Associate Axis</string>              </property> @@ -514,29 +529,58 @@             </widget>            </item>            <item row="2" column="3"> -           <widget class="QComboBox" name="cb_pitch"> +           <widget class="QCheckBox" name="chkInvertPitch"> +            <property name="maximumSize"> +             <size> +              <width>20</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="toolTip"> +             <string>Invert Axis</string> +            </property> +            <property name="layoutDirection"> +             <enum>Qt::LeftToRight</enum> +            </property> +            <property name="styleSheet"> +             <string notr="true"/> +            </property> +            <property name="text"> +             <string/> +            </property> +           </widget> +          </item> +          <item row="6" column="0"> +           <widget class="QLabel" name="label_z"> +            <property name="text"> +             <string>Z:</string> +            </property> +           </widget> +          </item> +          <item row="3" column="2"> +           <widget class="QComboBox" name="cb_roll">              <property name="toolTip">               <string>Associate Axis</string>              </property>              <item>               <property name="text"> -              <string>Yaw</string> +              <string>RotX</string>               </property>              </item>              <item>               <property name="text"> -              <string>Pitch</string> +              <string>RotY</string>               </property>              </item>              <item>               <property name="text"> -              <string>Roll</string> +              <string>RotZ</string>               </property>              </item>             </widget>            </item> -          <item row="1" column="4"> -           <widget class="QCheckBox" name="chkInvertRoll"> +          <item row="3" column="1"> +           <widget class="QCheckBox" name="chkEnableRoll">              <property name="maximumSize">               <size>                <width>20</width> @@ -544,7 +588,7 @@               </size>              </property>              <property name="toolTip"> -             <string>Invert Axis</string> +             <string>Enable Axis</string>              </property>              <property name="layoutDirection">               <enum>Qt::LeftToRight</enum> @@ -557,15 +601,27 @@              </property>             </widget>            </item> -          <item row="5" column="0"> -           <widget class="QLabel" name="label_y"> +          <item row="5" column="1"> +           <widget class="QCheckBox" name="chkEnableY"> +            <property name="maximumSize"> +             <size> +              <width>20</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="toolTip"> +             <string>Enable Axis</string> +            </property> +            <property name="layoutDirection"> +             <enum>Qt::LeftToRight</enum> +            </property>              <property name="text"> -             <string>Y</string> +             <string/>              </property>             </widget>            </item> -          <item row="5" column="4"> -           <widget class="QCheckBox" name="chkInvertY"> +          <item row="1" column="3"> +           <widget class="QCheckBox" name="chkInvertYaw">              <property name="maximumSize">               <size>                <width>20</width> @@ -586,48 +642,65 @@              </property>             </widget>            </item> -          <item row="1" column="0"> -           <widget class="QLabel" name="label_roll"> -            <property name="text"> -             <string>Roll</string> +          <item row="1" column="2"> +           <widget class="QComboBox" name="cb_yaw"> +            <property name="toolTip"> +             <string>Associate Axis</string>              </property> +            <item> +             <property name="text"> +              <string>RotX</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>RotY</string> +             </property> +            </item> +            <item> +             <property name="text"> +              <string>RotZ</string> +             </property> +            </item>             </widget>            </item>            <item row="0" column="2"> -           <widget class="QLabel" name="label"> -            <property name="text"> -             <string>Enable</string> -            </property> -           </widget> -          </item> -          <item row="0" column="0"> -           <widget class="QLabel" name="label_4"> +           <widget class="QLabel" name="label_2">              <property name="text"> -             <string>Output</string> +             <string>Axis</string>              </property>             </widget>            </item>           </layout>          </widget>         </item> -       <item row="2" column="0"> +       <item>          <widget class="QGroupBox" name="groupBox_status"> +         <property name="sizePolicy"> +          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum"> +           <horstretch>0</horstretch> +           <verstretch>0</verstretch> +          </sizepolicy> +         </property>           <property name="title"> -          <string>Information</string> +          <string>Status</string>           </property> -         <layout class="QGridLayout" name="gridLayout"> +         <property name="flat"> +          <bool>false</bool> +         </property> +         <layout class="QGridLayout" name="gridLayout_3">            <item row="0" column="0">             <widget class="QLabel" name="lab_tps">              <property name="minimumSize">               <size>                <width>31</width> -              <height>0</height> +              <height>20</height>               </size>              </property>              <property name="maximumSize">               <size>                <width>60</width> -              <height>13</height> +              <height>20</height>               </size>              </property>              <property name="toolTip"> @@ -638,37 +711,56 @@              </property>             </widget>            </item> -          <item row="1" column="1"> -           <widget class="QLabel" name="lab_vstatus"> +          <item row="0" column="1"> +           <widget class="QLabel" name="lab_vtps">              <property name="minimumSize">               <size> -              <width>170</width> -              <height>0</height> +              <width>31</width> +              <height>20</height>               </size>              </property>              <property name="maximumSize">               <size>                <width>60</width> -              <height>16777215</height> +              <height>20</height>               </size>              </property>              <property name="text"> -             <string/> +             <string>00</string>              </property>             </widget>            </item> -          <item row="0" column="1"> -           <widget class="QLabel" name="lab_vtps"> +          <item row="1" column="0"> +           <widget class="QLabel" name="lab_status">              <property name="minimumSize">               <size> -              <width>31</width> -              <height>0</height> +              <width>0</width> +              <height>20</height>               </size>              </property>              <property name="maximumSize">               <size>                <width>60</width> -              <height>13</height> +              <height>20</height> +             </size> +            </property> +            <property name="text"> +             <string>Info :</string> +            </property> +           </widget> +          </item> +          <item row="1" column="1"> +           <widget class="QLabel" name="lab_vstatus"> +            <property name="minimumSize"> +             <size> +              <width>170</width> +              <height>20</height> +             </size> +            </property> +            <property name="maximumSize"> +             <size> +              <width>60</width> +              <height>20</height>               </size>              </property>              <property name="text"> @@ -676,16 +768,255 @@              </property>             </widget>            </item> +         </layout> +        </widget> +       </item> +      </layout> +     </widget> +     <widget class="QWidget" name="tab_cmds"> +      <attribute name="title"> +       <string>Command</string> +      </attribute> +      <layout class="QGridLayout" name="gridLayout_5"> +       <item row="1" column="0"> +        <widget class="QGroupBox" name="parametersBox"> +         <property name="title"> +          <string>Serial Parameters</string> +         </property> +         <layout class="QGridLayout" name="gridLayout_8">            <item row="1" column="0"> -           <widget class="QLabel" name="lab_status"> +           <widget class="QLabel" name="dataBitsLabel"> +            <property name="text"> +             <string>Data bits:</string> +            </property> +           </widget> +          </item> +          <item row="1" column="1"> +           <widget class="QComboBox" name="QCB_Serial_dataBits"/> +          </item> +          <item row="0" column="0"> +           <widget class="QLabel" name="baudRateLabel"> +            <property name="text"> +             <string>BaudRate:</string> +            </property> +           </widget> +          </item> +          <item row="0" column="1"> +           <widget class="QComboBox" name="QCB_Serial_baudRate"/> +          </item> +          <item row="3" column="1"> +           <widget class="QComboBox" name="QCB_Serial_stopBits"/> +          </item> +          <item row="4" column="0"> +           <widget class="QLabel" name="flowControlLabel"> +            <property name="text"> +             <string>Flow control:</string> +            </property> +           </widget> +          </item> +          <item row="4" column="1"> +           <widget class="QComboBox" name="QCB_Serial_flowControl"/> +          </item> +          <item row="2" column="0"> +           <widget class="QLabel" name="parityLabel"> +            <property name="text"> +             <string>Parity:</string> +            </property> +           </widget> +          </item> +          <item row="2" column="1"> +           <widget class="QComboBox" name="QCB_Serial_parity"/> +          </item> +          <item row="3" column="0"> +           <widget class="QLabel" name="stopBitsLabel"> +            <property name="text"> +             <string>Stop bits:</string> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item row="0" column="0"> +        <widget class="QGroupBox" name="groupBox"> +         <property name="title"> +          <string>Arduino Commands</string> +         </property> +         <layout class="QGridLayout" name="gridLayout"> +          <item row="0" column="1"> +           <widget class="QLabel" name="lab_cmd_init_2"> +            <property name="text"> +             <string>Delay Init</string> +            </property> +           </widget> +          </item> +          <item row="1" column="0"> +           <widget class="QLabel" name="lab_cmd_init"> +            <property name="text"> +             <string>Init</string> +            </property> +           </widget> +          </item> +          <item row="1" column="1"> +           <widget class="QLineEdit" name="le_cmd_init"> +            <property name="toolTip"> +             <string>Command for Initialising Arduino</string> +            </property> +           </widget> +          </item> +          <item row="2" column="1"> +           <widget class="QLabel" name="lab_cmd_init_3"> +            <property name="text"> +             <string>Delay Start</string> +            </property> +           </widget> +          </item> +          <item row="3" column="0"> +           <widget class="QLabel" name="lab_cmd_start"> +            <property name="text"> +             <string>Start:</string> +            </property> +           </widget> +          </item> +          <item row="3" column="1"> +           <widget class="QLineEdit" name="le_cmd_start"> +            <property name="toolTip"> +             <string>Command for Start send sequence</string> +            </property> +           </widget> +          </item> +          <item row="4" column="1"> +           <widget class="QLabel" name="lab_cmd_init_4"> +            <property name="text"> +             <string>Delay Sequence</string> +            </property> +           </widget> +          </item> +          <item row="4" column="2"> +           <widget class="QSpinBox" name="spb_AfterStart"> +            <property name="toolTip"> +             <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Delay after Start Command in ms</span></p></body></html></string> +            </property> +            <property name="maximum"> +             <number>5000</number> +            </property> +            <property name="singleStep"> +             <number>50</number> +            </property> +           </widget> +          </item> +          <item row="5" column="0"> +           <widget class="QLabel" name="lab_cmd_stop"> +            <property name="text"> +             <string>Stop:</string> +            </property> +           </widget> +          </item> +          <item row="5" column="1"> +           <widget class="QLineEdit" name="le_cmd_stop"> +            <property name="toolTip"> +             <string>Command for Stop send sequence</string> +            </property> +           </widget> +          </item> +          <item row="6" column="0"> +           <widget class="QLabel" name="lab_cmd_center"> +            <property name="text"> +             <string>Center:</string> +            </property> +           </widget> +          </item> +          <item row="6" column="1"> +           <widget class="QLineEdit" name="le_cmd_center"> +            <property name="toolTip"> +             <string>Command for Center  Gyro arduino</string> +            </property> +           </widget> +          </item> +          <item row="7" column="0"> +           <widget class="QLabel" name="lab_cmd_zero"> +            <property name="text"> +             <string>Zero:</string> +            </property> +           </widget> +          </item> +          <item row="7" column="1"> +           <widget class="QLineEdit" name="le_cmd_zero"> +            <property name="toolTip"> +             <string>Command for Center  Gyro arduino</string> +            </property> +           </widget> +          </item> +          <item row="8" column="0"> +           <widget class="QLabel" name="lab_cmd_reset"> +            <property name="text"> +             <string>Reset:</string> +            </property> +           </widget> +          </item> +          <item row="8" column="1"> +           <widget class="QLineEdit" name="le_cmd_reset"> +            <property name="toolTip"> +             <string>Command for Reset Arduino</string> +            </property> +           </widget> +          </item> +          <item row="8" column="2"> +           <widget class="QCheckBox" name="cb_Endian"> +            <property name="toolTip"> +             <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Little or Big Endian for <span style=" font-family:'Arial,Geneva,Helvetica,sans-serif'; font-size:medium; color:#000000;">the serialization of byte order</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Arial,Geneva,Helvetica,sans-serif'; font-size:medium; color:#000000;">Arduino is LittleEndian ( unchecked)</span></p></body></html></string> +            </property> +            <property name="text"> +             <string>Endian</string> +            </property> +           </widget> +          </item> +          <item row="3" column="2"> +           <widget class="QSpinBox" name="spb_BeforeStart"> +            <property name="toolTip"> +             <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Delay after Init command in ms</span></p></body></html></string> +            </property> +            <property name="maximum"> +             <number>5000</number> +            </property> +            <property name="singleStep"> +             <number>50</number> +            </property> +           </widget> +          </item> +          <item row="1" column="2"> +           <widget class="QSpinBox" name="spb_BeforeInit">              <property name="maximumSize">               <size>                <width>60</width>                <height>16777215</height>               </size>              </property> -            <property name="text"> -             <string>Status :</string> +            <property name="toolTip"> +             <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Delay before Init command in ms</span></p></body></html></string> +            </property> +            <property name="maximum"> +             <number>5000</number> +            </property> +            <property name="singleStep"> +             <number>50</number>              </property>             </widget>            </item> @@ -698,50 +1029,97 @@        <attribute name="title">         <string>About</string>        </attribute> -      <layout class="QFormLayout" name="formLayout"> +      <layout class="QGridLayout" name="gridLayout_4">         <item row="0" column="0"> -        <widget class="QLabel" name="label_10"> +        <widget class="QLabel" name="label_info_2">           <property name="text">            <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">  <html><head><meta name="qrichtext" content="1" /><style type="text/css">  p, li { white-space: pre-wrap; }  </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">FTNoIR HAT  Plugin<br />Version 1.0</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">by FuraX49</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://hatire.sourceforge.net/"><span style=" font-weight:600; text-decoration: underline; color:#0000ff;">Manual (external)</span></a></p></body></html></string> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">FTNoIR HAT  Plugin<br />by FuraX49</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://hatire.sourceforge.net/"><span style=" font-size:8pt; font-weight:600; text-decoration: underline; color:#0000ff;">Manual (external)</span></a></p></body></html></string>           </property>           <property name="openExternalLinks">            <bool>true</bool>           </property>          </widget>         </item> -       <item row="0" column="1"> -        <widget class="QLabel" name="label_35"> +       <item row="0" column="1" rowspan="2" colspan="2"> +        <widget class="QPushButton" name="btn_icone"> +         <property name="autoFillBackground"> +          <bool>false</bool> +         </property>           <property name="text">            <string/>           </property> -         <property name="pixmap"> -          <pixmap resource="ftnoir_hat.qrc">:/images/hat_logo.png</pixmap> +         <property name="icon"> +          <iconset> +           <normalon>:/images/hat_logo.png</normalon> +          </iconset> +         </property> +         <property name="iconSize"> +          <size> +           <width>128</width> +           <height>128</height> +          </size> +         </property> +         <property name="flat"> +          <bool>true</bool> +         </property> +        </widget> +       </item> +       <item row="1" column="0"> +        <widget class="QLabel" name="label_version"> +         <property name="font"> +          <font> +           <family>Arial Black</family> +           <pointsize>10</pointsize> +           <weight>75</weight> +           <italic>true</italic> +           <bold>true</bold> +          </font> +         </property> +         <property name="text"> +          <string>Version 1.0.0</string> +         </property> +         <property name="textFormat"> +          <enum>Qt::PlainText</enum> +         </property> +         <property name="openExternalLinks"> +          <bool>true</bool>           </property>          </widget>         </item>         <item row="2" column="0" colspan="2">          <widget class="QLineEdit" name="lineSend"/>         </item> -       <item row="4" column="0" colspan="2"> +       <item row="2" column="2"> +        <widget class="QPushButton" name="btnSend"> +         <property name="text"> +          <string>Send</string> +         </property> +        </widget> +       </item> +       <item row="3" column="0" colspan="3">          <widget class="QPlainTextEdit" name="pteINFO"> +         <property name="contextMenuPolicy"> +          <enum>Qt::ActionsContextMenu</enum> +         </property>           <property name="readOnly">            <bool>true</bool>           </property> +         <property name="plainText"> +          <string notr="true"/> +         </property> +         <property name="textInteractionFlags"> +          <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> +         </property>           <property name="maximumBlockCount">            <number>800</number>           </property> -        </widget> -       </item> -       <item row="3" column="1"> -        <widget class="QPushButton" name="btnSend"> -         <property name="text"> -          <string>Send</string> +         <property name="backgroundVisible"> +          <bool>false</bool>           </property>          </widget>         </item> @@ -749,31 +1127,6 @@ p, li { white-space: pre-wrap; }       </widget>      </widget>     </item> -   <item row="1" column="0"> -    <widget class="QPushButton" name="btnOK"> -     <property name="sizePolicy"> -      <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> -       <horstretch>0</horstretch> -       <verstretch>0</verstretch> -      </sizepolicy> -     </property> -     <property name="minimumSize"> -      <size> -       <width>80</width> -       <height>25</height> -      </size> -     </property> -     <property name="maximumSize"> -      <size> -       <width>80</width> -       <height>25</height> -      </size> -     </property> -     <property name="text"> -      <string>OK</string> -     </property> -    </widget> -   </item>     <item row="1" column="1">      <widget class="QPushButton" name="btnSave">       <property name="minimumSize"> @@ -793,39 +1146,41 @@ p, li { white-space: pre-wrap; }       </property>      </widget>     </item> -   <item row="1" column="2"> -    <widget class="QPushButton" name="btnCancel"> -     <property name="sizePolicy"> -      <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> -       <horstretch>0</horstretch> -       <verstretch>0</verstretch> -      </sizepolicy> -     </property> -     <property name="minimumSize"> -      <size> -       <width>80</width> -       <height>25</height> -      </size> -     </property> -     <property name="maximumSize"> -      <size> -       <width>80</width> -       <height>25</height> -      </size> -     </property> -     <property name="text"> -      <string>Cancel</string> -     </property> -    </widget> -   </item>    </layout>   </widget>   <tabstops> +  <tabstop>btnOK</tabstop> +  <tabstop>btnSave</tabstop>    <tabstop>btnCancel</tabstop> +  <tabstop>chkEnableYaw</tabstop> +  <tabstop>cb_yaw</tabstop> +  <tabstop>chkInvertYaw</tabstop> +  <tabstop>chkEnablePitch</tabstop> +  <tabstop>cb_pitch</tabstop> +  <tabstop>chkInvertPitch</tabstop> +  <tabstop>chkEnableRoll</tabstop> +  <tabstop>cb_roll</tabstop> +  <tabstop>chkInvertRoll</tabstop> +  <tabstop>chkEnableX</tabstop> +  <tabstop>cb_x</tabstop> +  <tabstop>chkInvertX</tabstop> +  <tabstop>chkEnableY</tabstop> +  <tabstop>cb_y</tabstop> +  <tabstop>chkInvertY</tabstop> +  <tabstop>chkEnableZ</tabstop> +  <tabstop>cb_z</tabstop> +  <tabstop>chkInvertZ</tabstop> +  <tabstop>QCB_Serial_baudRate</tabstop> +  <tabstop>QCB_Serial_dataBits</tabstop> +  <tabstop>QCB_Serial_parity</tabstop> +  <tabstop>QCB_Serial_stopBits</tabstop> +  <tabstop>QCB_Serial_flowControl</tabstop> +  <tabstop>lineSend</tabstop> +  <tabstop>btnSend</tabstop> +  <tabstop>pteINFO</tabstop> +  <tabstop>tabWidget</tabstop>   </tabstops> - <resources> -  <include location="ftnoir_hat.qrc"/> - </resources> + <resources/>   <connections/>   <slots>    <slot>startEngineClicked()</slot> diff --git a/ftnoir_tracker_hatire/ftnoir_tracker_hat.cpp b/ftnoir_tracker_hatire/ftnoir_tracker_hat.cpp index fbe97854..b933dd14 100644 --- a/ftnoir_tracker_hatire/ftnoir_tracker_hat.cpp +++ b/ftnoir_tracker_hatire/ftnoir_tracker_hat.cpp @@ -1,217 +1,501 @@  /******************************************************************************** - * Copyright (C) 2012    FuraX49 (HAT Tracker plugins)                          * - *  Homepage:            http://hatire.sourceforge.net                          * - *                                                                              * - * This program is free software; you can redistribute it and/or modify it      * - * under the terms of the GNU General Public License as published by the        * - * Free Software Foundation; either version 3 of the License, or (at your       * - * option) any later version.                                                   * - *                                                                              * - * This program is distributed in the hope that it will be useful, but          * - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   * - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for  * - * more details.                                                                * - *                                                                              * - * You should have received a copy of the GNU General Public License along      * - * with this program; if not, see <http://www.gnu.org/licenses/>.               * - *                                                                              * - ********************************************************************************/ - +* FaceTrackNoIR		This program is a private project of some enthusiastic		* +*					gamers from Holland, who don't like to pay much for			* +*					head-tracking.												* +*																				* +* Copyright (C) 2012	Wim Vriend (Developing)									* +*						Ron Hendriks (Researching and Testing)					* +* Homepage:			http://facetracknoir.sourceforge.net/home/default.htm		* +*																				* +* Copyright (C) 2012	FuraX49 (HAT Tracker plugins)	    	     			* +* Homepage:			http://hatire.sourceforge.net								* +*																				* +*																				* +* This program is free software; you can redistribute it and/or modify it		* +* under the terms of the GNU General Public License as published by the			* +* Free Software Foundation; either version 3 of the License, or (at your		* +* option) any later version.													* +*																				* +* This program is distributed in the hope that it will be useful, but			* +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY	* +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for	* +* more details.																	* +*																				* +* You should have received a copy of the GNU General Public License along		* +* with this program; if not, see <http://www.gnu.org/licenses/>.				* +*																				* +********************************************************************************/  #include "ftnoir_tracker_hat.h" -#include "facetracknoir/global-settings.h" -#include <QMessageBox> -#include <QDebug> -FTNoIR_Tracker::FTNoIR_Tracker() : -    SerialPort(nullptr), -    stop(false) +FTNoIR_Tracker::FTNoIR_Tracker()  { -    TrackerSettings settings; -    settings.load_ini(); -    applysettings(settings); - -    //ListErrInf  = new QList<QString>(); - -    datagram.reserve(30); -    qDebug() << "FTNoIR_Tracker::Initialize() Open SerialPort"; -    SerialPort = new QSerialPort(sSerialPortName); -    if (SerialPort->open(QIODevice::ReadWrite | QIODevice::Unbuffered  ) == true) { -        SerialPort->flush(); -        SerialPort->setBaudRate(115200); -        SerialPort->setParity(QSerialPort::NoParity); -        SerialPort->setDataBits(QSerialPort::Data8); -        SerialPort->setStopBits(QSerialPort::OneStop); -        SerialPort->setFlowControl(QSerialPort::NoFlowControl); -        //SerialPort->setTimeout(waitTimeout); -        //SerialPort->setQueryMode(QextSerialPort::EventDriven); //Polling -        SerialPort->putChar('S'); -    } -    else { -        QMessageBox::warning(0,"FaceTrackNoIR Error", "Unable to open SerialPort",QMessageBox::Ok,QMessageBox::NoButton); -        delete SerialPort; -        SerialPort = NULL; -    } +	ComPort =   NULL; + +	HAT.Rot[0]=0; +	HAT.Rot[1]=0; +	HAT.Rot[2]=0; +	HAT.Trans[0]=0; +	HAT.Trans[1]=0; +	HAT.Trans[2]=0; + + +	// prepare & reserve QByteArray +	dataRead.resize(4096); +	dataRead.clear(); +	Begin.append((char) 0xAA); +	Begin.append((char) 0xAA); +	End.append((char) 0x55); +	End.append((char) 0x55); + +	settings.load_ini();  }  FTNoIR_Tracker::~FTNoIR_Tracker()  { -    stop = true; -    wait(); -    if (SerialPort!=NULL) { -        if (SerialPort->isOpen() ) { -            SerialPort->putChar('s'); //Send STOP to Arduino -            SerialPort->close(); -        } -        delete SerialPort; -        SerialPort=NULL; -    } - +	if (ComPort!=NULL) { +		if (ComPort->isOpen() ) { +			ComPort->close(); +		} +		delete ComPort; +		ComPort=NULL; +	}  }  //send CENTER to Arduino  void FTNoIR_Tracker::notifyCenter() { -    if (SerialPort!=NULL) { -        if (SerialPort->isOpen() ) { -            SerialPort->putChar('C'); -        } -    } +	sendcmd(sCmdCenter);  } +//send ZERO to Arduino +bool FTNoIR_Tracker::notifyZeroed() { +	sendcmd(sCmdZero); +	return true; +} -//send CENTER to Arduino -void FTNoIR_Tracker::center() { -    if (SerialPort!=NULL) { -        if (SerialPort->isOpen() ) { -            SerialPort->putChar('C'); -        } -    } -}  //send RESET to Arduino  void FTNoIR_Tracker::reset() { -    if (SerialPort!=NULL) { -        if (SerialPort->isOpen() ) { -            SerialPort->putChar('R'); -        } -    } +	sendcmd(sCmdReset); +} + + +// Info SerialPort +void FTNoIR_Tracker::SerialInfo() { +	QByteArray Msg; +	if (ComPort!=NULL) { +		if (ComPort->isOpen() ) { +			Msg.append("\r\n"); +			Msg.append(ComPort->portName()); +			Msg.append("\r\n"); +			Msg.append("BAUDRATE :"); +			Msg.append(QString::number(ComPort->baudRate())); +			Msg.append("\r\n"); +			Msg.append("DataBits :"); +			Msg.append(QString::number(ComPort->dataBits())); +			Msg.append("\r\n"); +			Msg.append("Parity :"); +			switch (ComPort->parity()) { +				case 0:  Msg.append("No parity"); +					break;  +				case 2:  Msg.append("Even parity"); +					break;  +				case 3:  Msg.append("Odd parity"); +					break;  +				case 4:  Msg.append("Space parity"); +					break;  +				case 5:  Msg.append("Mark parity"); +					break;  +				default:  Msg.append("Unknown parity"); +					break;  +			} +			Msg.append("\r\n"); +			Msg.append("Stop Bits :"); +			switch (ComPort->stopBits()) { +				Msg.append(QString::number(ComPort->stopBits())); +				case 1:  Msg.append("1 stop bit."); +					break;  +				case 2:  Msg.append("2 stop bits."); +					break;  +				case 3:  Msg.append("1.5 stop bits."); +					break;  +				default:  Msg.append("Unknown number of stop bit."); +					break;  +			} +			Msg.append("\r\n"); +			Msg.append("Flow Control :"); +			switch (ComPort->flowControl()) { +				case 0:  Msg.append("No flow control"); +					break;  +				case 1:  Msg.append("Hardware flow control (RTS/CTS)"); +					break;  +				case 2:  Msg.append("Software flow control (XON/XOFF)"); +					break;  +				default:  Msg.append("Unknown flow control"); +					break;  +			} +			emit sendMsgInfo(Msg); + +		} +	}  } +  //send command  to Arduino -void FTNoIR_Tracker::sendcmd(QString* cmd) { -    QMutexLocker locker(&lock); -    QByteArray bytes; -    if (SerialPort!=NULL) { -        if (SerialPort->isOpen() ) { -            bytes.append(cmd->toLatin1()); -            SerialPort->write(bytes); -        } -    } -} - -// return FPS and last status -void FTNoIR_Tracker::get_info(QString*, int* tps ){ -    QMutexLocker locker(&lock); -    *tps=HAT.Code; -#if 0 -    if (ListErrInf->size()>0)  { -        *info=ListErrInf->takeFirst(); -    } else { -        *info= QString(); -    } -#endif +void FTNoIR_Tracker::sendcmd(const QByteArray &cmd) { +	QByteArray Msg; +	if (cmd.length()>0) { +		if (ComPort->isOpen() )  +		{ +			ComPort->write(cmd); +			if (!ComPort->waitForBytesWritten(1000)) { +				emit sendMsgInfo("TimeOut in writing CMD"); +			} else  { +				Msg.append("\r\n"); +				Msg.append("SEND '"); +				Msg.append(cmd); +				Msg.append("'\r\n"); +			} +			if  ( !ComPort->waitForReadyRead(1000)) { +				emit sendMsgInfo("TimeOut in response to CMD") ; +			} else { +				emit sendMsgInfo(Msg); +			} +		} else { +			emit sendMsgInfo("ComPort not open")  ; +		} +	}  } -/** QThread run @override **/ -void FTNoIR_Tracker::run() { -    if (!SerialPort) -        return; -    while (!stop) -    { -        if (SerialPort->bytesAvailable()>=30) -        { -            QMutexLocker locker(&lock); -            datagram.clear(); -            datagram=SerialPort->read(30); -            QDataStream datastream(datagram); -            datastream >> ArduinoData; -            if (ArduinoData.Begin==0xAAAA && ArduinoData.End==0x5555 ) -            { -                if (ArduinoData.Code <= 1000) -                { -                    HAT=ArduinoData; -                } -            } else { -                SerialPort->read(1); -            } -        } -        msleep(10); -    } -} - -void FTNoIR_Tracker::StartTracker( QFrame* ) +// return FPS  +void FTNoIR_Tracker::get_info( int *tps ){ +	*tps=frame_cnt; +	frame_cnt=0; +} + +void FTNoIR_Tracker::SerialRead()  { -    start( QThread::TimeCriticalPriority ); -    return; +    QMutexLocker lck(&mutex); +	dataRead+=ComPort->readAll();  } -bool FTNoIR_Tracker::GiveHeadPoseData(double* data) +#ifndef OPENTRACK_API +void FTNoIR_Tracker::Initialize( QFrame *videoframe )  { -    QMutexLocker locker(&lock); +	CptError=0; +	dataRead.clear(); +	frame_cnt=0; + +	settings.load_ini(); +	applysettings(settings); +	ComPort =  new QSerialPort(this); +	ComPort->setPortName(sSerialPortName);  +	if (ComPort->open(QIODevice::ReadWrite ) == true) {  +		connect(ComPort, SIGNAL(readyRead()), this, SLOT(SerialRead())); +		if (   +			ComPort->setBaudRate((QSerialPort::BaudRate)iBaudRate) +			&& ComPort->setDataBits((QSerialPort::DataBits)iDataBits)  +			&& ComPort->setParity((QSerialPort::Parity)iParity)  +			&& ComPort->setStopBits((QSerialPort::StopBits)iStopBits)   +			&& ComPort->setFlowControl((QSerialPort::FlowControl)iFlowControl)   +			&& ComPort->clear(QSerialPort::AllDirections) +			&& ComPort->setDataErrorPolicy(QSerialPort::IgnorePolicy) +			) { +				// Wait init arduino sequence  +				for (int i = 1; i <=iDelayInit;  i+=50) { +					if (ComPort->waitForReadyRead(50)) break; +				} +				sendcmd(sCmdInit); +				// Wait init MPU sequence  +				for (int i = 1; i <=iDelayStart;  i+=50) { +					if (ComPort->waitForReadyRead(50)) break; +				} + +		} else { +			QMessageBox::warning(0,"FaceTrackNoIR Error", ComPort->errorString(),QMessageBox::Ok,QMessageBox::NoButton); +		} +	} +	else { +		QMessageBox::warning(0,"FaceTrackNoIR Error", "Unable to open ComPort",QMessageBox::Ok,QMessageBox::NoButton); +		delete ComPort; +		ComPort = NULL; +	}  +	return; +} -    const bool inversions[] = { -        bInvertX, bInvertY, bInvertZ, bInvertYaw, bInvertPitch, bInvertRoll -    }; -    const bool enablement[] = { -        bEnableX, bEnableY, bEnableZ, bEnableYaw, bEnablePitch, bEnableRoll -    }; -    const int axes[] = { -        iXAxis, iYAxis, iZAxis, iYawAxis, iPitchAxis, iRollAxis -    }; +void FTNoIR_Tracker::StartTracker(HWND parent_window) +{ +	// Send  START cmd to IMU +	sendcmd(sCmdStart); +	// Wait start MPU sequence  +	for (int i = 1; i <=iDelaySeq;  i+=50) { +		if (ComPort->waitForReadyRead(50)) break; +	} +	return; +} -    for (int i = 0; i < 6; i++) -    { -        if (enablement[i]) -            data[i] = HAT.Gyro[axes[i]] * (inversions[i] ? -1 : 1); -    } -    return true; +void FTNoIR_Tracker::StopTracker( bool exit ) +{ +	QByteArray Msg; +	if (sCmdStop.length()>0) { +		if (ComPort->isOpen() )  +		{ +			ComPort->write(sCmdStop); +			if (!ComPort->waitForBytesWritten(1000)) { +				emit sendMsgInfo("TimeOut in writing CMD"); +			} else  { +				Msg.append("\r\n"); +				Msg.append("SEND '"); +				Msg.append(sCmdStop); +				Msg.append("'\r\n"); +			}	 +			emit sendMsgInfo(Msg); +		} +	} +	// OK, the thread is not stopped, doing this. That might be dangerous anyway... +	// +	if (exit || !exit) return; +	return;  } +#else +void FTNoIR_Tracker::StartTracker(QFrame*) +{ +	CptError=0; +	dataRead.clear(); +	frame_cnt=0; + +	settings.load_ini(); +	applysettings(settings); +	ComPort =  new QSerialPort(this); +	ComPort->setPortName(sSerialPortName);  +	if (ComPort->open(QIODevice::ReadWrite ) == true) {  +		connect(ComPort, SIGNAL(readyRead()), this, SLOT(SerialRead())); +		if (   +			ComPort->setBaudRate((QSerialPort::BaudRate)iBaudRate) +			&& ComPort->setDataBits((QSerialPort::DataBits)iDataBits)  +			&& ComPort->setParity((QSerialPort::Parity)iParity)  +			&& ComPort->setStopBits((QSerialPort::StopBits)iStopBits)   +			&& ComPort->setFlowControl((QSerialPort::FlowControl)iFlowControl)   +			&& ComPort->clear(QSerialPort::AllDirections) +			&& ComPort->setDataErrorPolicy(QSerialPort::IgnorePolicy) +			) { +				// Wait init arduino sequence  +				for (int i = 1; i <=iDelayInit;  i+=50) { +					if (ComPort->waitForReadyRead(50)) break; +				} +				sendcmd(sCmdInit); +				// Wait init MPU sequence  +				for (int i = 1; i <=iDelayStart;  i+=50) { +					if (ComPort->waitForReadyRead(50)) break; +				} +				// Send  START cmd to IMU +				sendcmd(sCmdStart); + +				// Wait start MPU sequence  +				for (int i = 1; i <=iDelaySeq;  i+=50) { +					if (ComPort->waitForReadyRead(50)) break; +				} +		} else { +			QMessageBox::warning(0,"FaceTrackNoIR Error", ComPort->errorString(),QMessageBox::Ok,QMessageBox::NoButton); +		} +	} +	else { +		QMessageBox::warning(0,"FaceTrackNoIR Error", "Unable to open ComPort",QMessageBox::Ok,QMessageBox::NoButton); +		delete ComPort; +		ComPort = NULL; +	}  +	return; + +} +#endif + + +// +// Return 6DOF info +// +#ifdef OPENTRACK_API +#define THeadPoseData double +#endif + +bool FTNoIR_Tracker::GiveHeadPoseData(THeadPoseData *data) +{ +    QMutexLocker lck(&mutex); +	while  (dataRead.length()>=30) { +		if ((dataRead.startsWith(Begin) &&  ( dataRead.mid(28,2)==End )) )  { // .Begin==0xAAAA .End==0x5555 +			QDataStream  datastream(dataRead.left(30)); +			if (bBigEndian)	datastream.setByteOrder(QDataStream::BigEndian ); +			else datastream.setByteOrder(QDataStream::LittleEndian ); +			datastream>>ArduinoData; +			frame_cnt++; +			if (ArduinoData.Code <= 1000) { +				HAT=ArduinoData; +			} else { +				emit sendMsgInfo(dataRead.mid(4,24))  ; +			} +			dataRead.remove(0,30); +		} else { +			// resynchro trame  +			int index =	dataRead.indexOf(Begin); +			if (index==-1) { +				index=dataRead.length(); +			}  +			emit sendMsgInfo(dataRead.mid(0,index))  ; +			dataRead.remove(0,index); +			CptError++; +		} +	} + +	if (CptError>50) { +		emit sendMsgInfo("Can't find HAT frame")  ; +		CptError=0; +		return false; +	} +#ifdef OPENTRACK_API +	data[frame_cnt] = (long) HAT.Code; + +	if (bEnableYaw) { +		if (bInvertYaw )	data[Yaw] = (double)  HAT.Rot[iYawAxe] *  -1.0f; +		else 	data[Yaw] = (double) HAT.Rot[iYawAxe]; +	}	 + +	if (bEnablePitch) { +		if (bInvertPitch) data[Pitch] = (double) HAT.Rot[iPitchAxe] *  -1.0f; +		else data[Pitch] = (double) HAT.Rot[iPitchAxe]; +	} + +	if (bEnableRoll) { +		if (bInvertRoll) data[Roll] = (double) HAT.Rot[iRollAxe] *  -1.0f;  +		else data[Roll] = (double) HAT.Rot[iRollAxe]; +	} + +	if (bEnableX) { +		if (bInvertX) data[TX] =(double)  HAT.Trans[iXAxe]*  -1.0f; +		else data[TX] =  HAT.Trans[iXAxe]; +	} + +	if (bEnableY) { +		if (bInvertY) data[TY] =(double) HAT.Trans[iYAxe]*  -1.0f; +		else data[TY] =  HAT.Trans[iYAxe]; +	} + +	if (bEnableZ) { +		if (bInvertZ)  data[TZ] =  HAT.Trans[iZAxe]*  -1.0f; +		else data[TZ] =  HAT.Trans[iZAxe]; +	} +#else +	data->frame_number =  (long) HAT.Code; + +	if (bEnableYaw) { +		if (bInvertYaw )	data->yaw = (double) HAT.Rot[iYawAxe] *  -1.0f; +		else 	data->yaw = (double) HAT.Rot[iYawAxe]; +	}	 + +	if (bEnablePitch) { +		if (bInvertPitch)data->pitch = (double) HAT.Rot[iPitchAxe] *  -1.0f; +		else data->pitch = (double) HAT.Rot[iPitchAxe]; +	} + +	if (bEnableRoll) { +		if (bInvertRoll) data->roll = (double) HAT.Rot[iRollAxe] *  -1.0f;  +		else data->roll = (double) HAT.Rot[iRollAxe]; +	} + +	if (bEnableX) { +		if (bInvertX) data->x = (double) HAT.Trans[iXAxe]*  -1.0f; +		else data->x = (double) HAT.Trans[iXAxe]; +	} + +	if (bEnableY) { +		if (bInvertY) data->y = (double) HAT.Trans[iYAxe]*  -1.0f; +		else data->y = (double) HAT.Trans[iYAxe]; +	} + +	if (bEnableZ) { +		if (bInvertZ)  data->z = (double) HAT.Trans[iZAxe]*  -1.0f; +		else data->z = (double) HAT.Trans[iZAxe]; +	} +#endif + +	// For debug +	//data->x=dataRead.length(); +	//data->y=CptError; + +	return true; + +} + + + +// +// Apply modification Settings  +//  void FTNoIR_Tracker::applysettings(const TrackerSettings& settings){ -    qDebug()<<"Tracker:: Applying settings"; +    QMutexLocker lck(&mutex); +	sSerialPortName= settings.SerialPortName; + +	bEnableRoll = settings.EnableRoll; +	bEnablePitch = settings.EnablePitch; +	bEnableYaw = settings.EnableYaw; +	bEnableX = settings.EnableX; +	bEnableY = settings.EnableY; +	bEnableZ = settings.EnableZ; -    QMutexLocker locker(&lock); -    sSerialPortName= settings.SerialPortName; +	bInvertRoll = settings.InvertRoll; +	bInvertPitch = settings.InvertPitch; +	bInvertYaw = settings.InvertYaw; +	bInvertX = settings.InvertX; +	bInvertY = settings.InvertY; +	bInvertZ = settings.InvertZ; -    bEnableRoll = settings.EnableRoll; -    bEnablePitch = settings.EnablePitch; -    bEnableYaw = settings.EnableYaw; -    bEnableX = settings.EnableX; -    bEnableY = settings.EnableY; -    bEnableZ = settings.EnableZ; +	iRollAxe= settings.RollAxe; +	iPitchAxe= settings.PitchAxe; +	iYawAxe= settings.YawAxe; +	iXAxe= settings.XAxe; +	iYAxe= settings.YAxe; +	iZAxe= settings.ZAxe; -    bInvertRoll = settings.InvertRoll; -    bInvertPitch = settings.InvertPitch; -    bInvertYaw = settings.InvertYaw; -    bInvertX = settings.InvertX; -    bInvertY = settings.InvertY; -    bInvertZ = settings.InvertZ; +	iBaudRate=settings.pBaudRate; +	iDataBits=settings.pDataBits; +	iParity=settings.pParity; +	iStopBits=settings.pStopBits; +	iFlowControl=settings.pFlowControl; +	sCmdStart= settings.CmdStart.toLatin1(); +	sCmdStop= settings.CmdStop.toLatin1(); +	sCmdInit= settings.CmdInit.toLatin1(); +	sCmdReset= settings.CmdReset.toLatin1(); +	sCmdCenter= settings.CmdCenter.toLatin1(); +	sCmdZero= settings.CmdZero.toLatin1(); -    iRollAxis= settings.RollAxis; -    iPitchAxis= settings.PitchAxis; -    iYawAxis= settings.YawAxis; -    iXAxis= settings.XAxis; -    iYAxis= settings.YAxis; -    iZAxis= settings.ZAxis; +	iDelayInit=settings.DelayInit; +	iDelayStart=settings.DelayStart; +	iDelaySeq=settings.DelaySeq; + +	bBigEndian=settings.BigEndian;  } + + +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Tracker object. + +// Export both decorated and undecorated names. +//   GetTracker     - Undecorated name, which can be easily used with GetProcAddress +//                Win32 API function. +//   _GetTracker@0  - Common name decoration for __stdcall functions in C language. +//////////////////////////////////////////////////////////////////////////////// +#ifdef OPENTRACK_API  extern "C" FTNOIR_TRACKER_BASE_EXPORT ITracker* CALLING_CONVENTION GetConstructor() +#else +#pragma comment(linker, "/export:GetTracker=_GetTracker@0") +FTNOIR_TRACKER_BASE_EXPORT ITrackerPtr __stdcall GetTracker() +#endif  { -    return new FTNoIR_Tracker; +	return new FTNoIR_Tracker;  } diff --git a/ftnoir_tracker_hatire/ftnoir_tracker_hat.h b/ftnoir_tracker_hatire/ftnoir_tracker_hat.h index af583d11..a1b4ecda 100644 --- a/ftnoir_tracker_hatire/ftnoir_tracker_hat.h +++ b/ftnoir_tracker_hatire/ftnoir_tracker_hat.h @@ -1,46 +1,68 @@  #ifndef FTNOIR_TRACKER_HAT_H  #define FTNOIR_TRACKER_HAT_H -#include "facetracknoir/global-settings.h" -#include "ftnoir_tracker_base/ftnoir_tracker_base.h" +#ifdef OPENTRACK_API +#   include "ftnoir_tracker_base/ftnoir_tracker_base.h" +#   include "facetracknoir/global-settings.h" +#endif  #include "ftnoir_tracker_hat_settings.h"  #include "ftnoir_arduino_type.h" - +#include <QObject> +#include <QPalette> +#include <QtGui> +#include <QByteArray> +#include <QMessageBox>  #include <QtSerialPort/QSerialPort> -#include <QThread> -#include <QTimer> -#include <QSettings> +#include <QtSerialPort/QSerialPortInfo>  #include <QMutex>  #include <QMutexLocker> -#include <cmath> +#include <QSettings> -class FTNoIR_Tracker : public ITracker, QThread -{  +#define VER_FILEVERSION_STR         "Version 2.0.7\0" +class FTNoIR_Tracker : public QObject, public ITracker  +{  +  Q_OBJECT  public:  	FTNoIR_Tracker(); -    virtual ~FTNoIR_Tracker() virt_override; - -    virtual void StartTracker( QFrame* frame ) virt_override; -    virtual bool GiveHeadPoseData(double *data) virt_override; - +	~FTNoIR_Tracker(); + +#ifdef OPENTRACK_API +    virtual void StartTracker(QFrame*); +    virtual bool GiveHeadPoseData(double* data); +#else +    void Initialize( QFrame *videoframe ); +	virtual void StartTracker(HWND parent_window); +    virtual void StopTracker(bool exit); +    virtual bool GiveHeadPoseData(THeadPoseData *data); +#endif  	void applysettings(const TrackerSettings& settings);  	void notifyCenter(); -    void center(); +	bool notifyZeroed();  	void reset(); -	void sendcmd(QString*  cmd); -	void get_info(QString* info , int* tps ); +	void SerialInfo(); +	void sendcmd(const QByteArray &cmd); +	void get_info( int *tps ); + +private Q_SLOTS: +    void SerialRead(); + +signals: +    void sendMsgInfo(const QByteArray &MsgInfo); -protected: -	void run();												// qthread override run method  private: + 	QSerialPort *ComPort;      TArduinoData ArduinoData, HAT ;                              // Trame from Arduino -    QByteArray datagram; -    QSerialPort* SerialPort; -    volatile bool stop; -    QMutex lock; -	QString sSerialPortName;									// Port serial name +    QByteArray dataRead; +    QByteArray dataToSend; +	QByteArray Begin; +    QByteArray End; +	QMutex mutex; +	int frame_cnt; + +    TrackerSettings settings; +  	bool bEnableRoll;  	bool bEnablePitch;  	bool bEnableYaw; @@ -55,23 +77,54 @@ private:  	bool bInvertY;  	bool bInvertZ; +	int iRollAxe; +	int iPitchAxe; +	int iYawAxe; +	int iXAxe; +	int iYAxe; +	int iZAxe; + +	QByteArray  sCmdStart; +	QByteArray  sCmdStop; +	QByteArray  sCmdInit; +	QByteArray  sCmdReset; +	QByteArray  sCmdCenter; +	QByteArray  sCmdZero; + +	int iDelayInit; +	int iDelayStart; +	int iDelaySeq; + +	bool bBigEndian; + +	QString sSerialPortName; +	QSerialPort::BaudRate iBaudRate; +	QSerialPort::DataBits iDataBits; +	QSerialPort::Parity iParity; +	QSerialPort::StopBits iStopBits; +	QSerialPort::FlowControl iFlowControl; + +    int CptError; -    int iRollAxis; -    int iPitchAxis; -    int iYawAxis; -    int iXAxis; -    int iYAxis; -    int iZAxis;  }; -class FTNoIR_TrackerDll : public Metadata + +//******************************************************************************************************* +// FaceTrackNoIR Tracker DLL. Functions used to get general info on the Tracker +//******************************************************************************************************* +class TrackerDll : +#if defined(OPENTRACK_API) +        public Metadata +#else +        public ITrackerDll +#endif  {  public: -	FTNoIR_TrackerDll(); -	~FTNoIR_TrackerDll(); +	TrackerDll(); +	~TrackerDll(); -    void getFullName(QString *strToBeFilled); +	void getFullName(QString *strToBeFilled);  	void getShortName(QString *strToBeFilled);  	void getDescription(QString *strToBeFilled);  	void getIcon(QIcon *icon); @@ -82,4 +135,5 @@ private:  	QString trackerDescription;  }; +  #endif // FTNOIR_TRACKER_HAT_H diff --git a/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.cpp b/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.cpp index 1fa482c7..14b6ef0d 100644 --- a/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.cpp +++ b/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.cpp @@ -1,9 +1,34 @@ +/******************************************************************************** +* FaceTrackNoIR		This program is a private project of some enthusiastic		* +*					gamers from Holland, who don't like to pay much for			* +*					head-tracking.												* +*																				* +* Copyright (C) 2012	Wim Vriend (Developing)									* +*						Ron Hendriks (Researching and Testing)					* +* Homepage:			http://facetracknoir.sourceforge.net/home/default.htm		* +*																				* +* Copyright (C) 2012	FuraX49 (HAT Tracker plugins)	    	     			* +* Homepage:			http://hatire.sourceforge.net								* +*																				* +*																				* +* This program is free software; you can redistribute it and/or modify it		* +* under the terms of the GNU General Public License as published by the			* +* Free Software Foundation; either version 3 of the License, or (at your		* +* option) any later version.													* +*																				* +* This program is distributed in the hope that it will be useful, but			* +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY	* +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for	* +* more details.																	* +*																				* +* You should have received a copy of the GNU General Public License along		* +* with this program; if not, see <http://www.gnu.org/licenses/>.				* +*																				* +********************************************************************************/  #include "ftnoir_tracker_hat.h"  #include "ftnoir_tracker_hat_dialog.h" -#include <QMessageBox> -#include <QDebug> -#include <QtSerialPort/QSerialPortInfo> +#include <QScrollBar>  //*******************************************************************************************************  // FaceTrackNoIR Client Settings-dialog. @@ -12,16 +37,22 @@  //  // Constructor for server-settings-dialog  // -TrackerControls::TrackerControls() : pre_frame(0), theTracker(NULL), settingsDirty(false), timer(this) +TrackerControls::TrackerControls() : theTracker(NULL), settingsDirty(false), timer(this)  { -	 +  	ui.setupUi( this );  	settings.load_ini(); -    foreach (QSerialPortInfo PortInfo , QSerialPortInfo::availablePorts() ) { -        ui.cbSerialPort->addItem(PortInfo.portName()); +	ui.label_version->setText(VER_FILEVERSION_STR); + +	// make SerialPort list +	ui.cbSerialPort->clear(); +	foreach (QSerialPortInfo PortInfo , QSerialPortInfo::availablePorts() ) { +		ui.cbSerialPort->addItem(PortInfo.portName());  	}  + +	// Stop if no SerialPort dispo   	if (ui.cbSerialPort->count()<1) {  		QMessageBox::critical(this,"FaceTrackNoIR Error", "No SerialPort avaible");  	} else { @@ -34,7 +65,44 @@ TrackerControls::TrackerControls() : pre_frame(0), theTracker(NULL), settingsDir  			ui.cbSerialPort-> setCurrentIndex(indxport);  		}  	} -   +	// Serial config +	ui.QCB_Serial_baudRate->clear(); +	ui.QCB_Serial_baudRate->addItem(QLatin1String("9600"),QSerialPort::Baud9600); +	ui.QCB_Serial_baudRate->addItem(QLatin1String("19200"),QSerialPort::Baud19200); +	ui.QCB_Serial_baudRate->addItem(QLatin1String("38400"),QSerialPort::Baud38400); +	ui.QCB_Serial_baudRate->addItem(QLatin1String("57600"),QSerialPort:: Baud57600); +	ui.QCB_Serial_baudRate->addItem(QLatin1String("115200"),QSerialPort::Baud115200); +	ui.QCB_Serial_baudRate->setCurrentIndex(ui.QCB_Serial_baudRate->findData(settings.pBaudRate)); + +	ui.QCB_Serial_dataBits->clear(); +	ui.QCB_Serial_dataBits->addItem(QLatin1String("5"), QSerialPort::Data5); +	ui.QCB_Serial_dataBits->addItem(QLatin1String("6"), QSerialPort::Data6); +	ui.QCB_Serial_dataBits->addItem(QLatin1String("7"), QSerialPort::Data7); +	ui.QCB_Serial_dataBits->addItem(QLatin1String("8"), QSerialPort::Data8); +	ui.QCB_Serial_dataBits->setCurrentIndex(ui.QCB_Serial_dataBits->findData(settings.pDataBits)); + +	ui.QCB_Serial_parity->clear(); +	ui.QCB_Serial_parity->addItem(QLatin1String("None"), QSerialPort::NoParity); +	ui.QCB_Serial_parity->addItem(QLatin1String("Even"), QSerialPort::EvenParity); +	ui.QCB_Serial_parity->addItem(QLatin1String("Odd"), QSerialPort::OddParity); +	ui.QCB_Serial_parity->addItem(QLatin1String("Mark"), QSerialPort::MarkParity); +	ui.QCB_Serial_parity->addItem(QLatin1String("Space"), QSerialPort::SpaceParity); +	ui.QCB_Serial_parity->setCurrentIndex(ui.QCB_Serial_parity->findData(settings.pParity)); + +	ui.QCB_Serial_stopBits->clear(); +	ui.QCB_Serial_stopBits->addItem(QLatin1String("1"), QSerialPort::OneStop); +	ui.QCB_Serial_stopBits->addItem(QLatin1String("1.5"), QSerialPort::OneAndHalfStop); +	ui.QCB_Serial_stopBits->addItem(QLatin1String("2"), QSerialPort::TwoStop); +	ui.QCB_Serial_stopBits->setCurrentIndex(ui.QCB_Serial_stopBits->findData(settings.pStopBits)); + + +	ui.QCB_Serial_flowControl->clear(); +	ui.QCB_Serial_flowControl->addItem(QLatin1String("None"), QSerialPort::NoFlowControl); +	ui.QCB_Serial_flowControl->addItem(QLatin1String("RTS/CTS"), QSerialPort::HardwareControl); +	ui.QCB_Serial_flowControl->addItem(QLatin1String("XON/XOFF"), QSerialPort::SoftwareControl); +	ui.QCB_Serial_flowControl->setCurrentIndex(ui.QCB_Serial_flowControl->findData(settings.pFlowControl)); + +  	ui.chkEnableRoll->setChecked(settings.EnableRoll);  	ui.chkEnablePitch->setChecked(settings.EnablePitch);  	ui.chkEnableYaw->setChecked(settings.EnableYaw); @@ -49,18 +117,34 @@ TrackerControls::TrackerControls() : pre_frame(0), theTracker(NULL), settingsDir  	ui.chkInvertY->setChecked(settings.InvertY);  	ui.chkInvertZ->setChecked(settings.InvertZ); -    ui.cb_roll->setCurrentIndex(settings.RollAxis); -    ui.cb_pitch->setCurrentIndex(settings.PitchAxis); -    ui.cb_yaw->setCurrentIndex(settings.YawAxis); -    ui.cb_x->setCurrentIndex(settings.XAxis); -    ui.cb_y->setCurrentIndex(settings.YAxis); -    ui.cb_z->setCurrentIndex(settings.ZAxis); + +	ui.cb_roll->setCurrentIndex(settings.RollAxe); +	ui.cb_pitch->setCurrentIndex(settings.PitchAxe); +	ui.cb_yaw->setCurrentIndex(settings.YawAxe); +	ui.cb_x->setCurrentIndex(settings.XAxe); +	ui.cb_y->setCurrentIndex(settings.YAxe); +	ui.cb_z->setCurrentIndex(settings.ZAxe); + +	ui.le_cmd_start->setText(settings.CmdStart); +	ui.le_cmd_stop->setText(settings.CmdStop); +	ui.le_cmd_init->setText(settings.CmdInit); +	ui.le_cmd_reset->setText(settings.CmdReset); +	ui.le_cmd_center->setText(settings.CmdCenter); +	ui.le_cmd_zero->setText(settings.CmdZero); + +	ui.spb_BeforeInit->setValue(settings.DelayInit); +	ui.spb_BeforeStart->setValue(settings.DelayStart); +	ui.spb_AfterStart->setValue(settings.DelaySeq); + +	ui.cb_Endian->setChecked(settings.BigEndian); +  	// Connect Qt signals to member-functions  	connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK()));  	connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel()));  	connect(ui.btnSave, SIGNAL(clicked()), this, SLOT(doSave())); +  	connect(ui.cbSerialPort,  SIGNAL(currentIndexChanged(QString)), this,SLOT(set_mod_port(QString)) );  	connect( ui.chkEnableRoll,SIGNAL(toggled(bool)),		 this,SLOT(set_ena_roll(bool)) ); @@ -84,11 +168,35 @@ TrackerControls::TrackerControls() : pre_frame(0), theTracker(NULL), settingsDir  	connect(ui.cb_y, SIGNAL(currentIndexChanged(int)),    this,SLOT(set_acc_y(int)));  	connect(ui.cb_z, SIGNAL(currentIndexChanged(int)),    this,SLOT(set_acc_z(int))); +	connect(ui.le_cmd_start, SIGNAL(textEdited (QString )),     this,SLOT(set_cmd_start(QString))); +	connect(ui.le_cmd_stop, SIGNAL(textEdited (  QString  )),   this,SLOT(set_cmd_stop(QString))); +	connect(ui.le_cmd_init, SIGNAL(textChanged (  QString  )),  this,SLOT(set_cmd_init(QString))); +	connect(ui.le_cmd_reset, SIGNAL(textChanged (  QString  )), this,SLOT(set_cmd_reset(QString))); +	connect(ui.le_cmd_center, SIGNAL(textChanged (  QString  )),this,SLOT(set_cmd_center(QString))); +	connect(ui.le_cmd_zero, SIGNAL(textChanged (  QString  )),this,SLOT(set_cmd_zero(QString))); + +	connect(ui.spb_BeforeInit, SIGNAL(valueChanged (  int  )),   this,SLOT(set_DelayInit(int))); +	connect(ui.spb_BeforeStart, SIGNAL(valueChanged (  int  )),  this,SLOT(set_DelayStart(int))); +	connect(ui.spb_AfterStart, SIGNAL(valueChanged (  int  )),   this,SLOT(set_DelaySeq(int))); + +	connect( ui.cb_Endian,SIGNAL(toggled(bool)),			 this,SLOT(set_endian(bool)) ); + + +	connect(ui.QCB_Serial_baudRate,  SIGNAL(currentIndexChanged(int)), this,SLOT(set_mod_baud(int)) ); +	connect(ui.QCB_Serial_dataBits,  SIGNAL(currentIndexChanged(int)), this,SLOT(set_mod_dataBits(int)) ); +	connect(ui.QCB_Serial_parity,  SIGNAL(currentIndexChanged(int)), this,SLOT(set_mod_parity(int)) ); +	connect(ui.QCB_Serial_stopBits,  SIGNAL(currentIndexChanged(int)), this,SLOT(set_mod_stopBits(int)) ); +	connect(ui.QCB_Serial_flowControl,  SIGNAL(currentIndexChanged(int)), this,SLOT(set_mod_flowControl(int)) ); +  	connect(ui.btnReset, SIGNAL(clicked()), this, SLOT(doReset()));  	connect(ui.btnCenter, SIGNAL(clicked()), this, SLOT(doCenter())); +	connect(ui.btnZero, SIGNAL(clicked()), this, SLOT(doZero()));  	connect(ui.btnSend, SIGNAL(clicked()), this, SLOT(doSend())); +	connect(ui.btn_icone, SIGNAL(clicked()), this, SLOT(doSerialInfo())); +  	connect(&timer,SIGNAL(timeout()), this,SLOT(poll_tracker_info())); +  }  // @@ -97,6 +205,9 @@ TrackerControls::TrackerControls() : pre_frame(0), theTracker(NULL), settingsDir  TrackerControls::~TrackerControls() {  } +// +// Initialize tracker-client-dialog +//  void TrackerControls::Initialize(QWidget *parent) {  	QPoint offsetpos(100, 100);  	if (parent) { @@ -105,72 +216,111 @@ void TrackerControls::Initialize(QWidget *parent) {  	show();  } + +// +// Apply online settings to tracker +//  void TrackerControls::settings_changed()  {  	settingsDirty = true;  	if (theTracker) theTracker->applysettings(settings);  } + +// +// Center asked to ARDUINO +//  void TrackerControls::doCenter() { -	if (theTracker) theTracker->center(); +	if (theTracker) theTracker->notifyCenter();  } +// +// Zero asked to ARDUINO +// +void TrackerControls::doZero() { +	if (theTracker) theTracker->notifyZeroed(); +} + + +// +// Reset asked to ARDUINO +//  void TrackerControls::doReset() {  	if (theTracker) theTracker->reset();  } + +// +// Serial Info debug +// +void TrackerControls::doSerialInfo() { +	if (theTracker) theTracker->SerialInfo(); +} + + +// +// Send command to ARDUINO +//  void TrackerControls::doSend() {  	if (theTracker) {  		if (!ui.lineSend->text().isEmpty()) { -			QString cmd; -			cmd=ui.lineSend->text(); -  			theTracker->sendcmd(&cmd); -			ui.lineSend->clear(); +			theTracker->sendcmd(ui.lineSend->text().toLatin1());  		}  	}  } + +// +// Display FPS  of Arduino. +//  void TrackerControls::poll_tracker_info()  {  	if (theTracker)  	{	 -		QString info; -		int num_trame;  		int nb_trame; -		theTracker->get_info(&info,&num_trame); -		if ( !info.isNull()) { -			ui.lab_vstatus->setText(info); -			ui.pteINFO->moveCursor(QTextCursor::End); -			ui.pteINFO->insertPlainText(info); -		} +		theTracker->get_info(&nb_trame); +		ui.lab_vtps->setText(QString::number(nb_trame*(1000/last_time.elapsed()))); +		last_time.restart(); +	}  +} -        if (pre_frame<num_trame) -            { nb_trame=num_trame-pre_frame;} -		else  -            {nb_trame=(1000-pre_frame)+num_trame;} -		ui.lab_vtps->setText(QString::number(nb_trame*(1000/timer.interval()))); -        pre_frame=num_trame; -	}  -	 +void TrackerControls::WriteMsgInfo(const QByteArray &MsgInfo) +{ +	QApplication::beep(); +	ui.pteINFO->moveCursor(QTextCursor::End); +	ui.pteINFO->insertPlainText(QString(MsgInfo)); +	QScrollBar *bar = ui.pteINFO->verticalScrollBar(); +	bar->setValue(bar->maximum());  } +  void TrackerControls::doSave() {  	settingsDirty=false; -    settings.save_ini(); +	settings.save_ini();  } + +// +// OK clicked on server-dialog +//  void TrackerControls::doOK() {  	settingsDirty=false; -    settings.save_ini(); +	settings.save_ini();  	this->close();  } +// +// Cancel clicked on server-dialog +//  void TrackerControls::doCancel() { -    if (settingsDirty) { +	// +	// Ask if changed Settings should be saved +	// +	if (settingsDirty) {  		int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard );  		switch (ret) {  			case QMessageBox::Save: @@ -181,8 +331,10 @@ void TrackerControls::doCancel() {  				close();  				break;  			case QMessageBox::Cancel: +				// Cancel was clicked  				break;  			default: +				// should never be reached  				break;  		}  	} @@ -193,22 +345,44 @@ void TrackerControls::doCancel() {  void TrackerControls::registerTracker(ITracker *tracker) { -    theTracker = dynamic_cast<FTNoIR_Tracker*>(tracker); +	theTracker = static_cast<FTNoIR_Tracker*>(tracker); +	connect(theTracker, SIGNAL(sendMsgInfo(QByteArray)),this , SLOT(WriteMsgInfo(QByteArray))); +  	if (isVisible() && settingsDirty) theTracker->applysettings(settings); +  	ui.cbSerialPort->setEnabled(false); -	timer.start(250); +	ui.pteINFO->clear();  	ui.lab_vstatus->setText("HAT START"); +	last_time.start(); +	timer.start(250); +  } +  void TrackerControls::unRegisterTracker() { -	theTracker = NULL; -	ui.cbSerialPort->setEnabled(true); +	theTracker=NULL;  	timer.stop(); +	ui.cbSerialPort->setEnabled(true);  	ui.lab_vstatus->setText("HAT STOPPED");  	ui.lab_vtps->setText("");  } -extern "C" FTNOIR_TRACKER_BASE_EXPORT ITrackerDialog* CALLING_CONVENTION GetDialog() + + + +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Tracker-settings dialog object. + +// Export both decorated and undecorated names. +//   GetTrackerDialog     - Undecorated name, which can be easily used with GetProcAddress +//                          Win32 API function. +//   _GetTrackerDialog@0  - Common name decoration for __stdcall functions in C language. +#ifdef OPENTRACK_API +extern "C" FTNOIR_TRACKER_BASE_EXPORT ITrackerDialog* CALLING_CONVENTION GetDialog( ) +#else +#pragma comment(linker, "/export:GetTrackerDialog=_GetTrackerDialog@0") +FTNOIR_TRACKER_BASE_EXPORT ITrackerDialogPtr __stdcall GetTrackerDialog( ) +#endif  {  	return new TrackerControls;  } diff --git a/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.h b/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.h index 25bd839c..e413ded6 100644 --- a/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.h +++ b/ftnoir_tracker_hatire/ftnoir_tracker_hat_dialog.h @@ -1,35 +1,41 @@  #ifndef FTNOIR_TRACKER_HAT_DIALOG_H  #define FTNOIR_TRACKER_HAT_DIALOG_H +#ifdef OPENTRACK_API  #include "ftnoir_tracker_base/ftnoir_tracker_base.h" +#else +#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h" +#endif  #include "ftnoir_tracker_hat_settings.h"  #include "ftnoir_tracker_hat.h"  #include "ui_ftnoir_hatcontrols.h" - +#include <QObject> +#include <QTime>  #include <QTimer>  #include <QMessageBox> +#include <QMetaType> +// Widget that has controls for FTNoIR protocol client-settings.  class TrackerControls: public QWidget, public ITrackerDialog  {      Q_OBJECT -  public:  	explicit TrackerControls(); -    virtual ~TrackerControls() virt_override; - +    virtual ~TrackerControls();      void Initialize(QWidget *parent) virt_override;      void registerTracker(ITracker *tracker) virt_override;      void unRegisterTracker() virt_override;  private:  	Ui::UIHATControls ui; -    int pre_frame;  	FTNoIR_Tracker *theTracker; +	QTime last_time; +	 +public  slots: +    void WriteMsgInfo(const QByteArray &MsgInfo);  protected slots: -    void set_mod_port(const QString & val)	 {  settings.SerialPortName =val; -	                                QMessageBox::warning(this,"FaceTrackNoIR Error", settings.SerialPortName); -	                                settings_changed(); } +	void set_mod_port(const QString & val)	 {  settings.SerialPortName =val;   settings_changed(); }  	void set_ena_roll(bool val)	 { settings.EnableRoll = val;    settings_changed(); }  	void set_ena_pitch(bool val) { settings.EnablePitch = val;   settings_changed(); }  	void set_ena_yaw(bool val)	 { settings.EnableYaw = val;     settings_changed(); } @@ -45,20 +51,41 @@ protected slots:  	void set_inv_z(bool val)	 { settings.InvertZ = val;       settings_changed(); } -    void set_rot_roll(int val)	 { settings.RollAxis = val;    settings_changed(); } -    void set_rot_pitch(int val)	 { settings.PitchAxis = val;   settings_changed(); } -    void set_rot_yaw(int val)	 { settings.YawAxis = val;     settings_changed(); } -    void set_acc_x(int val)		 { settings.XAxis = val;       settings_changed(); } -    void set_acc_y(int val)		 { settings.YAxis = val;       settings_changed(); } -    void set_acc_z(int val)		 { settings.ZAxis = val;       settings_changed(); } +	void set_rot_roll(int val)	 { settings.RollAxe = val;    settings_changed(); } +	void set_rot_pitch(int val)	 { settings.PitchAxe = val;   settings_changed(); } +	void set_rot_yaw(int val)	 { settings.YawAxe = val;     settings_changed(); } +	void set_acc_x(int val)		 { settings.XAxe = val;       settings_changed(); } +	void set_acc_y(int val)		 { settings.YAxe = val;       settings_changed(); } +	void set_acc_z(int val)		 { settings.ZAxe = val;       settings_changed(); } + +	void set_cmd_start(const QString &val)   { settings.CmdStart = val;   settings_changed(); } +	void set_cmd_stop(const QString &val)    { settings.CmdStop = val;    settings_changed(); } +	void set_cmd_init(const QString &val)    { settings.CmdInit = val;    settings_changed(); } +	void set_cmd_reset(const QString &val)   { settings.CmdReset = val;   settings_changed(); } +	void set_cmd_center(const QString &val)  { settings.CmdCenter = val;  settings_changed(); } +	void set_cmd_zero(const QString &val)  { settings.CmdZero = val;  settings_changed(); } + +	void set_DelayInit(int val)		 { settings.DelayInit = val;      settings_changed(); } +	void set_DelayStart(int val)	 { settings.DelayStart = val;     settings_changed(); } +	void set_DelaySeq(int val)		 { settings.DelaySeq = val;       settings_changed(); } + +	void set_endian(bool val)	 { settings.BigEndian = val;       settings_changed(); } + +	void set_mod_baud(int val)		  { settings.pBaudRate    = static_cast<QSerialPort::BaudRate>(ui.QCB_Serial_baudRate->itemData(val).toInt()) ;       settings_changed();   } +	void set_mod_dataBits(int val)	  { settings.pDataBits    = static_cast<QSerialPort::DataBits>(ui.QCB_Serial_dataBits->itemData(val).toInt()) ;       settings_changed();   } +	void set_mod_parity(int val)      { settings.pParity      = static_cast<QSerialPort::Parity>(ui.QCB_Serial_parity->itemData(val).toInt()) ;           settings_changed();   } +	void set_mod_stopBits(int val)    { settings.pStopBits    = static_cast<QSerialPort::StopBits>(ui.QCB_Serial_stopBits->itemData(val).toInt());        settings_changed();   } +	void set_mod_flowControl(int val) { settings.pFlowControl = static_cast<QSerialPort::FlowControl>(ui.QCB_Serial_flowControl->itemData(val).toInt()) ; settings_changed();   }  	void doOK();  	void doCancel();  	void doSave();  	void doReset();  	void doCenter(); +	void doZero();  	void doSend();  	void poll_tracker_info(); +	void doSerialInfo();  protected:  	bool settingsDirty; @@ -67,5 +94,4 @@ protected:  	QTimer timer;  }; -  #endif //FTNOIR_TRACKER_HAT_DIALOG_H diff --git a/ftnoir_tracker_hatire/ftnoir_tracker_hat_dll.cpp b/ftnoir_tracker_hatire/ftnoir_tracker_hat_dll.cpp index cd1475f8..5f82d5a0 100644 --- a/ftnoir_tracker_hatire/ftnoir_tracker_hat_dll.cpp +++ b/ftnoir_tracker_hatire/ftnoir_tracker_hat_dll.cpp @@ -1,38 +1,81 @@ +/******************************************************************************** +* FaceTrackNoIR		This program is a private project of some enthusiastic		* +*					gamers from Holland, who don't like to pay much for			* +*					head-tracking.												* +*																				* +* Copyright (C) 2012	Wim Vriend (Developing)									* +*						Ron Hendriks (Researching and Testing)					* +* Homepage:			http://facetracknoir.sourceforge.net/home/default.htm		* +*																				* +* Copyright (C) 2012	FuraX49 (HAT Tracker plugins)	    	     			* +* Homepage:			http://hatire.sourceforge.net								* +*																				* +* This program is free software; you can redistribute it and/or modify it		* +* under the terms of the GNU General Public License as published by the			* +* Free Software Foundation; either version 3 of the License, or (at your		* +* option) any later version.													* +*																				* +* This program is distributed in the hope that it will be useful, but			* +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY	* +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for	* +* more details.																	* +*																				* +* You should have received a copy of the GNU General Public License along		* +* with this program; if not, see <http://www.gnu.org/licenses/>.				* +*																				* +********************************************************************************/ +  #include "ftnoir_tracker_hat.h"  #include <QIcon>  #include <QDebug> -FTNoIR_TrackerDll::FTNoIR_TrackerDll() { +TrackerDll::TrackerDll() { +	//populate the description strings      trackerFullName = "Hatire Arduino";  	trackerShortName = "HAT"; -    trackerDescription = "Hatire Arduino"; +	trackerDescription = "FaceTrackNoIR HAT";  } -FTNoIR_TrackerDll::~FTNoIR_TrackerDll() +TrackerDll::~TrackerDll()  { +  } -void FTNoIR_TrackerDll::getFullName(QString *strToBeFilled) +void TrackerDll::getFullName(QString *strToBeFilled)  {  	*strToBeFilled = trackerFullName;  } -void FTNoIR_TrackerDll::getShortName(QString *strToBeFilled) +void TrackerDll::getShortName(QString *strToBeFilled)  {  	*strToBeFilled = trackerShortName;  } -void FTNoIR_TrackerDll::getDescription(QString *strToBeFilled) +void TrackerDll::getDescription(QString *strToBeFilled)  {  	*strToBeFilled = trackerDescription;  } -void FTNoIR_TrackerDll::getIcon(QIcon *icon) +void TrackerDll::getIcon(QIcon *icon)  {      *icon = QIcon(":/images/hat.png");  } +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Tracker object. + +// Export both decorated and undecorated names. +//   GetTrackerDll     - Undecorated name, which can be easily used with GetProcAddress +//						Win32 API function. +//   _GetTrackerDll@0  - Common name decoration for __stdcall functions in C language. + +#ifdef OPENTRACK_API +#   include "facetracknoir/global-settings.h"  extern "C" FTNOIR_TRACKER_BASE_EXPORT Metadata* CALLING_CONVENTION GetMetadata() +#else +#   pragma comment(linker, "/export:GetTrackerDll=_GetTrackerDll@0") +FTNOIR_TRACKER_BASE_EXPORT ITrackerDllPtr __stdcall GetTrackerDll() +#endif  { -	return new FTNoIR_TrackerDll; +	return new TrackerDll;  } diff --git a/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.cpp b/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.cpp index a9466304..0be912f2 100644 --- a/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.cpp +++ b/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.cpp @@ -1,12 +1,38 @@ +/******************************************************************************** +* FaceTrackNoIR		This program is a private project of some enthusiastic		* +*					gamers from Holland, who don't like to pay much for			* +*					head-tracking.												* +*																				* +* Copyright (C) 2012	Wim Vriend (Developing)									* +*						Ron Hendriks (Researching and Testing)					* +* Homepage:			http://facetracknoir.sourceforge.net/home/default.htm		* +*																				* +* Copyright (C) 2012	FuraX49 (HAT Tracker plugins)	    	     			* +* Homepage:			http://hatire.sourceforge.net								* +*																				* +* This program is free software; you can redistribute it and/or modify it		* +* under the terms of the GNU General Public License as published by the			* +* Free Software Foundation; either version 3 of the License, or (at your		* +* option) any later version.													* +*																				* +* This program is distributed in the hope that it will be useful, but			* +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY	* +* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for	* +* more details.																	* +*																				* +* You should have received a copy of the GNU General Public License along		* +* with this program; if not, see <http://www.gnu.org/licenses/>.				* +*																				* +********************************************************************************/  #include <QCoreApplication>  #include <QSettings> +#include <QVariant>  #include "ftnoir_tracker_hat_settings.h"  void TrackerSettings::load_ini()  { -	qDebug("TrackerSettings::load_ini()"); -    QSettings settings("opentrack"); +    QSettings settings("opentrack");	// Registry settings (in HK_USER)  	QString currentFile = settings.value( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();  	QSettings iniFile( currentFile, QSettings::IniFormat );		// Application settings (in INI-file) @@ -30,12 +56,33 @@ void TrackerSettings::load_ini()  	InvertZ = iniFile.value( "InvertZ", 0 ).toBool(); -    RollAxis=iniFile.value("RollAxis",1).toInt(); -    PitchAxis=iniFile.value("PitchAxis",2).toInt(); -    YawAxis=iniFile.value("YawAxis",0).toInt(); -    XAxis=iniFile.value("XAxis",1).toInt(); -    YAxis=iniFile.value("YAxis",2).toInt(); -    ZAxis=iniFile.value("ZAxis",0).toInt(); +	RollAxe=iniFile.value("RollAxe",1).toInt(); +	PitchAxe=iniFile.value("PitchAxe",2).toInt(); +	YawAxe=iniFile.value("YawAxe",0).toInt(); +	XAxe=iniFile.value("XAxe",1).toInt(); +	YAxe=iniFile.value("YAxe",2).toInt(); +	ZAxe=iniFile.value("ZAxe",0).toInt(); + + +    CmdStart=iniFile.value ( "CmdStart").toString(); +    CmdStop=iniFile.value ( "CmdStop" ).toString(); +    CmdInit=iniFile.value ( "CmdInit" ).toString(); +    CmdReset=iniFile.value ( "CmdReset" ).toString(); +    CmdCenter=iniFile.value ( "CmdCenter" ).toString(); +    CmdZero=iniFile.value ( "CmdZero" ).toString(); + +	DelayInit=iniFile.value("DelayInit",0).toInt(); +	DelayStart=iniFile.value("DelayStart",0).toInt(); +	DelaySeq=iniFile.value("DelaySeq",0).toInt(); + +	BigEndian=iniFile.value("BigEndian",0).toBool(); + + +	pBaudRate=static_cast<QSerialPort::BaudRate>(iniFile.value("BaudRate",QSerialPort::Baud115200).toInt()); +	pDataBits=static_cast<QSerialPort::DataBits>(iniFile.value("DataBits",QSerialPort::Data8).toInt()); +	pParity=static_cast<QSerialPort::Parity>(iniFile.value("Parity",QSerialPort::NoParity).toInt()); +	pStopBits=static_cast<QSerialPort::StopBits>(iniFile.value("StopBits",QSerialPort::OneStop).toInt()); +	pFlowControl=static_cast<QSerialPort::FlowControl>(iniFile.value("FlowControl",QSerialPort::HardwareControl).toInt());  	iniFile.endGroup();  } @@ -43,9 +90,8 @@ void TrackerSettings::load_ini()  void TrackerSettings::save_ini() const  { -	qDebug("TrackerSettings::save_ini()"); -    QSettings settings("opentrack"); +    QSettings settings("opentrack");	// Registry settings (in HK_USER)  	QString currentFile = settings.value( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();  	QSettings iniFile( currentFile, QSettings::IniFormat );		// Application settings (in INI-file) @@ -67,12 +113,33 @@ void TrackerSettings::save_ini() const  	iniFile.setValue( "InvertY", InvertY );  	iniFile.setValue( "InvertZ", InvertZ ); -    iniFile.setValue ( "RollAxis", RollAxis ); -    iniFile.setValue ( "PitchAxis", PitchAxis ); -    iniFile.setValue ( "YawAxis",YawAxis ); -    iniFile.setValue ( "XAxis", XAxis ); -    iniFile.setValue ( "YAxis", YAxis ); -    iniFile.setValue ( "ZAxis", ZAxis ); +	iniFile.setValue ( "RollAxe", RollAxe ); +	iniFile.setValue ( "PitchAxe", PitchAxe ); +	iniFile.setValue ( "YawAxe",YawAxe ); +	iniFile.setValue ( "XAxe", XAxe ); +	iniFile.setValue ( "YAxe", YAxe ); +	iniFile.setValue ( "ZAxe", ZAxe ); + +	iniFile.setValue ( "CmdStart",CmdStart.toLatin1()); +	iniFile.setValue ( "CmdStop",CmdStop.toLatin1()); +	iniFile.setValue ( "CmdInit",CmdInit.toLatin1()); +	iniFile.setValue ( "CmdReset",CmdReset.toLatin1()); +	iniFile.setValue ( "CmdCenter",CmdCenter.toLatin1() ); +	iniFile.setValue ( "CmdZero",CmdZero.toLatin1() ); + +	iniFile.setValue ( "DelayInit",DelayInit); +	iniFile.setValue ( "DelayStart",DelayStart); +	iniFile.setValue ( "DelaySeq",DelaySeq); + +	iniFile.setValue("BigEndian",BigEndian); + +	iniFile.setValue("BaudRate",pBaudRate); +	iniFile.setValue("DataBits",pDataBits); +	iniFile.setValue("Parity",pParity); +	iniFile.setValue("StopBits",pStopBits); +	iniFile.setValue("FlowControl",pFlowControl); +  	iniFile.endGroup();  } + diff --git a/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.h b/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.h index d6cf4fd9..2e84bde8 100644 --- a/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.h +++ b/ftnoir_tracker_hatire/ftnoir_tracker_hat_settings.h @@ -8,13 +8,15 @@  #ifndef FTNOIR_TRACKER_HAT_SETTINGS_H  #define FTNOIR_TRACKER_HAT_SETTINGS_H -#include <QString> +#include <QtSerialPort/QSerialPort>  //-----------------------------------------------------------------------------  struct TrackerSettings  {	 -	QString SerialPortName; +	void load_ini(); +	void save_ini() const; +  	bool EnableRoll;  	bool EnablePitch;  	bool EnableYaw; @@ -30,15 +32,34 @@ struct TrackerSettings  	bool InvertZ; -    int RollAxis; -    int PitchAxis; -    int YawAxis; -    int XAxis; -    int YAxis; -    int ZAxis; +	int RollAxe; +	int PitchAxe; +	int YawAxe; +	int XAxe; +	int YAxe; +	int ZAxe; + +	QString  CmdStart; +	QString  CmdStop; +	QString  CmdInit; +	QString  CmdReset; +	QString  CmdCenter; +	QString  CmdZero; + +	int DelayInit; +	int DelayStart; +	int DelaySeq; + +	bool BigEndian; + +	QString SerialPortName; +	QSerialPort::BaudRate pBaudRate; +	QSerialPort::DataBits pDataBits; +	QSerialPort::Parity pParity; +	QSerialPort::StopBits pStopBits; +	QSerialPort::FlowControl pFlowControl; -	void load_ini(); -	void save_ini() const;  }; -#endif //FTNOIR_TRACKER_HAT_SETTINGS_H + +#endif //FTNOIR_TRACKER_HAT_SETTINGS_H
\ No newline at end of file | 
