Phil COVAL
/
rzr-example-mbed
Demo example on FRDM-64F https://ide.mbed.com/compiler/#nav:/rzr-example-mbed;
main.cpp@3:807a69c34b8b, 2022-03-16 (annotated)
- Committer:
- rzrfreefr
- Date:
- Wed Mar 16 14:41:31 2022 +0000
- Revision:
- 3:807a69c34b8b
- Parent:
- 2:15bfd52937dc
Publish
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rzrfreefr | 2:15bfd52937dc | 1 | /// SPDX-License-Indentifier: ISC |
rzrfreefr | 3:807a69c34b8b | 2 | /// Copyright: 2020+ Philippe Coval <https://purl.org/rzr/> |
rzrfreefr | 1:b2103e99708c | 3 | /// URL: https://os.mbed.com/users/rzrfreefr/code/rzr-example-mbed/ |
rzrfreefr | 0:16519bf92477 | 4 | |
rzrfreefr | 0:16519bf92477 | 5 | #include "mbed.h" |
rzrfreefr | 0:16519bf92477 | 6 | |
rzrfreefr | 3:807a69c34b8b | 7 | #include <EthernetInterface.h> |
rzrfreefr | 3:807a69c34b8b | 8 | #include <USBKeyboard.h> |
rzrfreefr | 3:807a69c34b8b | 9 | #include <FXOS8700Q.h> |
rzrfreefr | 3:807a69c34b8b | 10 | #include "Utils.h" |
rzrfreefr | 0:16519bf92477 | 11 | |
rzrfreefr | 3:807a69c34b8b | 12 | //#define CONFIG_LOG 1 |
rzrfreefr | 2:15bfd52937dc | 13 | //#define CONFIG_NET 1 |
rzrfreefr | 2:15bfd52937dc | 14 | #define CONFIG_USB 1 |
rzrfreefr | 2:15bfd52937dc | 15 | |
rzrfreefr | 2:15bfd52937dc | 16 | #if defined(CONFIG_LOG) && CONFIG_LOG |
rzrfreefr | 2:15bfd52937dc | 17 | # define logf printf |
rzrfreefr | 2:15bfd52937dc | 18 | #else |
rzrfreefr | 2:15bfd52937dc | 19 | # define logf if (false) printf |
rzrfreefr | 2:15bfd52937dc | 20 | #endif |
rzrfreefr | 2:15bfd52937dc | 21 | |
rzrfreefr | 0:16519bf92477 | 22 | |
rzrfreefr | 0:16519bf92477 | 23 | int main() |
rzrfreefr | 0:16519bf92477 | 24 | { |
rzrfreefr | 2:15bfd52937dc | 25 | logf("#{ %s\n", __FILE__); |
rzrfreefr | 2:15bfd52937dc | 26 | |
rzrfreefr | 2:15bfd52937dc | 27 | DigitalOut led(LED1); |
rzrfreefr | 2:15bfd52937dc | 28 | led = false; //on |
rzrfreefr | 2:15bfd52937dc | 29 | |
rzrfreefr | 2:15bfd52937dc | 30 | I2C i2c(PTE25, PTE24); |
rzrfreefr | 2:15bfd52937dc | 31 | motion_data_units_t acc_data; |
rzrfreefr | 2:15bfd52937dc | 32 | motion_data_counts_t acc_raw; |
rzrfreefr | 2:15bfd52937dc | 33 | |
rzrfreefr | 2:15bfd52937dc | 34 | float vorigin[] = {0, 0, 0}; |
rzrfreefr | 2:15bfd52937dc | 35 | float vacc[] = {0, 0, 0}; |
rzrfreefr | 2:15bfd52937dc | 36 | const int len = 16; |
rzrfreefr | 2:15bfd52937dc | 37 | float vhist[len][3]; |
rzrfreefr | 2:15bfd52937dc | 38 | |
rzrfreefr | 2:15bfd52937dc | 39 | float vmean[] = {0, 0, 0}; |
rzrfreefr | 2:15bfd52937dc | 40 | float vmin[] = {0, 0, 0}; |
rzrfreefr | 2:15bfd52937dc | 41 | float vmax[] = {0, 0, 0}; |
rzrfreefr | 2:15bfd52937dc | 42 | |
rzrfreefr | 3:807a69c34b8b | 43 | // cis: 10 < 12 < 13Log < 15 < 20N < 25< 35N < 40 < ~50 < 60 < !75 |
rzrfreefr | 3:807a69c34b8b | 44 | // pin: 12? < 50 |
rzrfreefr | 3:807a69c34b8b | 45 | float threshold = 1./25; |
rzrfreefr | 2:15bfd52937dc | 46 | float vthreshold[] = {threshold, threshold, threshold}; |
rzrfreefr | 3:807a69c34b8b | 47 | const float delay = 1000.f / 25 / len; |
rzrfreefr | 0:16519bf92477 | 48 | |
rzrfreefr | 3:807a69c34b8b | 49 | #if 0 |
rzrfreefr | 2:15bfd52937dc | 50 | int keymap[3][2] = { |
rzrfreefr | 3:807a69c34b8b | 51 | { RIGHT_ARROW, LEFT_ARROW }, |
rzrfreefr | 2:15bfd52937dc | 52 | { DOWN_ARROW, UP_ARROW }, |
rzrfreefr | 2:15bfd52937dc | 53 | { KEY_PAGE_DOWN, KEY_PAGE_UP } |
rzrfreefr | 2:15bfd52937dc | 54 | }; |
rzrfreefr | 3:807a69c34b8b | 55 | #elif 1 |
rzrfreefr | 2:15bfd52937dc | 56 | int keymap[3][2] = { |
rzrfreefr | 3:807a69c34b8b | 57 | { KEY_RCTRL, KEY_CTRL }, |
rzrfreefr | 2:15bfd52937dc | 58 | { DOWN_ARROW, UP_ARROW }, |
rzrfreefr | 2:15bfd52937dc | 59 | { KEY_PAGE_DOWN, KEY_PAGE_UP } |
rzrfreefr | 2:15bfd52937dc | 60 | }; |
rzrfreefr | 3:807a69c34b8b | 61 | #elif 0 // https://github.com/ARMmbed/mbed-os/blob/c6094f7b36dc0e90a6a7271870333fbba475286c/drivers/usb/source/USBKeyboard.cpp |
rzrfreefr | 3:807a69c34b8b | 62 | int keymap[3][2] = { |
rzrfreefr | 3:807a69c34b8b | 63 | { 0x4f, 0x50 }, |
rzrfreefr | 3:807a69c34b8b | 64 | { 0x51, 0x52 }, |
rzrfreefr | 3:807a69c34b8b | 65 | { 0x4b, 0x4e } |
rzrfreefr | 3:807a69c34b8b | 66 | }; |
rzrfreefr | 2:15bfd52937dc | 67 | #endif |
rzrfreefr | 2:15bfd52937dc | 68 | |
rzrfreefr | 2:15bfd52937dc | 69 | |
rzrfreefr | 2:15bfd52937dc | 70 | FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board |
rzrfreefr | 2:15bfd52937dc | 71 | #if defined(CONFIG_USB) && CONFIG_USB |
rzrfreefr | 2:15bfd52937dc | 72 | logf("# usb:\n"); |
rzrfreefr | 2:15bfd52937dc | 73 | USBKeyboard usb; ///< https://os.mbed.com/docs/mbed-os/v6.2/apis/usbkeyboard.html |
rzrfreefr | 2:15bfd52937dc | 74 | #endif |
rzrfreefr | 2:15bfd52937dc | 75 | |
rzrfreefr | 2:15bfd52937dc | 76 | #if defined(CONFIG_NET) && CONFIG_NET |
rzrfreefr | 2:15bfd52937dc | 77 | EthernetInterface eth; ///< https://os.mbed.com/docs/mbed-os/v6.2/apis/ethernet.html |
rzrfreefr | 2:15bfd52937dc | 78 | eth.set_dhcp(true); |
rzrfreefr | 2:15bfd52937dc | 79 | eth.connect(); |
rzrfreefr | 2:15bfd52937dc | 80 | logf("\n# MAC address: %s\n", eth.get_mac_address()); |
rzrfreefr | 2:15bfd52937dc | 81 | SocketAddress a; |
rzrfreefr | 2:15bfd52937dc | 82 | eth.get_ip_address(&a); |
rzrfreefr | 2:15bfd52937dc | 83 | char* addr = a.get_ip_address() || "127.0.0.1"; |
rzrfreefr | 2:15bfd52937dc | 84 | logf("# IP address: %s\n", addr); |
rzrfreefr | 0:16519bf92477 | 85 | #endif |
rzrfreefr | 0:16519bf92477 | 86 | |
rzrfreefr | 2:15bfd52937dc | 87 | acc.enable(); |
rzrfreefr | 0:16519bf92477 | 88 | acc.getAxis(acc_data); |
rzrfreefr | 2:15bfd52937dc | 89 | vorigin[0] = acc_data.x; |
rzrfreefr | 2:15bfd52937dc | 90 | vorigin[1] = acc_data.y; |
rzrfreefr | 2:15bfd52937dc | 91 | vorigin[2] = acc_data.z; |
rzrfreefr | 2:15bfd52937dc | 92 | |
rzrfreefr | 2:15bfd52937dc | 93 | logf("\r\n\n# FXOS8700Q: Who Am I= %X\r\n", acc.whoAmI()); |
rzrfreefr | 2:15bfd52937dc | 94 | |
rzrfreefr | 2:15bfd52937dc | 95 | int key = 0; |
rzrfreefr | 2:15bfd52937dc | 96 | for(int iter=0; iter<len; ++iter) { |
rzrfreefr | 2:15bfd52937dc | 97 | if (false) led = !led; |
rzrfreefr | 2:15bfd52937dc | 98 | acc.getAxis(acc_data); |
rzrfreefr | 2:15bfd52937dc | 99 | vacc[0] = acc_data.x - vorigin[0]; |
rzrfreefr | 2:15bfd52937dc | 100 | vacc[1] = acc_data.y - vorigin[1]; |
rzrfreefr | 2:15bfd52937dc | 101 | vacc[2] = acc_data.z - vorigin[2]; |
rzrfreefr | 2:15bfd52937dc | 102 | logf("{\"accel\":[%.2f,%.2f,%.2f]}\r\n", vacc[0], vacc[1], vacc[2]); |
rzrfreefr | 2:15bfd52937dc | 103 | |
rzrfreefr | 2:15bfd52937dc | 104 | #if defined(CONFIG_USB) && CONFIG_USB |
rzrfreefr | 2:15bfd52937dc | 105 | usb.connect(); |
rzrfreefr | 2:15bfd52937dc | 106 | |
rzrfreefr | 2:15bfd52937dc | 107 | if (key == 0) { |
rzrfreefr | 2:15bfd52937dc | 108 | for(int i=2; i>=0; i--) { |
rzrfreefr | 2:15bfd52937dc | 109 | if (vacc[i] > vthreshold[i]) { |
rzrfreefr | 2:15bfd52937dc | 110 | key = keymap[i][0]; |
rzrfreefr | 2:15bfd52937dc | 111 | } else if (vacc[i] < -vthreshold[i]) { |
rzrfreefr | 2:15bfd52937dc | 112 | key = keymap[i][1]; |
rzrfreefr | 2:15bfd52937dc | 113 | } |
rzrfreefr | 2:15bfd52937dc | 114 | } |
rzrfreefr | 2:15bfd52937dc | 115 | |
rzrfreefr | 2:15bfd52937dc | 116 | if (key != 0) { |
rzrfreefr | 2:15bfd52937dc | 117 | led = false; //on |
rzrfreefr | 2:15bfd52937dc | 118 | logf("# key: %0X\n", key); |
rzrfreefr | 3:807a69c34b8b | 119 | #if 0 |
rzrfreefr | 3:807a69c34b8b | 120 | Thread thread; |
rzrfreefr | 3:807a69c34b8b | 121 | thread.start(idle); |
rzrfreefr | 3:807a69c34b8b | 122 | #endif |
rzrfreefr | 3:807a69c34b8b | 123 | |
rzrfreefr | 2:15bfd52937dc | 124 | if (!true) { |
rzrfreefr | 2:15bfd52937dc | 125 | usb.key_code(key, key); |
rzrfreefr | 3:807a69c34b8b | 126 | } else if (false) { |
rzrfreefr | 3:807a69c34b8b | 127 | usb.key_code(key); |
rzrfreefr | 2:15bfd52937dc | 128 | } else { |
rzrfreefr | 3:807a69c34b8b | 129 | Utils::keyboard_key_code(usb, key, key); |
rzrfreefr | 2:15bfd52937dc | 130 | } |
rzrfreefr | 2:15bfd52937dc | 131 | } |
rzrfreefr | 2:15bfd52937dc | 132 | iter=0; |
rzrfreefr | 2:15bfd52937dc | 133 | continue; |
rzrfreefr | 2:15bfd52937dc | 134 | } |
rzrfreefr | 0:16519bf92477 | 135 | #endif |
rzrfreefr | 2:15bfd52937dc | 136 | |
rzrfreefr | 2:15bfd52937dc | 137 | for (int i=0; i<3; i++) { |
rzrfreefr | 2:15bfd52937dc | 138 | vhist[iter][i] = vacc[i]; |
rzrfreefr | 2:15bfd52937dc | 139 | } |
rzrfreefr | 2:15bfd52937dc | 140 | |
rzrfreefr | 2:15bfd52937dc | 141 | if (iter==len-1) { |
rzrfreefr | 2:15bfd52937dc | 142 | led = false; // heart beat |
rzrfreefr | 2:15bfd52937dc | 143 | led = true; |
rzrfreefr | 2:15bfd52937dc | 144 | |
rzrfreefr | 2:15bfd52937dc | 145 | for (int i=0; i<3; i++) { |
rzrfreefr | 2:15bfd52937dc | 146 | vmean[i] = 0; |
rzrfreefr | 2:15bfd52937dc | 147 | vmin[i] = vmax[i] = vhist[iter][i]; |
rzrfreefr | 2:15bfd52937dc | 148 | } |
rzrfreefr | 2:15bfd52937dc | 149 | |
rzrfreefr | 2:15bfd52937dc | 150 | for (iter=0; iter<len; iter++) { |
rzrfreefr | 2:15bfd52937dc | 151 | for (int i=0; i<3; i++) { |
rzrfreefr | 2:15bfd52937dc | 152 | vmean[i] += vhist[iter][i]; |
rzrfreefr | 2:15bfd52937dc | 153 | if (vmin[i] > vhist[iter][i]) { |
rzrfreefr | 2:15bfd52937dc | 154 | vmin[i] = vhist[iter][i]; |
rzrfreefr | 2:15bfd52937dc | 155 | } |
rzrfreefr | 2:15bfd52937dc | 156 | if (vmax[i] < vhist[iter][i]) { |
rzrfreefr | 2:15bfd52937dc | 157 | vmax[i] = vhist[iter][i]; |
rzrfreefr | 2:15bfd52937dc | 158 | } |
rzrfreefr | 2:15bfd52937dc | 159 | } |
rzrfreefr | 2:15bfd52937dc | 160 | } |
rzrfreefr | 2:15bfd52937dc | 161 | for (int i=0; i<3; i++) { |
rzrfreefr | 2:15bfd52937dc | 162 | vmean[i] /= len; |
rzrfreefr | 2:15bfd52937dc | 163 | } |
rzrfreefr | 2:15bfd52937dc | 164 | |
rzrfreefr | 2:15bfd52937dc | 165 | bool reset = true; |
rzrfreefr | 2:15bfd52937dc | 166 | for (int k=0; k<3; k++) { |
rzrfreefr | 2:15bfd52937dc | 167 | if (abs(vmax[k] - vmin[k]) > threshold*.8) { |
rzrfreefr | 2:15bfd52937dc | 168 | reset &= false; |
rzrfreefr | 2:15bfd52937dc | 169 | } |
rzrfreefr | 2:15bfd52937dc | 170 | } |
rzrfreefr | 2:15bfd52937dc | 171 | if (reset) { |
rzrfreefr | 2:15bfd52937dc | 172 | logf("\r\n# Reset origin\n"); |
rzrfreefr | 2:15bfd52937dc | 173 | vorigin[0] = acc_data.x; |
rzrfreefr | 2:15bfd52937dc | 174 | vorigin[1] = acc_data.y; |
rzrfreefr | 2:15bfd52937dc | 175 | vorigin[2] = acc_data.z; |
rzrfreefr | 2:15bfd52937dc | 176 | |
rzrfreefr | 2:15bfd52937dc | 177 | key = 0; // unbounce |
rzrfreefr | 2:15bfd52937dc | 178 | led = true; //off |
rzrfreefr | 2:15bfd52937dc | 179 | } |
rzrfreefr | 2:15bfd52937dc | 180 | iter=0; |
rzrfreefr | 2:15bfd52937dc | 181 | } |
rzrfreefr | 2:15bfd52937dc | 182 | ThisThread::sleep_for(delay); |
rzrfreefr | 2:15bfd52937dc | 183 | } |
rzrfreefr | 2:15bfd52937dc | 184 | logf("#} %s\n", __FILE__); |
rzrfreefr | 2:15bfd52937dc | 185 | } |