gForce SDK Manual
Functions to Get Data
SDK Type | Orientation Data | Gesture Data | Device Status | Other Data* | Data Config Function |
---|---|---|---|---|---|
gForceCXX | onOrientationData(...)** | onGestureData(...)** | onDeviceStatusChanged(...)** | onExtendedDeviceData(...)** | DeviceSetting::setDataNotifSwitch(...) |
gForceCSharp | onOrientationData(...)** | onGestureData(...)** | onDeviceStatusChanged(...)** | onExtendedDeviceData(...)** | setNotification(...) |
gForceUnity | onOrientationData(...)** | onGestureData(...)** | onDeviceStatusChanged(...)** | onExtendedDeviceData(...)** | setNotification(...) |
gForcePython | Callback of GF.startDataNotification(...) | Callback of GF.startDataNotification(...) | Callback of GF.startDataNotification(...) | Callback of GF.startDataNotification(...) | GF.setDataNotifSwitch(...) |
gForceArduino | GForceAdapter::GetGForceData(...) | GForceAdapter::GetGForceData(...) | GForceAdapter::GetGForceData(...) | GForceAdapter::GetGForceData(...)*** | NA |
gForceEmbedded | GForceAdapter::GetGForceData(...) | GForceAdapter::GetGForceData(...) | GForceAdapter::GetGForceData(...) | GForceAdapter::GetGForceData(...)*** | NA |
Note:
* : Includes 10 data types
** : In subclass of HubListener
*** : Only EMG data supported.
Data Format in Callback
Callback will be invoked (e.g., onExtendedDeviceData(...)
in subclass of HubListener or user callback of GF.startDataNotification(...)
) when desired data notification comes.
Data format:
Notification Data Type | Data Packet Length | First Byte Value | Data Content* | Comment |
---|---|---|---|---|
Acceletor | 13 | 0x01 (NTF_ACC_DATA) | Acceletor_X(4 Byte long), Acceletor_Y, Acceletor_Z | Accelerate speed of axis x,y and z in q15 format. Devide it by 65536.0f to get real float value. |
Gyroscope | 13 | 0x02 (NTF_GYRO_DATA) | Gyroscope_X(4 Byte long), Gyroscope_Y, Gyroscope_Z | Gyro of axis x,y and z in q15 format. Devide it by 65536.0f to get real float value. |
Magnetometer | 13 | 0x03 (NTF_MAG_DATA) | Gyroscope_X(4 Byte long), Compass_Y, Compass_Z | Magneto data of axis x,y and z in q15 format. Devide it by 65536.0f to get real float value. |
Euler Angle | 13 | 0x04 (NTF_EULER_DATA) | Pitch(4 Byte float), Roll, Yaw | Euler angle data is in degree. Pitch and Yaw is in the range of [-180, 180], Roll is in the range of [-90, 90] |
Quaternion | 17 | 0x05 (NTF_QUAT_FLOAT_DATA) | Quaternion_W(4 Byte float), Quaternion_X, Quaternion_Y, Quaternion_Z | |
Rotation Matrix | 37 | 0x06 (NTF_ROTA_DATA) | Rot[0][0], Rot[0][1], Rot[0][2], Rot[1][0],... | 3*3 Rotation matrix of data type long, leading 3 4-bytes integer represent the first row of matrix and so on |
Gesture | 3 | 0x07 (NTF_EMG_GEST_DATA) | Gesture identify(1 Byte uint), Probability(1 Byte uint) | Possibility is in the range of [0, 100] |
Raw EMG | 129 | 0x08 (NTF_EMG_ADC_DATA) | CH0,CH1...CH7, CH0,CH1...CH7, ... | Packet length depends on config of EMG, defalut 129. If resolution set to 8, 1 byte represents data of 1 channel. 2 bytes for 1 channel incase of resolution=12. |
Mouse | NA | 0x09 (NTF_HID_MOUSE) | NA | Not currently supported |
Joystick | NA | 0x0A (NTF_HID_JOYSTICK) | NA | Not currently supported |
Device Status | 2 | 0x0B (NTF_DEV_STATUS) | bit0 is for Recenter status, bit1 is for USB insert, bit2 is for USB unplug, bit3 is for motionless status; bit4 - bit7 is reserved | 1 Byte for new device status |
Log Message | >= 1 | 0x0C (NTF_LOG_DATA) | log message string |
* : Starts from second byte of data packet.
Examples For Getting Data from gForce
Get EMG raw data examples
C++
1. Implement HubListener
interface
class HubListenerImpl : public HubListener{...}
2. Config EMG data
Call DeviceSetting::setEMGRawDataConfig(...);
to configure Emg. First parameter is sample Rate in Hz, second parameter is channel Mask, third parameter is package data length, fourth parameter is Adc resolution, Fifth parameter is callback function.
3. Open ACC Data Notification
Call DeviceSetting::setDataNotifySwitch(...)
to open EMG raw. Set first parameter as DeviceSetting::DNF_EMG_RAW
4. Extract the data of EMG, etc.
void onExtendedDeviceData(SPDEVICE device, DeviceDataType dataType, gfsPtr<const vector<GF_UINT8>> data) override
{
auto ptr = data->data();
switch (dataType) {
case DeviceDataType::DDT_EMGRAW:
for (size_t i = 0; i < data->size(); i++)
{
//for 8bpp mode
printf("Emg data [%d] = %u\n", i, *(reinterpret_cast<const uint8_t*>(ptr++)));
//for 12bpp mode
// printf("Emg data [%d] = %u\n", i, *(reinterpret_cast<const uint16_t*>(ptr)));
// ptr += 2;
}
break;
case DeviceDataType::DDT_GYROSCOPE:
//... extract gyroscope data form 'data'
break;
default:
break;
}
}
Python
DATA_LEN = 128
def ondata(data):
if data[0] == NotifDataType['NTF_EMG_ADC_DATA'] and len(data) == DATA_LEN + 1:
# Data for EMG CH0~CHn repeatly.
# Resolution set in setEmgRawDataConfig:
# 8: one byte for one channel
# 12: two bytes in LSB for one channel.
# eg. 8bpp mode, data[1] = channel[0], data[2] = channel[1], ... data[8] = channel[7]
# data[9] = channel[0] and so on
# eg. 12bpp mode, {data[2], data[1]} = channel[0], {data[4], data[3]} = channel[1] and so on
for i in range(1, DATA_LEN):
print(data[i])
def set_cmd_cb(resp):
print('Command result: {}'.format(resp))
GF = GForceProfile()
GF.setEmgRawDataConfig(sampRate = 650, channelMask = 0xFF, dataLen = DATA_LEN, resolution = 8, cb = set_cmd_cb, timeout = 1000)
GF.setDataNotifSwitch(DataNotifFlags['DNF_EMG_RAW'], set_cmd_cb, timeout = 1000)
GF.startDataNotification(ondata)
button = input()
if len(button) != 0:
GF.stopDataNotification()
GF.setDataNotifSwitch(DataNotifFlags['DNF_OFF'], set_cmd_cb, timeout = 1000)
CSharp
1. Call setEmgConfig(...) configure EMG data
setEmgConfig(650/*sampleRateHz*/, 0x00FF/*interestedChannels*/, 128/*packageDataLength*/, 8/*adcResolution*/);
2. Call setNotification(...) open EMG raw
setNotification((uint)DataNotifFlags.DNF_EMG_RAW);
3. print the data of EMG raw
public override void onExtendedDeviceData(Device device, Device.DataType type, byte[] data)
{
if (device == gForceHub_.connectedDevice_ && type == Emgraw)
{
System.Console.Write("Emg data len: {0}, data:" , data.Length);
var sb = new StringBuilder("{");
foreach (var b in data)
{
sb.Append(b + ",");
}
sb.Remove(sb.Length - 1, 1);
sb.Append("}");
System.Console.WriteLine(sb.ToString());
}
}
Note: Data transfers should be off when configuring data types and starting/stoping data notification.