Demo example on FRDM-64F https://ide.mbed.com/compiler/#nav:/rzr-example-mbed;

Dependencies:   FXOS8700Q

Committer:
rzrfreefr
Date:
Wed Mar 16 14:41:31 2022 +0000
Revision:
3:807a69c34b8b
Parent:
2:15bfd52937dc
Publish

Who changed what in which revision?

UserRevisionLine numberNew 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 }