Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@1:0c3b6cc480b6, 2017-02-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |