Ries Twisk / Mbed 2 deprecated JoyStick

Dependencies:   USBDevice mbed-rtos mbed

Fork of JoyStick by Ries Twisk

Revision:
0:33bc88c4ab31
Child:
1:5b2ab44eb31f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Aug 28 02:33:03 2013 +0000
@@ -0,0 +1,158 @@
+#include "mbed.h"
+#include "USBHID.h"
+#include "USBJoystick.h"
+#include "MovingAverage.h"
+#include "LowPassFilter.h"
+#include "AntiLog.h"
+#include "AnalogInFiltered.h"
+#include "rtos.h"
+
+
+#define TTY_DEBUG
+
+// Value that defines when to start sending data this prevents the noise sending loads's of data over HID
+#define DATA_CHANGE_TRIGGER 64
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+// Activity led for HID data transmissions
+DigitalOut HIDActivity(LED3);
+
+//This report will contain data to be sent
+HID_REPORT send_report;
+HID_REPORT recv_report;
+
+//USBJoyStick;
+USBJoystick joystick;
+
+// Structure that hold's the dataset of the input's
+Mutex analogValueMutex;
+struct AnalogData {
+    long value1;
+    long value2;
+    long value3;
+    long value4;
+    long value5;
+} analogData;
+
+void debug_thread(void const *args)
+{
+    while (true) {
+        // Make a local copy
+        AnalogData localCopy;
+        AnalogData previous;
+        analogValueMutex.lock();
+        memcpy (&localCopy, &analogData, sizeof(AnalogData));
+        analogValueMutex.unlock();
+
+        // Send to USB
+        pc.printf("\x1B[0;0H");
+        pc.printf("Yoke and Pedals!\n\r");
+        pc.printf("Analog in p20: %d  diff: %d    \n\r",localCopy.value1,localCopy.value1-previous.value1);
+        pc.printf("Analog in p19: %d  diff: %d    \n\r",localCopy.value2,localCopy.value2-previous.value2);
+        pc.printf("Analog in p18: %d  diff: %d    \n\r",localCopy.value3,localCopy.value3-previous.value3);
+        pc.printf("Analog in p17: %d  diff: %d    \n\r",localCopy.value4,localCopy.value4-previous.value4);
+        pc.printf("Analog in p16: %d  diff: %d    \n\r",localCopy.value5,localCopy.value5-previous.value5);
+        
+        memcpy (&previous, &localCopy, sizeof(AnalogData));
+
+
+        Thread::wait(1000);
+    }
+}
+
+void hid_thread(void const *args)
+{
+    while (true) {
+
+        // TODO read buttons
+        uint8_t buttons=0;
+        uint8_t hat=0;
+        AnalogData localCopy;
+
+        // Wait for analog in to have some data
+        Thread::signal_wait(0x1);
+
+        // Make a local copy of the data
+        analogValueMutex.lock();
+        memcpy (&localCopy, &analogData, sizeof(AnalogData));
+        analogValueMutex.unlock();
+
+        // Update joystick's info
+        joystick.update(
+            localCopy.value2,
+            localCopy.value3,
+            localCopy.value4,
+            localCopy.value5,
+            buttons,
+            hat);
+
+        HIDActivity=!HIDActivity;
+
+        // Wait 50 ms to send a other USB update
+        Thread::wait(50);
+    }
+}
+
+
+
+int main()
+{
+    analogData.value1=0;
+    analogData.value2=0;
+    analogData.value3=0;
+    analogData.value4=0;
+    analogData.value5=0;
+
+#ifdef TTY_DEBUG
+    Thread _debugThread(debug_thread);
+#endif
+    Thread _hid_thread(hid_thread);
+
+    // Initialise moving average filters
+    LowPassFilter lowPassFilter1(new AntiLog(new AnalogFilterInterface(),-5.0),0.95f);   // The close the alpha value is to 1, the lower the cut-off frequency
+    LowPassFilter lowPassFilter2(new AntiLog(new AnalogFilterInterface(),-5.0),0.95f);
+    LowPassFilter lowPassFilter3(new AntiLog(new AnalogFilterInterface(),-5.0),0.95f);
+    LowPassFilter lowPassFilter4(new AntiLog(new AnalogFilterInterface(),-5.0),0.95f);
+    LowPassFilter lowPassFilter5(new AntiLog(new AnalogFilterInterface(),-5.0),0.95f);
+
+    // Initialise analog input and tell it what fulters to use
+    AnalogInFiltered ai1(&lowPassFilter1, p20);
+    AnalogInFiltered ai2(&lowPassFilter2, p19);
+    AnalogInFiltered ai3(&lowPassFilter3, p18);
+    AnalogInFiltered ai4(&lowPassFilter4, p17);
+    AnalogInFiltered ai5(&lowPassFilter5, p16);
+
+    while (true) {
+        // Measure analog in's
+        ai1.measure();
+        ai2.measure();
+        ai3.measure();
+        ai4.measure();
+        ai5.measure();
+
+        // test of any of the values have been changed, so we only update when data was actually changed
+        if (
+                false
+                || ai1.getIsChanged(DATA_CHANGE_TRIGGER) // Value of 4 seems to wobble a bit, 8 is good
+                || ai2.getIsChanged(DATA_CHANGE_TRIGGER)
+                || ai3.getIsChanged(DATA_CHANGE_TRIGGER)
+                || ai4.getIsChanged(DATA_CHANGE_TRIGGER)
+//                || ai5.getIsChanged(8)
+           ) {
+            // Copy analog data to global data
+            analogValueMutex.lock();
+            analogData.value1 = ai1.getValue();
+            analogData.value2 = ai2.getValue();
+            analogData.value3 = ai3.getValue();
+            analogData.value4 = ai4.getValue();
+            analogData.value5 = ai5.getValue();
+            analogValueMutex.unlock();
+
+            // Signal that data has been changed
+            _hid_thread.signal_set(0x1);
+        }
+        Thread::wait(1);
+    }
+}
+