Tim H / Mbed OS UsbKnob

Dependencies:   USBDevice

Committer:
Timmmm
Date:
Mon Feb 13 14:56:00 2017 +0000
Revision:
1:0c3b6cc480b6
Parent:
0:1a3aa2e25db9
Various changes?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Timmmm 0:1a3aa2e25db9 1 #include <mbed.h>
Timmmm 0:1a3aa2e25db9 2
Timmmm 0:1a3aa2e25db9 3 #include "USBControl.h"
Timmmm 0:1a3aa2e25db9 4
Timmmm 0:1a3aa2e25db9 5 #define VENDOR_ID 0x0004
Timmmm 0:1a3aa2e25db9 6 #define PRODUCT_ID 0x0307
Timmmm 0:1a3aa2e25db9 7 #define PRODUCT_RELEASE 0x0001
Timmmm 0:1a3aa2e25db9 8 #define PRODUCT_NAME "Knob"
Timmmm 0:1a3aa2e25db9 9 #define MANUFACTURER_NAME "Me"
Timmmm 0:1a3aa2e25db9 10 #define WINUSB_GUID "{a451588c-7230-4076-8456-9e544165e90c}"
Timmmm 0:1a3aa2e25db9 11
Timmmm 0:1a3aa2e25db9 12 class USBKnob : public USBControl
Timmmm 0:1a3aa2e25db9 13 {
Timmmm 0:1a3aa2e25db9 14 public:
Timmmm 0:1a3aa2e25db9 15 USBKnob() : USBControl(VENDOR_ID, PRODUCT_ID, PRODUCT_RELEASE, PRODUCT_NAME, MANUFACTURER_NAME, WINUSB_GUID)
Timmmm 0:1a3aa2e25db9 16 {
Timmmm 0:1a3aa2e25db9 17 }
Timmmm 0:1a3aa2e25db9 18
Timmmm 0:1a3aa2e25db9 19 void send(uint32_t fraction)
Timmmm 0:1a3aa2e25db9 20 {
Timmmm 0:1a3aa2e25db9 21 sendData(reinterpret_cast<uint8_t*>(&fraction), sizeof(fraction));
Timmmm 0:1a3aa2e25db9 22 }
Timmmm 0:1a3aa2e25db9 23 };
Timmmm 0:1a3aa2e25db9 24
Timmmm 1:0c3b6cc480b6 25
Timmmm 1:0c3b6cc480b6 26 //DigitalOut red(LED_RED);
Timmmm 1:0c3b6cc480b6 27 //DigitalOut green(LED_GREEN);
Timmmm 1:0c3b6cc480b6 28 //DigitalOut blue(LED_BLUE);
Timmmm 1:0c3b6cc480b6 29
Timmmm 1:0c3b6cc480b6 30 AnalogIn knob(PTC2);
Timmmm 0:1a3aa2e25db9 31
Timmmm 1:0c3b6cc480b6 32 // ReadKnob reads the knob until the value is sufficiently
Timmmm 1:0c3b6cc480b6 33 // changed from the previousValue. The longer time goes on the
Timmmm 1:0c3b6cc480b6 34 // more the difference has to be (up to a point).
Timmmm 1:0c3b6cc480b6 35 //
Timmmm 1:0c3b6cc480b6 36 // Values are 16 bit.
Timmmm 1:0c3b6cc480b6 37 int ReadKnob(int previousValue)
Timmmm 1:0c3b6cc480b6 38 {
Timmmm 1:0c3b6cc480b6 39 int centiseconds = 0;
Timmmm 1:0c3b6cc480b6 40
Timmmm 1:0c3b6cc480b6 41 for (;;)
Timmmm 1:0c3b6cc480b6 42 {
Timmmm 1:0c3b6cc480b6 43 int val = knob.read_u16();
Timmmm 1:0c3b6cc480b6 44
Timmmm 1:0c3b6cc480b6 45 int difference = abs(val - previousValue);
Timmmm 1:0c3b6cc480b6 46
Timmmm 1:0c3b6cc480b6 47 // TODO: Check these.
Timmmm 1:0c3b6cc480b6 48 if (centiseconds < 10 && difference > 100)
Timmmm 1:0c3b6cc480b6 49 return val;
Timmmm 1:0c3b6cc480b6 50 else if (difference > 1000)
Timmmm 1:0c3b6cc480b6 51 return val;
Timmmm 1:0c3b6cc480b6 52
Timmmm 1:0c3b6cc480b6 53 Thread::wait(10);
Timmmm 1:0c3b6cc480b6 54 if (centiseconds < 1000)
Timmmm 1:0c3b6cc480b6 55 ++centiseconds;
Timmmm 1:0c3b6cc480b6 56 }
Timmmm 1:0c3b6cc480b6 57 }
Timmmm 0:1a3aa2e25db9 58
Timmmm 0:1a3aa2e25db9 59 int main(int argc, char* argv[])
Timmmm 0:1a3aa2e25db9 60 {
Timmmm 1:0c3b6cc480b6 61 // So, for some reason this doesn't work with mBed OS 5.
Timmmm 1:0c3b6cc480b6 62
Timmmm 1:0c3b6cc480b6 63 USBKnob usb;
Timmmm 0:1a3aa2e25db9 64
Timmmm 0:1a3aa2e25db9 65 usb.connect();
Timmmm 0:1a3aa2e25db9 66
Timmmm 1:0c3b6cc480b6 67 // We'll use a time-dependent threshold. Basically we take the time
Timmmm 1:0c3b6cc480b6 68 // since we sent the last value, and then plug it into some kind of
Timmmm 1:0c3b6cc480b6 69 // curve to give a threshold. Then we compare the current value to
Timmmm 1:0c3b6cc480b6 70 // the previous value, and if the difference is greater than the threshold
Timmmm 1:0c3b6cc480b6 71 // we send it.
Timmmm 1:0c3b6cc480b6 72
Timmmm 1:0c3b6cc480b6 73 const int THRESHOLD = 0x0100; // 1/256
Timmmm 1:0c3b6cc480b6 74
Timmmm 1:0c3b6cc480b6 75 int val = knob.read_u16();
Timmmm 1:0c3b6cc480b6 76
Timmmm 0:1a3aa2e25db9 77 for (;;)
Timmmm 0:1a3aa2e25db9 78 {
Timmmm 1:0c3b6cc480b6 79 val = ReadKnob(val);
Timmmm 1:0c3b6cc480b6 80 usb.send(static_cast<uint32_t>(val) << 16);
Timmmm 0:1a3aa2e25db9 81 }
Timmmm 0:1a3aa2e25db9 82 return 0;
Timmmm 0:1a3aa2e25db9 83 }