using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace SketchAssistantWPF
{
///
/// interface providing access to the vibrotactile armband
/// accessing the BodyActuator.dll C library via the StaticLibMotors.dll c++ library
///
public static class LocalArmbandInterface
{
///
/// constant to set the vibration mode:
/// 0 -> no vibration
/// 1 -> intensity 0.33
/// 2 -> intensity 0.66
/// 3 -> intensity 1.0
///
static readonly int VIBRATION_MODE = 2;
///
/// initializes the armband (and binds the C dll)
/// must be called before calling any other of the methods of this class
/// explicitly allocates memory and therefore must only be called once and must be followed by a call to DestroyArmband eventually
///
/// an integer purely for debugging purposes, -1 means no unexpected behaviour occured and the initialization was successful
[DllImport (@"../Debug/StaticLibMotors.dll", EntryPoint = "?setupArmband@ArmbandInterface@@QAAHXZ",
CallingConvention = CallingConvention.Cdecl)]
public static extern int SetupArmband();
///
/// destroys the armband instance created by SetupArmband (thus freeing its allocated memory)
///
///
[DllImport(@"../Debug/StaticLibMotors.dll", EntryPoint = "?destroyArmband@ArmbandInterface@@QAAHXZ",
CallingConvention = CallingConvention.Cdecl)]
public static extern int DestroyArmband();
///
/// starts actuation of the specified tactor (motor) at the specified intensity (until it is stopped)
///
/// integer from 0 to 7 specifying the number of the tactor to actuate
/// intensity, ranging from 0.0 to 1.0 by default
[DllImport(@"../Debug/StaticLibMotors.dll", EntryPoint = "?startVibrate@ArmbandInterface@@QAAXHM@Z",
CallingConvention = CallingConvention.Cdecl)]
public static extern void StartVibrate(int motorNumber, double intensity);
///
/// stop actuation of the specified tactor (motor)
///
/// integer from 0 to 7 specifying the number of the tactor to stop
[DllImport(@"../Debug/StaticLibMotors.dll", EntryPoint = "?stopVibrate@ArmbandInterface@@QAAXH@Z",
CallingConvention = CallingConvention.Cdecl)]
public static extern void StopVibration(int motorNumber);
///
/// starts actuation of the specified tactor (motor) at 0.33 for a specified amount of time
///
/// integer from 0 to 7 specifying the number of the tactor to actuate
/// intensity, ranging from 0.0 to 1.0 by default
/// number of millisecons to actuate the tactor for
[DllImport(@"../Debug/StaticLibMotors.dll", EntryPoint = "?actuate33@ArmbandInterface@@QAAXHNH@Z",
CallingConvention = CallingConvention.Cdecl)]
private static extern void Actuate33(int tactor, double intensity, int duration);
///
/// starts actuation of the specified tactor (motor) at intensity 0.66 for a specified amount of time
///
/// integer from 0 to 7 specifying the number of the tactor to actuate
/// intensity, ranging from 0.0 to 1.0 by default
/// number of millisecons to actuate the tactor for
[DllImport(@"../Debug/StaticLibMotors.dll", EntryPoint = "?actuate66@ArmbandInterface@@QAAXHNH@Z",
CallingConvention = CallingConvention.Cdecl)]
private static extern void Actuate66(int tactor, double intensity, int duration);
///
/// starts actuation of the specified tactor (motor) at intensity 1.0 for a specified amount of time
///
/// integer from 0 to 7 specifying the number of the tactor to actuate
/// intensity, ranging from 0.0 to 1.0 by default
/// number of millisecons to actuate the tactor for
[DllImport(@"../Debug/StaticLibMotors.dll", EntryPoint = "?actuate100@ArmbandInterface@@QAAXHNH@Z",
CallingConvention = CallingConvention.Cdecl)]
private static extern void Actuate100(int tactor, double intensity, int duration);
///
/// starts actuation of the specified tactor (motor) at the specified intensity (specified in VIBRATION_MODE) for a specified amount of time
///
/// integer from 0 to 7 specifying the number of the tactor to actuate
/// intensity, ranging from 0.0 to 1.0 by default
/// number of millisecons to actuate the tactor for
public static void Actuate(int tactor, double intensity, int duration)
{
switch (VIBRATION_MODE)
{
case 0:
break;
case 1:
Actuate33(tactor, intensity, duration);
break;
case 2:
Actuate66(tactor, intensity, duration);
break;
case 3:
Actuate100(tactor, intensity, duration);
break;
default:
Console.WriteLine("Error: invalid value for VIBRATION_MODE constant");
break;
}
}
}
}