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.
Dependencies: mbed SDFileSystemVSG
em7186.cpp@6:4ba3f9a8191f, 2016-10-25 (annotated)
- Committer:
- JoeMiller
- Date:
- Tue Oct 25 23:09:42 2016 +0000
- Revision:
- 6:4ba3f9a8191f
- Parent:
- 3:69239f60d620
- Child:
- 9:fd5bf0a4c774
Corrected the Mag Dynamic Range Constant from 2000uT to 1000uT; This fixes the incorrect scale of the displayed mag value.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JoeMiller | 0:02c0c2cbc3df | 1 | /** |
JoeMiller | 0:02c0c2cbc3df | 2 | * @file em7186.c |
JoeMiller | 0:02c0c2cbc3df | 3 | * |
JoeMiller | 0:02c0c2cbc3df | 4 | * @brief Sample interface for the em7186. |
JoeMiller | 0:02c0c2cbc3df | 5 | * |
JoeMiller | 0:02c0c2cbc3df | 6 | * @authors David Vincent, Joe Miller |
JoeMiller | 0:02c0c2cbc3df | 7 | * @date 05/12/2016 |
JoeMiller | 0:02c0c2cbc3df | 8 | * @copyright (C) 2015, 2016 PNI Corp |
JoeMiller | 0:02c0c2cbc3df | 9 | * |
JoeMiller | 0:02c0c2cbc3df | 10 | * @copyright Disclosure to third parties or reproduction in any form |
JoeMiller | 0:02c0c2cbc3df | 11 | * whatsoever, without prior written consent, is strictly forbidden |
JoeMiller | 0:02c0c2cbc3df | 12 | * |
JoeMiller | 0:02c0c2cbc3df | 13 | */ |
JoeMiller | 0:02c0c2cbc3df | 14 | #include "em7186.h" |
JoeMiller | 0:02c0c2cbc3df | 15 | |
JoeMiller | 0:02c0c2cbc3df | 16 | |
JoeMiller | 0:02c0c2cbc3df | 17 | float em7186_sensor_scale[128]; |
JoeMiller | 0:02c0c2cbc3df | 18 | u32 timestampNonWake; |
JoeMiller | 0:02c0c2cbc3df | 19 | u32 timestampWake; |
JoeMiller | 0:02c0c2cbc3df | 20 | u8 printData = 1; // a switch to enable/disable display data (vs logData) |
JoeMiller | 0:02c0c2cbc3df | 21 | u8 logData = 0; // a switch to enable/disable log data to SD Card |
JoeMiller | 0:02c0c2cbc3df | 22 | u8 sensorEnabled[64]; |
JoeMiller | 0:02c0c2cbc3df | 23 | u8 haveSensorInfo = 0; |
JoeMiller | 0:02c0c2cbc3df | 24 | u16 magMaxRate = 0; |
JoeMiller | 0:02c0c2cbc3df | 25 | u16 accelMaxRate = 0; |
JoeMiller | 0:02c0c2cbc3df | 26 | u16 gyroMaxRate = 0; |
JoeMiller | 0:02c0c2cbc3df | 27 | u32 timestamp; |
JoeMiller | 0:02c0c2cbc3df | 28 | u16 timestampPtr[2]; |
JoeMiller | 0:02c0c2cbc3df | 29 | |
JoeMiller | 0:02c0c2cbc3df | 30 | SensorDescriptor sensorInformation[128]; |
JoeMiller | 0:02c0c2cbc3df | 31 | SensorConfiguration sensorConfiguration[127]; |
JoeMiller | 0:02c0c2cbc3df | 32 | |
JoeMiller | 0:02c0c2cbc3df | 33 | |
JoeMiller | 0:02c0c2cbc3df | 34 | ParamInfo sensorInfoParamList[128] = |
JoeMiller | 0:02c0c2cbc3df | 35 | { |
JoeMiller | 0:02c0c2cbc3df | 36 | { 0, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 37 | { 1, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 38 | { 2, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 39 | { 3, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 40 | { 4, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 41 | { 5, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 42 | { 6, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 43 | { 7, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 44 | { 8, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 45 | { 9, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 46 | { 10, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 47 | { 11, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 48 | { 12, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 49 | { 13, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 50 | { 14, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 51 | { 15, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 52 | { 16, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 53 | { 17, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 54 | { 18, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 55 | { 19, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 56 | { 20, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 57 | { 21, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 58 | { 22, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 59 | { 23, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 60 | { 24, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 61 | { 25, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 62 | { 26, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 63 | { 27, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 64 | { 28, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 65 | { 29, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 66 | { 30, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 67 | { 31, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 68 | { 32, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 69 | { 33, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 70 | { 34, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 71 | { 35, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 72 | { 36, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 73 | { 37, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 74 | { 38, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 75 | { 39, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 76 | { 40, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 77 | { 41, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 78 | { 42, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 79 | { 43, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 80 | { 44, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 81 | { 45, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 82 | { 46, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 83 | { 47, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 84 | { 48, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 85 | { 49, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 86 | { 50, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 87 | { 51, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 88 | { 52, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 89 | { 53, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 90 | { 54, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 91 | { 55, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 92 | { 56, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 93 | { 57, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 94 | { 58, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 95 | { 59, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 96 | { 60, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 97 | { 61, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 98 | { 62, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 99 | { 63, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 100 | { 64, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 101 | { 65, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 102 | { 66, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 103 | { 67, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 104 | { 68, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 105 | { 69, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 106 | { 70, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 107 | { 71, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 108 | { 72, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 109 | { 73, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 110 | { 74, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 111 | { 75, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 112 | { 76, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 113 | { 77, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 114 | { 78, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 115 | { 79, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 116 | { 80, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 117 | { 81, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 118 | { 82, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 119 | { 83, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 120 | { 84, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 121 | { 85, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 122 | { 86, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 123 | { 87, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 124 | { 88, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 125 | { 89, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 126 | { 90, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 127 | { 91, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 128 | { 92, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 129 | { 93, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 130 | { 94, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 131 | { 95, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 132 | { 96, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 133 | { 97, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 134 | { 98, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 135 | { 99, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 136 | { 100, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 137 | { 101, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 138 | { 102, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 139 | { 103, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 140 | { 104, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 141 | { 105, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 142 | { 106, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 143 | { 107, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 144 | { 108, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 145 | { 109, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 146 | { 110, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 147 | { 111, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 148 | { 112, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 149 | { 113, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 150 | { 114, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 151 | { 115, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 152 | { 116, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 153 | { 117, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 154 | { 118, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 155 | { 119, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 156 | { 120, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 157 | { 121, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 158 | { 122, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 159 | { 123, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 160 | { 124, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 161 | { 125, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 162 | { 126, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 163 | { 127, 16 }, |
JoeMiller | 0:02c0c2cbc3df | 164 | }; |
JoeMiller | 0:02c0c2cbc3df | 165 | |
JoeMiller | 0:02c0c2cbc3df | 166 | |
JoeMiller | 0:02c0c2cbc3df | 167 | u32 em7186_i2c_init() |
JoeMiller | 0:02c0c2cbc3df | 168 | { |
JoeMiller | 0:02c0c2cbc3df | 169 | u8 buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 170 | em7186_i2c_read(PRODUCT_ID_REG, buffer, 1); |
JoeMiller | 0:02c0c2cbc3df | 171 | |
JoeMiller | 0:02c0c2cbc3df | 172 | switch(buffer[0]) |
JoeMiller | 0:02c0c2cbc3df | 173 | { |
JoeMiller | 0:02c0c2cbc3df | 174 | case PRODUCT_ID_7180: |
JoeMiller | 0:02c0c2cbc3df | 175 | printf("SENtral found\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 176 | break; |
JoeMiller | 0:02c0c2cbc3df | 177 | case PRODUCT_ID_7184: |
JoeMiller | 0:02c0c2cbc3df | 178 | printf("SENtral-A found\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 179 | break; |
JoeMiller | 0:02c0c2cbc3df | 180 | case PRODUCT_ID_7186: |
JoeMiller | 0:02c0c2cbc3df | 181 | printf("SENtral-A2 found\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 182 | break; |
JoeMiller | 0:02c0c2cbc3df | 183 | default: |
JoeMiller | 0:02c0c2cbc3df | 184 | printf("SENtral NOT FOUND, ID returned = %u\n\r",buffer[0]); |
JoeMiller | 0:02c0c2cbc3df | 185 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 186 | |
JoeMiller | 0:02c0c2cbc3df | 187 | } |
JoeMiller | 0:02c0c2cbc3df | 188 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 189 | } |
JoeMiller | 0:02c0c2cbc3df | 190 | |
JoeMiller | 0:02c0c2cbc3df | 191 | void firmwareTransfer(char srcDestCode) |
JoeMiller | 0:02c0c2cbc3df | 192 | { |
JoeMiller | 0:02c0c2cbc3df | 193 | switch (srcDestCode) { |
JoeMiller | 0:02c0c2cbc3df | 194 | // case 'r': |
JoeMiller | 0:02c0c2cbc3df | 195 | // if (displayText) printf("begin Upload of firmware to SENtral RAM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 196 | // SENtral_InterruptPin.disable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 197 | // if (!) { |
JoeMiller | 0:02c0c2cbc3df | 198 | // if (displayText) printf("Error uploading SENtral firmware to RAM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 199 | // } |
JoeMiller | 0:02c0c2cbc3df | 200 | // SENtral_InterruptPin.enable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 201 | // break; |
JoeMiller | 0:02c0c2cbc3df | 202 | // |
JoeMiller | 0:02c0c2cbc3df | 203 | // case 'e': |
JoeMiller | 0:02c0c2cbc3df | 204 | // if (displayText) printf("begin Upload of firmware to PNI Module EEPROM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 205 | // SENtral_InterruptPin.disable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 206 | // if (!) { |
JoeMiller | 0:02c0c2cbc3df | 207 | // if (displayText) printf("Error uploading SENtral firmware to EEPROM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 208 | // } |
JoeMiller | 0:02c0c2cbc3df | 209 | // SENtral_InterruptPin.enable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 210 | // break; |
JoeMiller | 0:02c0c2cbc3df | 211 | // |
JoeMiller | 0:02c0c2cbc3df | 212 | // case 's': |
JoeMiller | 0:02c0c2cbc3df | 213 | // if (displayText) printf("begin Upload of firmware to SDCard\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 214 | // SENtral_InterruptPin.disable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 215 | // if (!) { |
JoeMiller | 0:02c0c2cbc3df | 216 | // if (displayText) printf("Error uploading SENtral firmware to SDCard\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 217 | // } |
JoeMiller | 0:02c0c2cbc3df | 218 | // SENtral_InterruptPin.enable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 219 | // break; |
JoeMiller | 0:02c0c2cbc3df | 220 | |
JoeMiller | 0:02c0c2cbc3df | 221 | case 'R': |
JoeMiller | 0:02c0c2cbc3df | 222 | if (displayText) printf("Transfering firmware from SDCard to SENtral RAM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 223 | SENtral_InterruptPin.disable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 224 | if (!em7186_firmware_Transfer2RAM(fw)) { |
JoeMiller | 0:02c0c2cbc3df | 225 | if (displayText) printf("Error transfering SENtral firmware to RAM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 226 | break; |
JoeMiller | 0:02c0c2cbc3df | 227 | } |
JoeMiller | 0:02c0c2cbc3df | 228 | // Enable CPU |
JoeMiller | 0:02c0c2cbc3df | 229 | em7186_i2c_write_value(CHIP_CONTROL_REG, CHIP_CONTROL_CPU_RUN); |
JoeMiller | 0:02c0c2cbc3df | 230 | em7186_set_scale_factors(); |
JoeMiller | 0:02c0c2cbc3df | 231 | SENtral_InterruptPin.enable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 232 | break; |
JoeMiller | 0:02c0c2cbc3df | 233 | |
JoeMiller | 0:02c0c2cbc3df | 234 | case 'E': |
JoeMiller | 0:02c0c2cbc3df | 235 | if (displayText) printf("Transfering firmware from SDCard to PNI Module EEPROM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 236 | SENtral_InterruptPin.disable_irq(); |
JoeMiller | 0:02c0c2cbc3df | 237 | if (!em7186_firmware_Transfer2EE(fw)) { |
JoeMiller | 0:02c0c2cbc3df | 238 | if (displayText) printf("Error transfering SENtral firmware to EEPROM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 239 | } |
JoeMiller | 0:02c0c2cbc3df | 240 | break; |
JoeMiller | 0:02c0c2cbc3df | 241 | |
JoeMiller | 0:02c0c2cbc3df | 242 | default: |
JoeMiller | 0:02c0c2cbc3df | 243 | serialCommandMode = 0; |
JoeMiller | 0:02c0c2cbc3df | 244 | |
JoeMiller | 0:02c0c2cbc3df | 245 | } |
JoeMiller | 0:02c0c2cbc3df | 246 | |
JoeMiller | 0:02c0c2cbc3df | 247 | |
JoeMiller | 0:02c0c2cbc3df | 248 | } |
JoeMiller | 0:02c0c2cbc3df | 249 | |
JoeMiller | 0:02c0c2cbc3df | 250 | |
JoeMiller | 0:02c0c2cbc3df | 251 | |
JoeMiller | 0:02c0c2cbc3df | 252 | |
JoeMiller | 0:02c0c2cbc3df | 253 | u32 em7186_i2c_write_value(u8 registerAddress, u8 value) |
JoeMiller | 0:02c0c2cbc3df | 254 | { |
JoeMiller | 0:02c0c2cbc3df | 255 | u32 status = em7186_i2c_write(registerAddress, &value, 1); |
JoeMiller | 0:02c0c2cbc3df | 256 | return status; |
JoeMiller | 0:02c0c2cbc3df | 257 | } |
JoeMiller | 0:02c0c2cbc3df | 258 | |
JoeMiller | 0:02c0c2cbc3df | 259 | |
JoeMiller | 0:02c0c2cbc3df | 260 | //========================================================================= |
JoeMiller | 0:02c0c2cbc3df | 261 | // Helper functions |
JoeMiller | 0:02c0c2cbc3df | 262 | //========================================================================= |
JoeMiller | 0:02c0c2cbc3df | 263 | u8 get_3_axis_sensor_data(SensorData3Axis *data, float scale, u8* buffer) |
JoeMiller | 0:02c0c2cbc3df | 264 | { |
JoeMiller | 0:02c0c2cbc3df | 265 | SensorData3AxisRaw rawData; |
JoeMiller | 0:02c0c2cbc3df | 266 | memcpy(&rawData, &buffer[1], sizeof(rawData)); |
JoeMiller | 0:02c0c2cbc3df | 267 | data->x = (float)rawData.x * scale; |
JoeMiller | 0:02c0c2cbc3df | 268 | data->y = (float)rawData.y * scale; |
JoeMiller | 0:02c0c2cbc3df | 269 | data->z = (float)rawData.z * scale; |
JoeMiller | 0:02c0c2cbc3df | 270 | data->extra = rawData.status; |
JoeMiller | 0:02c0c2cbc3df | 271 | |
JoeMiller | 0:02c0c2cbc3df | 272 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 273 | } |
JoeMiller | 0:02c0c2cbc3df | 274 | u8 get_3_axis_uncal_sensor_data(SensorData6Axis *data, float scale, u8* buffer) |
JoeMiller | 0:02c0c2cbc3df | 275 | { |
JoeMiller | 0:02c0c2cbc3df | 276 | SensorData3AxisUncalRaw rawData; |
JoeMiller | 0:02c0c2cbc3df | 277 | memcpy(&rawData, &buffer[1], sizeof(rawData)); |
JoeMiller | 0:02c0c2cbc3df | 278 | data->x = (float)rawData.x * scale; |
JoeMiller | 0:02c0c2cbc3df | 279 | data->y = (float)rawData.y * scale; |
JoeMiller | 0:02c0c2cbc3df | 280 | data->z = (float)rawData.z * scale; |
JoeMiller | 0:02c0c2cbc3df | 281 | data->x_bias = (float)rawData.x_bias * scale; |
JoeMiller | 0:02c0c2cbc3df | 282 | data->y_bias = (float)rawData.y_bias * scale; |
JoeMiller | 0:02c0c2cbc3df | 283 | data->z_bias = (float)rawData.z_bias * scale; |
JoeMiller | 0:02c0c2cbc3df | 284 | data->extra = rawData.status; |
JoeMiller | 0:02c0c2cbc3df | 285 | |
JoeMiller | 0:02c0c2cbc3df | 286 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 287 | } |
JoeMiller | 0:02c0c2cbc3df | 288 | u8 get_rotation_vector(SensorData4Axis *rv, float quaternionScale, u8* buffer) |
JoeMiller | 0:02c0c2cbc3df | 289 | { |
JoeMiller | 0:02c0c2cbc3df | 290 | RotationVectorRaw rawData; |
JoeMiller | 0:02c0c2cbc3df | 291 | memcpy(&rawData, &buffer[1], sizeof(rawData)); |
JoeMiller | 0:02c0c2cbc3df | 292 | rv->x = (float)rawData.x * quaternionScale; |
JoeMiller | 0:02c0c2cbc3df | 293 | rv->y = (float)rawData.y * quaternionScale; |
JoeMiller | 0:02c0c2cbc3df | 294 | rv->z = (float)rawData.z * quaternionScale; |
JoeMiller | 0:02c0c2cbc3df | 295 | rv->w = (float)rawData.w * quaternionScale; |
JoeMiller | 0:02c0c2cbc3df | 296 | rv->extra = (float)rawData.accuracy * ((float)M_PI / powf(2.0f, 14.0f)); |
JoeMiller | 0:02c0c2cbc3df | 297 | |
JoeMiller | 0:02c0c2cbc3df | 298 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 299 | } |
JoeMiller | 0:02c0c2cbc3df | 300 | |
JoeMiller | 0:02c0c2cbc3df | 301 | //========================================================================= |
JoeMiller | 0:02c0c2cbc3df | 302 | // Core functions |
JoeMiller | 0:02c0c2cbc3df | 303 | //========================================================================= |
JoeMiller | 0:02c0c2cbc3df | 304 | u32 em7186_firmware_Transfer2RAM(const u8 *firmwareName) |
JoeMiller | 0:02c0c2cbc3df | 305 | { |
JoeMiller | 0:02c0c2cbc3df | 306 | |
JoeMiller | 0:02c0c2cbc3df | 307 | // reset Sentral |
JoeMiller | 0:02c0c2cbc3df | 308 | em7186_i2c_write_value(RESET_REQ_REG, 1); |
JoeMiller | 0:02c0c2cbc3df | 309 | em7186_i2c_write_value(CHIP_CONTROL_REG, CHIP_CONTROL_HOST_UPLOAD); |
JoeMiller | 0:02c0c2cbc3df | 310 | |
JoeMiller | 0:02c0c2cbc3df | 311 | /////////////////////////////////////////////////////////////////////////// |
JoeMiller | 0:02c0c2cbc3df | 312 | // Load firmware from file |
JoeMiller | 0:02c0c2cbc3df | 313 | /////////////////////////////////////////////////////////////////////////// |
JoeMiller | 0:02c0c2cbc3df | 314 | // Open firmware file |
JoeMiller | 0:02c0c2cbc3df | 315 | FILE *fw_h = fopen(firmwareName, "rb"); |
JoeMiller | 0:02c0c2cbc3df | 316 | if (!fw_h) |
JoeMiller | 0:02c0c2cbc3df | 317 | { |
JoeMiller | 0:02c0c2cbc3df | 318 | if (displayText) printf("ERROR: Unable to open file\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 319 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 320 | } |
JoeMiller | 0:02c0c2cbc3df | 321 | |
JoeMiller | 0:02c0c2cbc3df | 322 | if (displayText) printf("Firmware file found\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 323 | |
JoeMiller | 0:02c0c2cbc3df | 324 | // Read the firmware header |
JoeMiller | 0:02c0c2cbc3df | 325 | struct fwHeader |
JoeMiller | 0:02c0c2cbc3df | 326 | { |
JoeMiller | 0:02c0c2cbc3df | 327 | u8 imageSignatureLsb; |
JoeMiller | 0:02c0c2cbc3df | 328 | u8 imageSignatureMsb; |
JoeMiller | 0:02c0c2cbc3df | 329 | u16 flags; |
JoeMiller | 0:02c0c2cbc3df | 330 | u32 crc; |
JoeMiller | 0:02c0c2cbc3df | 331 | u32 reserved; |
JoeMiller | 0:02c0c2cbc3df | 332 | u16 imageLength; |
JoeMiller | 0:02c0c2cbc3df | 333 | u16 reserved2; |
JoeMiller | 0:02c0c2cbc3df | 334 | } fwHeader; |
JoeMiller | 0:02c0c2cbc3df | 335 | int hsize = fread(&fwHeader, 1, FIRMWARE_HEADER_SIZE, fw_h); |
JoeMiller | 0:02c0c2cbc3df | 336 | if ( hsize != FIRMWARE_HEADER_SIZE) |
JoeMiller | 0:02c0c2cbc3df | 337 | { |
JoeMiller | 0:02c0c2cbc3df | 338 | if (displayText) printf("ERROR: File smaller than expected header size %d\n\r", hsize); |
JoeMiller | 0:02c0c2cbc3df | 339 | fclose(fw_h); |
JoeMiller | 0:02c0c2cbc3df | 340 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 341 | } |
JoeMiller | 0:02c0c2cbc3df | 342 | |
JoeMiller | 0:02c0c2cbc3df | 343 | // Validate firmware |
JoeMiller | 0:02c0c2cbc3df | 344 | if (fwHeader.imageSignatureLsb != IMAGE_SIGNATURE_LSB || fwHeader.imageSignatureMsb != IMAGE_SIGNATURE_MSG) |
JoeMiller | 0:02c0c2cbc3df | 345 | { |
JoeMiller | 0:02c0c2cbc3df | 346 | if (displayText) printf("ERROR: Firmware version doesn't match\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 347 | fclose(fw_h); |
JoeMiller | 0:02c0c2cbc3df | 348 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 349 | } |
JoeMiller | 0:02c0c2cbc3df | 350 | |
JoeMiller | 0:02c0c2cbc3df | 351 | // TODO: ensure that firmware version matches rom version |
JoeMiller | 0:02c0c2cbc3df | 352 | |
JoeMiller | 0:02c0c2cbc3df | 353 | // Read the firmware image |
JoeMiller | 0:02c0c2cbc3df | 354 | u8 *fw = (u8 *)malloc(fwHeader.imageLength); |
JoeMiller | 0:02c0c2cbc3df | 355 | u32 firmwareSize = fread(fw, 1, fwHeader.imageLength, fw_h); |
JoeMiller | 0:02c0c2cbc3df | 356 | fclose(fw_h); |
JoeMiller | 0:02c0c2cbc3df | 357 | if (firmwareSize != fwHeader.imageLength || firmwareSize % 4) |
JoeMiller | 0:02c0c2cbc3df | 358 | { |
JoeMiller | 0:02c0c2cbc3df | 359 | if (displayText) printf("ERROR: Firmware size must break on 4 byte boundary\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 360 | free(fw); |
JoeMiller | 0:02c0c2cbc3df | 361 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 362 | } |
JoeMiller | 0:02c0c2cbc3df | 363 | |
JoeMiller | 0:02c0c2cbc3df | 364 | /////////////////////////////////////////////////////////////////////////// |
JoeMiller | 0:02c0c2cbc3df | 365 | // Upload firmware to RAM |
JoeMiller | 0:02c0c2cbc3df | 366 | /////////////////////////////////////////////////////////////////////////// |
JoeMiller | 0:02c0c2cbc3df | 367 | // TODO: set upload address if needed. (zero by default) |
JoeMiller | 0:02c0c2cbc3df | 368 | |
JoeMiller | 0:02c0c2cbc3df | 369 | if (displayText) printf("Uploading Firmware to SENtral RAM...\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 370 | |
JoeMiller | 0:02c0c2cbc3df | 371 | s32 bytesWritten = 0, |
JoeMiller | 0:02c0c2cbc3df | 372 | bytesRemaining = firmwareSize; |
JoeMiller | 0:02c0c2cbc3df | 373 | u8 bytesToWrite, i, |
JoeMiller | 0:02c0c2cbc3df | 374 | buf[MAX_I2C_WRITE], |
JoeMiller | 0:02c0c2cbc3df | 375 | maxI2cWrite = MAX_I2C_WRITE; |
JoeMiller | 0:02c0c2cbc3df | 376 | |
JoeMiller | 0:02c0c2cbc3df | 377 | while (bytesRemaining > 0) |
JoeMiller | 0:02c0c2cbc3df | 378 | { |
JoeMiller | 0:02c0c2cbc3df | 379 | if (bytesRemaining < MAX_I2C_WRITE) |
JoeMiller | 0:02c0c2cbc3df | 380 | bytesToWrite = bytesRemaining; |
JoeMiller | 0:02c0c2cbc3df | 381 | else |
JoeMiller | 0:02c0c2cbc3df | 382 | bytesToWrite = maxI2cWrite; |
JoeMiller | 0:02c0c2cbc3df | 383 | |
JoeMiller | 0:02c0c2cbc3df | 384 | // Reverse byte order per word |
JoeMiller | 0:02c0c2cbc3df | 385 | for (i = 0; i < bytesToWrite; i += 4) |
JoeMiller | 0:02c0c2cbc3df | 386 | { |
JoeMiller | 0:02c0c2cbc3df | 387 | buf[i + 0] = fw[bytesWritten + i + 3]; |
JoeMiller | 0:02c0c2cbc3df | 388 | buf[i + 1] = fw[bytesWritten + i + 2]; |
JoeMiller | 0:02c0c2cbc3df | 389 | buf[i + 2] = fw[bytesWritten + i + 1]; |
JoeMiller | 0:02c0c2cbc3df | 390 | buf[i + 3] = fw[bytesWritten + i + 0]; |
JoeMiller | 0:02c0c2cbc3df | 391 | } |
JoeMiller | 0:02c0c2cbc3df | 392 | |
JoeMiller | 0:02c0c2cbc3df | 393 | if (!em7186_i2c_write(SR_UPLOAD_DATA_REG, buf, bytesToWrite)) |
JoeMiller | 0:02c0c2cbc3df | 394 | { |
JoeMiller | 0:02c0c2cbc3df | 395 | if (displayText) printf("ERROR: Problem writing to sentral\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 396 | free(fw); |
JoeMiller | 0:02c0c2cbc3df | 397 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 398 | } |
JoeMiller | 0:02c0c2cbc3df | 399 | |
JoeMiller | 0:02c0c2cbc3df | 400 | bytesRemaining -= bytesToWrite; |
JoeMiller | 0:02c0c2cbc3df | 401 | bytesWritten += bytesToWrite; |
JoeMiller | 0:02c0c2cbc3df | 402 | } |
JoeMiller | 0:02c0c2cbc3df | 403 | |
JoeMiller | 0:02c0c2cbc3df | 404 | free(fw); |
JoeMiller | 0:02c0c2cbc3df | 405 | |
JoeMiller | 0:02c0c2cbc3df | 406 | if (displayText) printf("Firmware Uploaded......"); |
JoeMiller | 0:02c0c2cbc3df | 407 | |
JoeMiller | 0:02c0c2cbc3df | 408 | // Read and verify CRC |
JoeMiller | 0:02c0c2cbc3df | 409 | u32 hostCRC = 0; |
JoeMiller | 0:02c0c2cbc3df | 410 | em7186_i2c_read(HOST_CRC_REG, (u8*)&hostCRC, 4); |
JoeMiller | 0:02c0c2cbc3df | 411 | u32 fwHeaderCRC = fwHeader.crc;//((u32*)fwHeader)[1]; |
JoeMiller | 0:02c0c2cbc3df | 412 | if (hostCRC != fwHeaderCRC) |
JoeMiller | 0:02c0c2cbc3df | 413 | { |
JoeMiller | 0:02c0c2cbc3df | 414 | if (displayText) printf("ERROR: CRC doesn't match\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 415 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 416 | } |
JoeMiller | 0:02c0c2cbc3df | 417 | |
JoeMiller | 0:02c0c2cbc3df | 418 | if (displayText) printf(" CRC Match!!\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 419 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 420 | } |
JoeMiller | 0:02c0c2cbc3df | 421 | |
JoeMiller | 0:02c0c2cbc3df | 422 | |
JoeMiller | 0:02c0c2cbc3df | 423 | |
JoeMiller | 0:02c0c2cbc3df | 424 | |
JoeMiller | 0:02c0c2cbc3df | 425 | u32 em7186_firmware_Transfer2EE(const u8 *firmwareName) |
JoeMiller | 0:02c0c2cbc3df | 426 | { |
JoeMiller | 0:02c0c2cbc3df | 427 | u8 buffer[16]; |
JoeMiller | 0:02c0c2cbc3df | 428 | u8 trys = 1; |
JoeMiller | 0:02c0c2cbc3df | 429 | u16 count; |
JoeMiller | 0:02c0c2cbc3df | 430 | // Open firmware file |
JoeMiller | 0:02c0c2cbc3df | 431 | FILE *fw_h = fopen(firmwareName, "rb"); |
JoeMiller | 0:02c0c2cbc3df | 432 | if (!fw_h) { |
JoeMiller | 0:02c0c2cbc3df | 433 | if (displayText) printf("ERROR: Unable to open file\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 434 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 435 | } |
JoeMiller | 0:02c0c2cbc3df | 436 | |
JoeMiller | 0:02c0c2cbc3df | 437 | if (displayText) printf("Firmware file found\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 438 | |
JoeMiller | 0:02c0c2cbc3df | 439 | // Read the firmware header |
JoeMiller | 0:02c0c2cbc3df | 440 | struct fwHeader { |
JoeMiller | 0:02c0c2cbc3df | 441 | u8 imageSignatureLsb; |
JoeMiller | 0:02c0c2cbc3df | 442 | u8 imageSignatureMsb; |
JoeMiller | 0:02c0c2cbc3df | 443 | u16 flags; |
JoeMiller | 0:02c0c2cbc3df | 444 | u32 crc; |
JoeMiller | 0:02c0c2cbc3df | 445 | u32 reserved; |
JoeMiller | 0:02c0c2cbc3df | 446 | u16 imageLength; |
JoeMiller | 0:02c0c2cbc3df | 447 | u16 reserved2; |
JoeMiller | 0:02c0c2cbc3df | 448 | } fwHeader; |
JoeMiller | 0:02c0c2cbc3df | 449 | |
JoeMiller | 0:02c0c2cbc3df | 450 | int hsize = fread(&fwHeader, 1, FIRMWARE_HEADER_SIZE, fw_h); |
JoeMiller | 0:02c0c2cbc3df | 451 | if ( hsize != FIRMWARE_HEADER_SIZE) { |
JoeMiller | 0:02c0c2cbc3df | 452 | if (displayText) printf("ERROR: File smaller than expected header size %d\n\r", hsize); |
JoeMiller | 0:02c0c2cbc3df | 453 | fclose(fw_h); |
JoeMiller | 0:02c0c2cbc3df | 454 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 455 | } |
JoeMiller | 0:02c0c2cbc3df | 456 | |
JoeMiller | 0:02c0c2cbc3df | 457 | // Validate firmware |
JoeMiller | 0:02c0c2cbc3df | 458 | if (fwHeader.imageSignatureLsb != IMAGE_SIGNATURE_LSB || fwHeader.imageSignatureMsb != IMAGE_SIGNATURE_MSG) { |
JoeMiller | 0:02c0c2cbc3df | 459 | if (displayText) printf("ERROR: Firmware version doesn't match\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 460 | fclose(fw_h); |
JoeMiller | 0:02c0c2cbc3df | 461 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 462 | } |
JoeMiller | 0:02c0c2cbc3df | 463 | |
JoeMiller | 0:02c0c2cbc3df | 464 | // Read the firmware image From the SD Card |
JoeMiller | 0:02c0c2cbc3df | 465 | u8 *fw = (u8 *)malloc(fwHeader.imageLength); |
JoeMiller | 0:02c0c2cbc3df | 466 | u32 firmwareSize = fread(fw, 1, fwHeader.imageLength, fw_h); |
JoeMiller | 0:02c0c2cbc3df | 467 | fclose(fw_h); |
JoeMiller | 0:02c0c2cbc3df | 468 | if (firmwareSize != fwHeader.imageLength || firmwareSize % 4) { |
JoeMiller | 0:02c0c2cbc3df | 469 | if (displayText) printf("ERROR: Firmware size must break on 4 byte boundary\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 470 | free(fw); |
JoeMiller | 0:02c0c2cbc3df | 471 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 472 | } |
JoeMiller | 0:02c0c2cbc3df | 473 | if (displayText) printf("Firmware size = %u\n\r",firmwareSize); |
JoeMiller | 0:02c0c2cbc3df | 474 | |
JoeMiller | 0:02c0c2cbc3df | 475 | |
JoeMiller | 0:02c0c2cbc3df | 476 | u8 headerBytes[FIRMWARE_HEADER_SIZE]; |
JoeMiller | 0:02c0c2cbc3df | 477 | memcpy(headerBytes,(u8*)&fwHeader,FIRMWARE_HEADER_SIZE); // create a bytewise copy of fwHeader |
JoeMiller | 0:02c0c2cbc3df | 478 | |
JoeMiller | 0:02c0c2cbc3df | 479 | |
JoeMiller | 0:02c0c2cbc3df | 480 | /////////////////////////////////////////////////////////////////////////// |
JoeMiller | 0:02c0c2cbc3df | 481 | // Upload firmware to EEPROM |
JoeMiller | 0:02c0c2cbc3df | 482 | /////////////////////////////////////////////////////////////////////////// |
JoeMiller | 0:02c0c2cbc3df | 483 | |
JoeMiller | 0:02c0c2cbc3df | 484 | do { |
JoeMiller | 0:02c0c2cbc3df | 485 | // request SENtral passthrough mode |
JoeMiller | 0:02c0c2cbc3df | 486 | em7186_i2c_write_value(PASS_THROUGH_CFG_REG, 1); |
JoeMiller | 0:02c0c2cbc3df | 487 | em7186_i2c_read(PASS_THROUGH_RDY_REG, buffer, 1); |
JoeMiller | 0:02c0c2cbc3df | 488 | } while((buffer[0] != 1) && (++trys < 20)); |
JoeMiller | 0:02c0c2cbc3df | 489 | |
JoeMiller | 0:02c0c2cbc3df | 490 | |
JoeMiller | 0:02c0c2cbc3df | 491 | if (trys <20) { |
JoeMiller | 0:02c0c2cbc3df | 492 | |
JoeMiller | 0:02c0c2cbc3df | 493 | // Reverse byte order per word |
JoeMiller | 0:02c0c2cbc3df | 494 | |
JoeMiller | 0:02c0c2cbc3df | 495 | |
JoeMiller | 0:02c0c2cbc3df | 496 | if (displayText) printf("SENtral confirmed passthrough mode after %u try(s)\n\r",trys); |
JoeMiller | 0:02c0c2cbc3df | 497 | |
JoeMiller | 0:02c0c2cbc3df | 498 | |
JoeMiller | 0:02c0c2cbc3df | 499 | // write header portion to EEPROM from SDCard |
JoeMiller | 0:02c0c2cbc3df | 500 | //key: EE_Write(u8 I2C_Addr, u16 EE_MemAddr, u8*buffer, u16 length) |
JoeMiller | 0:02c0c2cbc3df | 501 | u32 status = EE_Write(0xA0, 0, (u8*)&fwHeader, FIRMWARE_HEADER_SIZE); |
JoeMiller | 0:02c0c2cbc3df | 502 | if (displayText) printf("Header Sent to EEPROM......\n\r",firmwareSize); |
JoeMiller | 0:02c0c2cbc3df | 503 | wait_ms(5); |
JoeMiller | 0:02c0c2cbc3df | 504 | EE_Read(0xA0, 0, buffer, FIRMWARE_HEADER_SIZE); |
JoeMiller | 0:02c0c2cbc3df | 505 | status = 0; |
JoeMiller | 0:02c0c2cbc3df | 506 | |
JoeMiller | 0:02c0c2cbc3df | 507 | // Readback EEPROM to verify header write |
JoeMiller | 0:02c0c2cbc3df | 508 | for (count = 0; count<FIRMWARE_HEADER_SIZE; count++) { |
JoeMiller | 0:02c0c2cbc3df | 509 | if (headerBytes[count] != buffer[count]) { |
JoeMiller | 0:02c0c2cbc3df | 510 | status = 1; // 1 = fail |
JoeMiller | 0:02c0c2cbc3df | 511 | if (displayText) printf("Failed Header readback from EEPROM at %u, value=%u\n\r",count,headerBytes[count]); |
JoeMiller | 0:02c0c2cbc3df | 512 | break; |
JoeMiller | 0:02c0c2cbc3df | 513 | } |
JoeMiller | 0:02c0c2cbc3df | 514 | } |
JoeMiller | 0:02c0c2cbc3df | 515 | |
JoeMiller | 0:02c0c2cbc3df | 516 | if (!status) { |
JoeMiller | 0:02c0c2cbc3df | 517 | u32 bytesWritten = 0; |
JoeMiller | 0:02c0c2cbc3df | 518 | u32 bytesRemaining = firmwareSize; |
JoeMiller | 0:02c0c2cbc3df | 519 | u8 bytesToWrite, |
JoeMiller | 0:02c0c2cbc3df | 520 | maxI2cWrite = 16; // kind of small but ensures page alignment |
JoeMiller | 0:02c0c2cbc3df | 521 | |
JoeMiller | 0:02c0c2cbc3df | 522 | while (bytesRemaining > 0) { |
JoeMiller | 0:02c0c2cbc3df | 523 | if (bytesRemaining < maxI2cWrite) |
JoeMiller | 0:02c0c2cbc3df | 524 | bytesToWrite = bytesRemaining; |
JoeMiller | 0:02c0c2cbc3df | 525 | else |
JoeMiller | 0:02c0c2cbc3df | 526 | bytesToWrite = maxI2cWrite; |
JoeMiller | 0:02c0c2cbc3df | 527 | |
JoeMiller | 0:02c0c2cbc3df | 528 | if (!EE_Write(0xA0, (bytesWritten+FIRMWARE_HEADER_SIZE), &fw[bytesWritten], bytesToWrite)) { |
JoeMiller | 0:02c0c2cbc3df | 529 | if (displayText) printf("\n\rCould not write to EEPROM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 530 | free(fw); |
JoeMiller | 0:02c0c2cbc3df | 531 | wait_ms(5); |
JoeMiller | 0:02c0c2cbc3df | 532 | em7186_i2c_write_value(PASS_THROUGH_CFG_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 533 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 534 | } |
JoeMiller | 0:02c0c2cbc3df | 535 | bytesWritten += bytesToWrite; |
JoeMiller | 0:02c0c2cbc3df | 536 | bytesRemaining -= bytesToWrite; |
JoeMiller | 0:02c0c2cbc3df | 537 | if (displayText) printf("\r%u",bytesWritten); |
JoeMiller | 0:02c0c2cbc3df | 538 | wait_ms(5); |
JoeMiller | 0:02c0c2cbc3df | 539 | } |
JoeMiller | 0:02c0c2cbc3df | 540 | |
JoeMiller | 0:02c0c2cbc3df | 541 | if (displayText) printf("\n\rFirmware Transfered from SDCard to EEPROM. Now Verifying.....\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 542 | |
JoeMiller | 0:02c0c2cbc3df | 543 | u32 bytesRead = 0; |
JoeMiller | 0:02c0c2cbc3df | 544 | bytesRemaining = firmwareSize; |
JoeMiller | 0:02c0c2cbc3df | 545 | u8 bytesToRead, |
JoeMiller | 0:02c0c2cbc3df | 546 | maxI2cRead = 16; |
JoeMiller | 0:02c0c2cbc3df | 547 | status = 0; |
JoeMiller | 0:02c0c2cbc3df | 548 | |
JoeMiller | 0:02c0c2cbc3df | 549 | while ((bytesRemaining > 0) && (status == 0)) { |
JoeMiller | 0:02c0c2cbc3df | 550 | if (bytesRemaining < maxI2cRead) |
JoeMiller | 0:02c0c2cbc3df | 551 | bytesToRead = bytesRemaining; |
JoeMiller | 0:02c0c2cbc3df | 552 | else |
JoeMiller | 0:02c0c2cbc3df | 553 | bytesToRead = maxI2cRead; |
JoeMiller | 0:02c0c2cbc3df | 554 | |
JoeMiller | 0:02c0c2cbc3df | 555 | if (!EE_Read(0xA0, (bytesRead+FIRMWARE_HEADER_SIZE), buffer, bytesToRead)) { |
JoeMiller | 0:02c0c2cbc3df | 556 | if (displayText) printf("\n\rCould not Read EEPROM\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 557 | free(fw); |
JoeMiller | 0:02c0c2cbc3df | 558 | wait_ms(5); |
JoeMiller | 0:02c0c2cbc3df | 559 | em7186_i2c_write_value(PASS_THROUGH_CFG_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 560 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 561 | } |
JoeMiller | 0:02c0c2cbc3df | 562 | |
JoeMiller | 0:02c0c2cbc3df | 563 | for (count = 0; count<bytesToRead; count++) { |
JoeMiller | 0:02c0c2cbc3df | 564 | if (fw[bytesRead+count] != buffer[count]) { |
JoeMiller | 0:02c0c2cbc3df | 565 | status = 1; // 1 = fail |
JoeMiller | 0:02c0c2cbc3df | 566 | if (displayText) printf("Failed firmware readback from EEPROM at %u, value=%u\n\r",bytesRead+FIRMWARE_HEADER_SIZE+count,buffer[count]); |
JoeMiller | 0:02c0c2cbc3df | 567 | wait_ms(5); |
JoeMiller | 0:02c0c2cbc3df | 568 | em7186_i2c_write_value(PASS_THROUGH_CFG_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 569 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 570 | } |
JoeMiller | 0:02c0c2cbc3df | 571 | } |
JoeMiller | 0:02c0c2cbc3df | 572 | bytesRead += bytesToRead; |
JoeMiller | 0:02c0c2cbc3df | 573 | bytesRemaining -= bytesToRead; |
JoeMiller | 0:02c0c2cbc3df | 574 | if (displayText) printf("\r%u",bytesRead); |
JoeMiller | 0:02c0c2cbc3df | 575 | wait_ms(1); |
JoeMiller | 0:02c0c2cbc3df | 576 | } |
JoeMiller | 0:02c0c2cbc3df | 577 | if(status == 0) |
JoeMiller | 0:02c0c2cbc3df | 578 | { |
JoeMiller | 0:02c0c2cbc3df | 579 | if (displayText) printf("\n\rVerify EEPROM **** SUCCESSFUL *****\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 580 | } |
JoeMiller | 0:02c0c2cbc3df | 581 | } else { |
JoeMiller | 0:02c0c2cbc3df | 582 | if (displayText) printf("\r\nCould not write to EEPROM (Header)\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 583 | wait_ms(5); |
JoeMiller | 0:02c0c2cbc3df | 584 | em7186_i2c_write_value(PASS_THROUGH_CFG_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 585 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 586 | } |
JoeMiller | 0:02c0c2cbc3df | 587 | |
JoeMiller | 0:02c0c2cbc3df | 588 | free(fw); |
JoeMiller | 0:02c0c2cbc3df | 589 | |
JoeMiller | 0:02c0c2cbc3df | 590 | } else { |
JoeMiller | 0:02c0c2cbc3df | 591 | if (displayText) printf("Could not confirm SENtral Passthrough mode\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 592 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 593 | } |
JoeMiller | 0:02c0c2cbc3df | 594 | |
JoeMiller | 0:02c0c2cbc3df | 595 | em7186_i2c_write_value(PASS_THROUGH_CFG_REG, 0); // turn off passthrough mode |
JoeMiller | 0:02c0c2cbc3df | 596 | |
JoeMiller | 0:02c0c2cbc3df | 597 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 598 | } |
JoeMiller | 0:02c0c2cbc3df | 599 | |
JoeMiller | 0:02c0c2cbc3df | 600 | |
JoeMiller | 0:02c0c2cbc3df | 601 | |
JoeMiller | 0:02c0c2cbc3df | 602 | |
JoeMiller | 0:02c0c2cbc3df | 603 | |
JoeMiller | 0:02c0c2cbc3df | 604 | u32 em7186_param_read(u8 *values, u8 page, ParamInfo *paramList, u8 numParams) |
JoeMiller | 0:02c0c2cbc3df | 605 | { |
JoeMiller | 0:02c0c2cbc3df | 606 | |
JoeMiller | 0:02c0c2cbc3df | 607 | u8 i, paramAck, pageSelectValue; |
JoeMiller | 0:02c0c2cbc3df | 608 | u16 valIndex = 0; |
JoeMiller | 0:02c0c2cbc3df | 609 | for (i = 0; i < numParams; i++) |
JoeMiller | 0:02c0c2cbc3df | 610 | { |
JoeMiller | 0:02c0c2cbc3df | 611 | pageSelectValue = page | (paramList[i].size << 4); |
JoeMiller | 0:02c0c2cbc3df | 612 | em7186_i2c_write_value(PARAM_PAGE_SELECT_REG, pageSelectValue); |
JoeMiller | 0:02c0c2cbc3df | 613 | em7186_i2c_write_value(PARAM_REQUEST_REG, paramList[i].paramNo); |
JoeMiller | 0:02c0c2cbc3df | 614 | do |
JoeMiller | 0:02c0c2cbc3df | 615 | { |
JoeMiller | 0:02c0c2cbc3df | 616 | em7186_i2c_read(PARAM_ACK_REG, ¶mAck, 1); |
JoeMiller | 0:02c0c2cbc3df | 617 | if (paramAck == 0x80) |
JoeMiller | 0:02c0c2cbc3df | 618 | { |
JoeMiller | 0:02c0c2cbc3df | 619 | em7186_i2c_write_value(PARAM_REQUEST_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 620 | em7186_i2c_write_value(PARAM_PAGE_SELECT_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 621 | |
JoeMiller | 0:02c0c2cbc3df | 622 | |
JoeMiller | 0:02c0c2cbc3df | 623 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 624 | } |
JoeMiller | 0:02c0c2cbc3df | 625 | } while (paramAck != paramList[i].paramNo); |
JoeMiller | 0:02c0c2cbc3df | 626 | em7186_i2c_read(PARAM_SAVE_REG, &values[valIndex], paramList[i].size); |
JoeMiller | 0:02c0c2cbc3df | 627 | // printf("%u ", values[valIndex]); |
JoeMiller | 0:02c0c2cbc3df | 628 | valIndex += paramList[i].size; |
JoeMiller | 0:02c0c2cbc3df | 629 | } |
JoeMiller | 0:02c0c2cbc3df | 630 | em7186_i2c_write_value(PARAM_REQUEST_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 631 | em7186_i2c_write_value(PARAM_PAGE_SELECT_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 632 | |
JoeMiller | 0:02c0c2cbc3df | 633 | |
JoeMiller | 0:02c0c2cbc3df | 634 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 635 | } |
JoeMiller | 0:02c0c2cbc3df | 636 | u32 em7186_param_write(u8 *values, u8 page, ParamInfo *paramList, u8 numParams) |
JoeMiller | 0:02c0c2cbc3df | 637 | { |
JoeMiller | 0:02c0c2cbc3df | 638 | |
JoeMiller | 0:02c0c2cbc3df | 639 | |
JoeMiller | 0:02c0c2cbc3df | 640 | u8 i, paramAck, paramNum, pageSelectValue; |
JoeMiller | 0:02c0c2cbc3df | 641 | u16 valIndex = 0; |
JoeMiller | 0:02c0c2cbc3df | 642 | for (i = 0; i < numParams; i++) |
JoeMiller | 0:02c0c2cbc3df | 643 | { |
JoeMiller | 0:02c0c2cbc3df | 644 | pageSelectValue = page | (paramList[i].size << 4); |
JoeMiller | 0:02c0c2cbc3df | 645 | em7186_i2c_write_value(PARAM_PAGE_SELECT_REG, pageSelectValue); |
JoeMiller | 0:02c0c2cbc3df | 646 | |
JoeMiller | 0:02c0c2cbc3df | 647 | em7186_i2c_write(PARAM_LOAD_REG, &values[valIndex], (u16)paramList[i].size); |
JoeMiller | 0:02c0c2cbc3df | 648 | |
JoeMiller | 0:02c0c2cbc3df | 649 | paramNum = paramList[i].paramNo | 0x80; |
JoeMiller | 0:02c0c2cbc3df | 650 | em7186_i2c_write_value(PARAM_REQUEST_REG, paramNum); |
JoeMiller | 0:02c0c2cbc3df | 651 | do |
JoeMiller | 0:02c0c2cbc3df | 652 | { |
JoeMiller | 0:02c0c2cbc3df | 653 | em7186_i2c_read(PARAM_ACK_REG, ¶mAck, 1); |
JoeMiller | 0:02c0c2cbc3df | 654 | if (paramAck == 0x80) |
JoeMiller | 0:02c0c2cbc3df | 655 | { |
JoeMiller | 0:02c0c2cbc3df | 656 | em7186_i2c_write_value(PARAM_REQUEST_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 657 | em7186_i2c_write_value(PARAM_PAGE_SELECT_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 658 | |
JoeMiller | 0:02c0c2cbc3df | 659 | |
JoeMiller | 0:02c0c2cbc3df | 660 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 661 | } |
JoeMiller | 0:02c0c2cbc3df | 662 | } while (paramAck != paramNum); |
JoeMiller | 0:02c0c2cbc3df | 663 | |
JoeMiller | 0:02c0c2cbc3df | 664 | valIndex += paramList[i].size; |
JoeMiller | 0:02c0c2cbc3df | 665 | } |
JoeMiller | 0:02c0c2cbc3df | 666 | |
JoeMiller | 0:02c0c2cbc3df | 667 | em7186_i2c_write_value(PARAM_REQUEST_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 668 | em7186_i2c_write_value(PARAM_PAGE_SELECT_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 669 | |
JoeMiller | 0:02c0c2cbc3df | 670 | |
JoeMiller | 0:02c0c2cbc3df | 671 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 672 | } |
JoeMiller | 0:02c0c2cbc3df | 673 | u32 em7186_read_fifo(u8 *buffer) |
JoeMiller | 0:02c0c2cbc3df | 674 | { |
JoeMiller | 0:02c0c2cbc3df | 675 | // Check number of bytes available |
JoeMiller | 0:02c0c2cbc3df | 676 | u16 bytesAvailable, bytesRead = 0; |
JoeMiller | 0:02c0c2cbc3df | 677 | |
JoeMiller | 0:02c0c2cbc3df | 678 | em7186_i2c_read(BYTES_REMANING_REG, (u8*)&bytesAvailable, 2); |
JoeMiller | 0:02c0c2cbc3df | 679 | |
JoeMiller | 0:02c0c2cbc3df | 680 | |
JoeMiller | 0:02c0c2cbc3df | 681 | //printf("FIFO bytesAvailable:%u\n\r",bytesAvailable); |
JoeMiller | 0:02c0c2cbc3df | 682 | |
JoeMiller | 0:02c0c2cbc3df | 683 | |
JoeMiller | 0:02c0c2cbc3df | 684 | |
JoeMiller | 0:02c0c2cbc3df | 685 | #define CONTINUOUS_FIFO_READ |
JoeMiller | 0:02c0c2cbc3df | 686 | #ifdef CONTINUOUS_FIFO_READ |
JoeMiller | 0:02c0c2cbc3df | 687 | bytesRead = em7186_i2c_read(0, buffer, bytesAvailable); |
JoeMiller | 0:02c0c2cbc3df | 688 | #else |
JoeMiller | 0:02c0c2cbc3df | 689 | u16 i, bytesToRead; |
JoeMiller | 0:02c0c2cbc3df | 690 | while (bytesAvailable > 0) |
JoeMiller | 0:02c0c2cbc3df | 691 | { |
JoeMiller | 0:02c0c2cbc3df | 692 | // Break on 50 byte fifo register block |
JoeMiller | 0:02c0c2cbc3df | 693 | bytesToRead = bytesRead % 50 + I2C_MAX_READ > 50 ? 50 - bytesRead % 50 : I2C_MAX_READ; |
JoeMiller | 0:02c0c2cbc3df | 694 | // Make sure we don't read more than is available in the fifo |
JoeMiller | 0:02c0c2cbc3df | 695 | bytesToRead = min(bytesAvailable, bytesToRead); |
JoeMiller | 0:02c0c2cbc3df | 696 | if (!em7186_i2c_read(bytesRead % 50, &buffer[bytesRead], bytesToRead)) |
JoeMiller | 0:02c0c2cbc3df | 697 | { |
JoeMiller | 0:02c0c2cbc3df | 698 | |
JoeMiller | 0:02c0c2cbc3df | 699 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 700 | } |
JoeMiller | 0:02c0c2cbc3df | 701 | bytesAvailable -= bytesToRead; |
JoeMiller | 0:02c0c2cbc3df | 702 | bytesRead += bytesToRead; |
JoeMiller | 0:02c0c2cbc3df | 703 | } |
JoeMiller | 0:02c0c2cbc3df | 704 | #endif |
JoeMiller | 0:02c0c2cbc3df | 705 | |
JoeMiller | 0:02c0c2cbc3df | 706 | //printf("FIFO bytesRead:%u\n\r",bytesRead); |
JoeMiller | 0:02c0c2cbc3df | 707 | |
JoeMiller | 0:02c0c2cbc3df | 708 | return bytesRead; |
JoeMiller | 0:02c0c2cbc3df | 709 | } |
JoeMiller | 0:02c0c2cbc3df | 710 | u32 em7186_parse_next_fifo_block(u8* buffer, u32 size) |
JoeMiller | 0:02c0c2cbc3df | 711 | { |
JoeMiller | 0:02c0c2cbc3df | 712 | u8 sensorId = buffer[0]; |
JoeMiller | 0:02c0c2cbc3df | 713 | |
JoeMiller | 0:02c0c2cbc3df | 714 | // if (sensorId < SENSOR_TYPE_ACCELEROMETER_WAKE || |
JoeMiller | 0:02c0c2cbc3df | 715 | // sensorId == SENSOR_TYPE_DEBUG || |
JoeMiller | 0:02c0c2cbc3df | 716 | // sensorId == SENSOR_TYPE_TIMESTAMP || |
JoeMiller | 0:02c0c2cbc3df | 717 | // sensorId == SENSOR_TYPE_TIMESTAMP_OVERFLOW || |
JoeMiller | 0:02c0c2cbc3df | 718 | // sensorId == SENSOR_TYPE_META || |
JoeMiller | 0:02c0c2cbc3df | 719 | // sensorId == SENSOR_TYPE_RAW_GYRO || |
JoeMiller | 0:02c0c2cbc3df | 720 | // sensorId == SENSOR_TYPE_RAW_MAG || |
JoeMiller | 0:02c0c2cbc3df | 721 | // sensorId == SENSOR_TYPE_RAW_ACCEL |
JoeMiller | 0:02c0c2cbc3df | 722 | // ) |
JoeMiller | 0:02c0c2cbc3df | 723 | // { |
JoeMiller | 0:02c0c2cbc3df | 724 | // } |
JoeMiller | 0:02c0c2cbc3df | 725 | // else |
JoeMiller | 0:02c0c2cbc3df | 726 | // { |
JoeMiller | 0:02c0c2cbc3df | 727 | // timestamp = timestampWake; |
JoeMiller | 0:02c0c2cbc3df | 728 | // timestampPtr = (u16*)×tampWake; |
JoeMiller | 0:02c0c2cbc3df | 729 | // } |
JoeMiller | 0:02c0c2cbc3df | 730 | |
JoeMiller | 0:02c0c2cbc3df | 731 | switch(sensorId) |
JoeMiller | 0:02c0c2cbc3df | 732 | { |
JoeMiller | 0:02c0c2cbc3df | 733 | case 0: |
JoeMiller | 0:02c0c2cbc3df | 734 | { |
JoeMiller | 0:02c0c2cbc3df | 735 | //printf("Padding: %d\n\r", size); |
JoeMiller | 0:02c0c2cbc3df | 736 | return size; |
JoeMiller | 0:02c0c2cbc3df | 737 | } |
JoeMiller | 0:02c0c2cbc3df | 738 | case SENSOR_TYPE_ACCELEROMETER: |
JoeMiller | 0:02c0c2cbc3df | 739 | case SENSOR_TYPE_ACCELEROMETER_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 740 | case SENSOR_TYPE_MAGNETIC_FIELD: |
JoeMiller | 0:02c0c2cbc3df | 741 | case SENSOR_TYPE_MAGNETIC_FIELD_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 742 | case SENSOR_TYPE_GYROSCOPE: |
JoeMiller | 0:02c0c2cbc3df | 743 | case SENSOR_TYPE_GYROSCOPE_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 744 | case SENSOR_TYPE_GRAVITY: |
JoeMiller | 0:02c0c2cbc3df | 745 | case SENSOR_TYPE_GRAVITY_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 746 | case SENSOR_TYPE_LINEAR_ACCELERATION: |
JoeMiller | 0:02c0c2cbc3df | 747 | case SENSOR_TYPE_LINEAR_ACCELERATION_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 748 | case SENSOR_TYPE_ORIENTATION: |
JoeMiller | 0:02c0c2cbc3df | 749 | case SENSOR_TYPE_ORIENTATION_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 750 | { |
JoeMiller | 0:02c0c2cbc3df | 751 | SensorData3Axis sensorData; |
JoeMiller | 0:02c0c2cbc3df | 752 | get_3_axis_sensor_data(&sensorData, em7186_sensor_scale[sensorId], buffer); |
JoeMiller | 0:02c0c2cbc3df | 753 | if (printData) printf("%u %s: %f, %f, %f, %f\n\r", timestamp,em7186_sensor_name[sensorId], sensorData.x, sensorData.y, sensorData.z, sensorData.extra); |
JoeMiller | 0:02c0c2cbc3df | 754 | if (logData) fprintf(flog,"%u,%u,%f,%f,%f,%f\n", timestamp,sensorId, sensorData.x, sensorData.y, sensorData.z, sensorData.extra); |
JoeMiller | 0:02c0c2cbc3df | 755 | |
JoeMiller | 0:02c0c2cbc3df | 756 | return 8; |
JoeMiller | 0:02c0c2cbc3df | 757 | } |
JoeMiller | 0:02c0c2cbc3df | 758 | case SENSOR_TYPE_LIGHT: |
JoeMiller | 0:02c0c2cbc3df | 759 | case SENSOR_TYPE_LIGHT_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 760 | case SENSOR_TYPE_PROXIMITY: |
JoeMiller | 0:02c0c2cbc3df | 761 | case SENSOR_TYPE_PROXIMITY_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 762 | case SENSOR_TYPE_RELATIVE_HUMIDITY: |
JoeMiller | 0:02c0c2cbc3df | 763 | case SENSOR_TYPE_RELATIVE_HUMIDITY_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 764 | case SENSOR_TYPE_ACTIVITY: |
JoeMiller | 0:02c0c2cbc3df | 765 | case SENSOR_TYPE_ACTIVITY_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 766 | { |
JoeMiller | 0:02c0c2cbc3df | 767 | float sensorData = (float)((buffer[2] << 8) + buffer[1]) * em7186_sensor_scale[sensorId]; |
JoeMiller | 0:02c0c2cbc3df | 768 | if (printData) printf("%u %s: %fLux\n\r", timestamp,em7186_sensor_name[sensorId], sensorData); |
JoeMiller | 0:02c0c2cbc3df | 769 | if (logData) fprintf(flog,"%u,%u,%u,%f\n",timestamp, sensorId, sensorData); |
JoeMiller | 0:02c0c2cbc3df | 770 | return 3; |
JoeMiller | 0:02c0c2cbc3df | 771 | } |
JoeMiller | 0:02c0c2cbc3df | 772 | case SENSOR_TYPE_PRESSURE: |
JoeMiller | 0:02c0c2cbc3df | 773 | case SENSOR_TYPE_PRESSURE_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 774 | { |
JoeMiller | 0:02c0c2cbc3df | 775 | float pressure = (float)((buffer[3] << 16) + (buffer[2] << 8) + buffer[1]) * em7186_sensor_scale[sensorId]; |
JoeMiller | 0:02c0c2cbc3df | 776 | if (printData) printf("%u %s: %fPa\n\r", timestamp, em7186_sensor_name[sensorId], pressure); |
JoeMiller | 0:02c0c2cbc3df | 777 | if (logData) fprintf(flog,"%u,%u,%f\n",timestamp,sensorId,pressure); |
JoeMiller | 0:02c0c2cbc3df | 778 | return 4; |
JoeMiller | 0:02c0c2cbc3df | 779 | } |
JoeMiller | 0:02c0c2cbc3df | 780 | case SENSOR_TYPE_TEMPERATURE: |
JoeMiller | 0:02c0c2cbc3df | 781 | case SENSOR_TYPE_TEMPERATURE_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 782 | case SENSOR_TYPE_AMBIENT_TEMPERATURE: |
JoeMiller | 0:02c0c2cbc3df | 783 | case SENSOR_TYPE_AMBIENT_TEMPERATURE_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 784 | { |
JoeMiller | 0:02c0c2cbc3df | 785 | s16 *sensorData = (s16*)&buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 786 | float temp = (float)(sensorData[0]) * em7186_sensor_scale[sensorId]; |
JoeMiller | 0:02c0c2cbc3df | 787 | if (printData) printf("%u %s: %fC\n\r", timestamp, em7186_sensor_name[sensorId], temp); |
JoeMiller | 0:02c0c2cbc3df | 788 | if (logData) fprintf(flog,"%u,%u,%f\n",timestamp,sensorId, temp); |
JoeMiller | 0:02c0c2cbc3df | 789 | return 3; |
JoeMiller | 0:02c0c2cbc3df | 790 | } |
JoeMiller | 0:02c0c2cbc3df | 791 | case SENSOR_TYPE_ROTATION_VECTOR: |
JoeMiller | 0:02c0c2cbc3df | 792 | case SENSOR_TYPE_ROTATION_VECTOR_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 793 | case SENSOR_TYPE_GAME_ROTATION_VECTOR: |
JoeMiller | 0:02c0c2cbc3df | 794 | case SENSOR_TYPE_GAME_ROTATION_VECTOR_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 795 | case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR: |
JoeMiller | 0:02c0c2cbc3df | 796 | case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 797 | case SENSOR_TYPE_PDR: |
JoeMiller | 0:02c0c2cbc3df | 798 | case SENSOR_TYPE_PDR_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 799 | case 60: |
JoeMiller | 0:02c0c2cbc3df | 800 | { |
JoeMiller | 0:02c0c2cbc3df | 801 | SensorData4Axis rotationVector; |
JoeMiller | 0:02c0c2cbc3df | 802 | get_rotation_vector(&rotationVector, em7186_sensor_scale[sensorId], buffer); |
JoeMiller | 0:02c0c2cbc3df | 803 | if (printData) printf("%u %s: %f, %f, %f, %f, %f\n\r", timestamp, em7186_sensor_name[sensorId], rotationVector.x, rotationVector.y, rotationVector.z, rotationVector.w, rotationVector.extra); |
JoeMiller | 0:02c0c2cbc3df | 804 | if (logData) fprintf(flog,"%u,%u,%f,%f,%f,%f,%f\n", timestamp,sensorId, rotationVector.x, rotationVector.y, rotationVector.z, rotationVector.w, rotationVector.extra); |
JoeMiller | 0:02c0c2cbc3df | 805 | return 11; |
JoeMiller | 0:02c0c2cbc3df | 806 | } |
JoeMiller | 0:02c0c2cbc3df | 807 | case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: |
JoeMiller | 0:02c0c2cbc3df | 808 | case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 809 | case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: |
JoeMiller | 0:02c0c2cbc3df | 810 | case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 811 | { |
JoeMiller | 0:02c0c2cbc3df | 812 | SensorData6Axis sensorDataUncal; |
JoeMiller | 0:02c0c2cbc3df | 813 | get_3_axis_uncal_sensor_data(&sensorDataUncal, em7186_sensor_scale[sensorId], buffer); |
JoeMiller | 0:02c0c2cbc3df | 814 | if (printData) printf("%u %s: %f, %f, %f, %f, %f, %f, %f\n\r", timestamp, em7186_sensor_name[sensorId], sensorDataUncal.x, sensorDataUncal.y, sensorDataUncal.z, sensorDataUncal.x_bias, sensorDataUncal.y_bias, sensorDataUncal.z_bias, sensorDataUncal.extra); |
JoeMiller | 0:02c0c2cbc3df | 815 | if (logData) fprintf(flog,"%u,%u,%f,%f,%f,%f,%f,%f,%f\n", timestamp,sensorId, sensorDataUncal.x, sensorDataUncal.y, sensorDataUncal.z, sensorDataUncal.x_bias, sensorDataUncal.y_bias, sensorDataUncal.z_bias, sensorDataUncal.extra); |
JoeMiller | 0:02c0c2cbc3df | 816 | return 14; |
JoeMiller | 0:02c0c2cbc3df | 817 | } |
JoeMiller | 0:02c0c2cbc3df | 818 | case SENSOR_TYPE_STEP_COUNTER: |
JoeMiller | 0:02c0c2cbc3df | 819 | case SENSOR_TYPE_STEP_COUNTER_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 820 | { |
JoeMiller | 0:02c0c2cbc3df | 821 | u16 sensorData = (buffer[2] << 8) + buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 822 | if (printData) printf("%u %s: %u\n\r", timestamp, em7186_sensor_name[sensorId], sensorData); |
JoeMiller | 0:02c0c2cbc3df | 823 | if (logData) fprintf(flog,"%u,%u,%u\n", timestamp,sensorId, sensorData); |
JoeMiller | 0:02c0c2cbc3df | 824 | return 3; |
JoeMiller | 0:02c0c2cbc3df | 825 | } |
JoeMiller | 0:02c0c2cbc3df | 826 | case SENSOR_TYPE_HEART_RATE: |
JoeMiller | 0:02c0c2cbc3df | 827 | case SENSOR_TYPE_HEART_RATE_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 828 | { |
JoeMiller | 0:02c0c2cbc3df | 829 | u8 sensorData = buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 830 | |
JoeMiller | 0:02c0c2cbc3df | 831 | // Heart Rate |
JoeMiller | 0:02c0c2cbc3df | 832 | if (printData) printf("%u %s: %u\n\r", timestamp, em7186_sensor_name[sensorId], sensorData); |
JoeMiller | 0:02c0c2cbc3df | 833 | if (logData) fprintf(flog,"%u,%u,%u\n",timestamp,sensorId, sensorData); |
JoeMiller | 0:02c0c2cbc3df | 834 | return 3; |
JoeMiller | 0:02c0c2cbc3df | 835 | } |
JoeMiller | 0:02c0c2cbc3df | 836 | case SENSOR_TYPE_CAR_MAG_DATA: |
JoeMiller | 0:02c0c2cbc3df | 837 | case SENSOR_TYPE_CAR_MAG_DATA_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 838 | { |
JoeMiller | 0:02c0c2cbc3df | 839 | // u8 SensorId, float[3] RawMagData, u8 Status, u8 expansion data |
JoeMiller | 0:02c0c2cbc3df | 840 | float RawMagData[3]; |
JoeMiller | 0:02c0c2cbc3df | 841 | memcpy(RawMagData, &buffer[1], sizeof(RawMagData)); |
JoeMiller | 0:02c0c2cbc3df | 842 | |
JoeMiller | 0:02c0c2cbc3df | 843 | if (printData) printf("%u Car Detect Mag Data = %3.3f,%3.3f,%3.3f\n\r", timestamp, RawMagData[0], RawMagData[1], RawMagData[2]); |
JoeMiller | 0:02c0c2cbc3df | 844 | if (logData) fprintf(flog,"%u,%u,%f,%f,%f\n", timestamp,sensorId, RawMagData[0], RawMagData[1], RawMagData[2]); |
JoeMiller | 0:02c0c2cbc3df | 845 | |
JoeMiller | 0:02c0c2cbc3df | 846 | return 15; |
JoeMiller | 0:02c0c2cbc3df | 847 | } |
JoeMiller | 0:02c0c2cbc3df | 848 | |
JoeMiller | 0:02c0c2cbc3df | 849 | case SENSOR_TYPE_SIGNIFICANT_MOTION: |
JoeMiller | 0:02c0c2cbc3df | 850 | case SENSOR_TYPE_SIGNIFICANT_MOTION_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 851 | case SENSOR_TYPE_STEP_DETECTOR: |
JoeMiller | 0:02c0c2cbc3df | 852 | case SENSOR_TYPE_STEP_DETECTOR_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 853 | case SENSOR_TYPE_TILT_DETECTOR: |
JoeMiller | 0:02c0c2cbc3df | 854 | case SENSOR_TYPE_TILT_DETECTOR_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 855 | case SENSOR_TYPE_PICK_UP_GESTURE: |
JoeMiller | 0:02c0c2cbc3df | 856 | case SENSOR_TYPE_PICK_UP_GESTURE_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 857 | case SENSOR_TYPE_WAKE_GESTURE: |
JoeMiller | 0:02c0c2cbc3df | 858 | case SENSOR_TYPE_WAKE_GESTURE_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 859 | { |
JoeMiller | 0:02c0c2cbc3df | 860 | if (printData) printf("%u %s\n\r", timestamp, em7186_sensor_name[sensorId]); |
JoeMiller | 0:02c0c2cbc3df | 861 | if (logData) fprintf(flog,"%u,%u\n", timestamp,sensorId); |
JoeMiller | 0:02c0c2cbc3df | 862 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 863 | } |
JoeMiller | 0:02c0c2cbc3df | 864 | case SENSOR_TYPE_TIMESTAMP: |
JoeMiller | 0:02c0c2cbc3df | 865 | case SENSOR_TYPE_TIMESTAMP_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 866 | { |
JoeMiller | 0:02c0c2cbc3df | 867 | u16* uPacket = (u16*)&buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 868 | timestampPtr[0] = uPacket[0]; |
JoeMiller | 0:02c0c2cbc3df | 869 | timestamp = *(u32*)timestampPtr; |
JoeMiller | 0:02c0c2cbc3df | 870 | return 3; |
JoeMiller | 0:02c0c2cbc3df | 871 | } |
JoeMiller | 0:02c0c2cbc3df | 872 | case SENSOR_TYPE_TIMESTAMP_OVERFLOW: |
JoeMiller | 0:02c0c2cbc3df | 873 | case SENSOR_TYPE_TIMESTAMP_OVERFLOW_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 874 | { |
JoeMiller | 0:02c0c2cbc3df | 875 | u16* uPacket = (u16*)&buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 876 | timestampPtr[1] = uPacket[0]; |
JoeMiller | 0:02c0c2cbc3df | 877 | timestampPtr[0] = 0; |
JoeMiller | 0:02c0c2cbc3df | 878 | timestamp = *(u32*)timestampPtr; |
JoeMiller | 0:02c0c2cbc3df | 879 | return 3; |
JoeMiller | 0:02c0c2cbc3df | 880 | } |
JoeMiller | 0:02c0c2cbc3df | 881 | case SENSOR_TYPE_META: |
JoeMiller | 0:02c0c2cbc3df | 882 | case SENSOR_TYPE_META_WAKE: |
JoeMiller | 0:02c0c2cbc3df | 883 | { |
JoeMiller | 0:02c0c2cbc3df | 884 | if (reportMetaData) |
JoeMiller | 0:02c0c2cbc3df | 885 | { |
JoeMiller | 0:02c0c2cbc3df | 886 | if (printData) |
JoeMiller | 0:02c0c2cbc3df | 887 | { |
JoeMiller | 0:02c0c2cbc3df | 888 | if (sensorId == SENSOR_TYPE_META_WAKE) |
JoeMiller | 0:02c0c2cbc3df | 889 | { |
JoeMiller | 0:02c0c2cbc3df | 890 | printf("%u WAKEUP %s:, %s/%u, %u\n\r", timestamp, em7186_meta_event_name[buffer[1]], em7186_sensor_name[buffer[2]],buffer[2], buffer[3]); |
JoeMiller | 0:02c0c2cbc3df | 891 | } |
JoeMiller | 0:02c0c2cbc3df | 892 | else |
JoeMiller | 0:02c0c2cbc3df | 893 | { |
JoeMiller | 0:02c0c2cbc3df | 894 | printf("%u %s: %s/%u, %u\n\r", timestamp, em7186_meta_event_name[buffer[1]], em7186_sensor_name[buffer[2]], buffer[2], buffer[3]); |
JoeMiller | 0:02c0c2cbc3df | 895 | // special hook for sample script |
JoeMiller | 0:02c0c2cbc3df | 896 | if (buffer[2] == 14) |
JoeMiller | 0:02c0c2cbc3df | 897 | { |
JoeMiller | 0:02c0c2cbc3df | 898 | if (buffer[3] == 0 ) { |
JoeMiller | 0:02c0c2cbc3df | 899 | green_LED = 1; |
JoeMiller | 0:02c0c2cbc3df | 900 | printf("PASS **** The RM3100 Magnetometer ASIC and sensors are operating properly\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 901 | } else { |
JoeMiller | 0:02c0c2cbc3df | 902 | green_LED = 1; |
JoeMiller | 0:02c0c2cbc3df | 903 | wait(0.1); |
JoeMiller | 0:02c0c2cbc3df | 904 | green_LED = 0; |
JoeMiller | 0:02c0c2cbc3df | 905 | printf("FAIL **** The RM3100 Magnetometer ASIC and sensors fail code = %u\n\r",buffer[3]); |
JoeMiller | 0:02c0c2cbc3df | 906 | } |
JoeMiller | 0:02c0c2cbc3df | 907 | } |
JoeMiller | 0:02c0c2cbc3df | 908 | } |
JoeMiller | 0:02c0c2cbc3df | 909 | } |
JoeMiller | 0:02c0c2cbc3df | 910 | if (logData) fprintf(flog,"%u,%u,%u,%u,%u\n",timestamp,sensorId, buffer[1],buffer[2],buffer[3]); |
JoeMiller | 0:02c0c2cbc3df | 911 | } |
JoeMiller | 0:02c0c2cbc3df | 912 | return 4; |
JoeMiller | 0:02c0c2cbc3df | 913 | } |
JoeMiller | 0:02c0c2cbc3df | 914 | case SENSOR_TYPE_RAW_ACCEL: |
JoeMiller | 0:02c0c2cbc3df | 915 | case SENSOR_TYPE_RAW_GYRO: |
JoeMiller | 0:02c0c2cbc3df | 916 | SensorData3Axis sensorData; |
JoeMiller | 0:02c0c2cbc3df | 917 | float* fPacket = (float*)&buffer[7]; |
JoeMiller | 0:02c0c2cbc3df | 918 | sensorData.x = 256 * (s8)buffer[2] + buffer[1]; //s16 will convert to float here |
JoeMiller | 0:02c0c2cbc3df | 919 | sensorData.y = 256 * (s8)buffer[4] + buffer[3]; |
JoeMiller | 0:02c0c2cbc3df | 920 | sensorData.z = 256 * (s8)buffer[6] + buffer[5]; |
JoeMiller | 0:02c0c2cbc3df | 921 | sensorData.extra = fPacket[0]; |
JoeMiller | 0:02c0c2cbc3df | 922 | if (printData) printf("%u %s: %3.0f, %3.0f, %3.0f, %3.1f\n\r", timestamp, em7186_sensor_name[sensorId], sensorData.x, sensorData.y, sensorData.z, sensorData.extra); |
JoeMiller | 0:02c0c2cbc3df | 923 | if (logData) fprintf(flog,"%u,%u,%f,%f,%f,%f\n", timestamp,sensorId, sensorData.x, sensorData.y, sensorData.z, sensorData.extra); |
JoeMiller | 0:02c0c2cbc3df | 924 | return 11; |
JoeMiller | 0:02c0c2cbc3df | 925 | case SENSOR_TYPE_RAW_MAG: //jm modified to s32 for RM3100 |
JoeMiller | 0:02c0c2cbc3df | 926 | { |
JoeMiller | 0:02c0c2cbc3df | 927 | SensorData3Axis sensorData; |
JoeMiller | 0:02c0c2cbc3df | 928 | //s32* sPacket = (s32*)&buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 929 | float* fPacket = (float*)&buffer[1]; |
JoeMiller | 0:02c0c2cbc3df | 930 | //sensorData.x = sPacket[0]; //s32 will convert to float here |
JoeMiller | 0:02c0c2cbc3df | 931 | //sensorData.y = sPacket[1]; |
JoeMiller | 0:02c0c2cbc3df | 932 | //sensorData.z = sPacket[2]; |
JoeMiller | 0:02c0c2cbc3df | 933 | sensorData.x = (float)(buffer[1] + 256 * (buffer[2] + 256 * (buffer[3] + 256 * (buffer[4])))); //s32 will convert to float here |
JoeMiller | 0:02c0c2cbc3df | 934 | sensorData.y = buffer[5] + 256 * (buffer[6] + 256 * (buffer[7] + 256 * (buffer[8]))); |
JoeMiller | 0:02c0c2cbc3df | 935 | sensorData.z = buffer[9] + 256 * (buffer[10] + 256 * (buffer[11] + 256 * (buffer[12]))); |
JoeMiller | 0:02c0c2cbc3df | 936 | sensorData.extra = fPacket[3]; |
JoeMiller | 0:02c0c2cbc3df | 937 | if (printData) printf("%u %s: %f, %f, %f\n\r", timestamp, em7186_sensor_name[sensorId], sensorData.x, sensorData.y, sensorData.z); |
JoeMiller | 0:02c0c2cbc3df | 938 | if (logData) fprintf(flog,"%u,%u,%f,%f,%f\n", timestamp,sensorId, sensorData.x, sensorData.y, sensorData.z); |
JoeMiller | 0:02c0c2cbc3df | 939 | return 17; |
JoeMiller | 0:02c0c2cbc3df | 940 | } |
JoeMiller | 0:02c0c2cbc3df | 941 | case SENSOR_TYPE_DEBUG: |
JoeMiller | 0:02c0c2cbc3df | 942 | { |
JoeMiller | 0:02c0c2cbc3df | 943 | u8 packetSize = buffer[1] & 0x3F; |
JoeMiller | 0:02c0c2cbc3df | 944 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 945 | for (i = 0; i < packetSize; i++) |
JoeMiller | 0:02c0c2cbc3df | 946 | { |
JoeMiller | 0:02c0c2cbc3df | 947 | if (printData) printf("%c", (u8)buffer[2 + i]); |
JoeMiller | 0:02c0c2cbc3df | 948 | } |
JoeMiller | 0:02c0c2cbc3df | 949 | return 14; |
JoeMiller | 0:02c0c2cbc3df | 950 | } |
JoeMiller | 0:02c0c2cbc3df | 951 | default: |
JoeMiller | 0:02c0c2cbc3df | 952 | { |
JoeMiller | 0:02c0c2cbc3df | 953 | // Parsing error or unkown sensor type. Clear out the rest of the |
JoeMiller | 0:02c0c2cbc3df | 954 | // buffer and start clean on the next read. |
JoeMiller | 0:02c0c2cbc3df | 955 | if (printData) printf("%u Other: 0x%x: %d bytes skipped\n\r", timestamp, buffer[0], size); |
JoeMiller | 0:02c0c2cbc3df | 956 | break; |
JoeMiller | 0:02c0c2cbc3df | 957 | } |
JoeMiller | 0:02c0c2cbc3df | 958 | |
JoeMiller | 0:02c0c2cbc3df | 959 | } // end switch(sensorId) |
JoeMiller | 0:02c0c2cbc3df | 960 | |
JoeMiller | 0:02c0c2cbc3df | 961 | return 0; |
JoeMiller | 0:02c0c2cbc3df | 962 | } |
JoeMiller | 0:02c0c2cbc3df | 963 | u32 em7186_parse_fifo(u8* buffer, u32 size) |
JoeMiller | 0:02c0c2cbc3df | 964 | { |
JoeMiller | 0:02c0c2cbc3df | 965 | u32 index = 0; |
JoeMiller | 0:02c0c2cbc3df | 966 | u32 bytesUsed; |
JoeMiller | 0:02c0c2cbc3df | 967 | u32 bytesRemaining = size; |
JoeMiller | 0:02c0c2cbc3df | 968 | |
JoeMiller | 0:02c0c2cbc3df | 969 | //if (displayText) printf("FIFO #Bytes to parse:%u\n\r",bytesRemaining); |
JoeMiller | 0:02c0c2cbc3df | 970 | |
JoeMiller | 0:02c0c2cbc3df | 971 | |
JoeMiller | 0:02c0c2cbc3df | 972 | if (size == 0) return size; |
JoeMiller | 0:02c0c2cbc3df | 973 | |
JoeMiller | 0:02c0c2cbc3df | 974 | do { |
JoeMiller | 0:02c0c2cbc3df | 975 | bytesUsed = em7186_parse_next_fifo_block(&buffer[index], bytesRemaining); |
JoeMiller | 0:02c0c2cbc3df | 976 | index += bytesUsed; |
JoeMiller | 0:02c0c2cbc3df | 977 | bytesRemaining -= bytesUsed; |
JoeMiller | 0:02c0c2cbc3df | 978 | } while (bytesUsed > 0 && bytesRemaining > 0); |
JoeMiller | 0:02c0c2cbc3df | 979 | |
JoeMiller | 0:02c0c2cbc3df | 980 | return size - bytesRemaining; |
JoeMiller | 0:02c0c2cbc3df | 981 | } |
JoeMiller | 0:02c0c2cbc3df | 982 | u32 em7186_set_sensor_rate(u8 sensorId, u16 rate) |
JoeMiller | 0:02c0c2cbc3df | 983 | { |
JoeMiller | 0:02c0c2cbc3df | 984 | #ifdef BHI160 |
JoeMiller | 0:02c0c2cbc3df | 985 | u8 paramPage = PARAM_PAGE_SENSOR_INFO; |
JoeMiller | 0:02c0c2cbc3df | 986 | ParamInfo param[] = { sensorId + 64, 2 }; |
JoeMiller | 0:02c0c2cbc3df | 987 | #else |
JoeMiller | 0:02c0c2cbc3df | 988 | u8 paramPage = PARAM_PAGE_SENSOR_CONF; |
JoeMiller | 0:02c0c2cbc3df | 989 | ParamInfo param[] = { sensorId, 2 }; |
JoeMiller | 0:02c0c2cbc3df | 990 | #endif |
JoeMiller | 0:02c0c2cbc3df | 991 | return em7186_param_write((u8*)&rate, paramPage, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 992 | } |
JoeMiller | 0:02c0c2cbc3df | 993 | |
JoeMiller | 0:02c0c2cbc3df | 994 | |
JoeMiller | 0:02c0c2cbc3df | 995 | u32 em7186_set_sensor_delay(u8 sensorId, u16 delay) |
JoeMiller | 0:02c0c2cbc3df | 996 | { |
JoeMiller | 0:02c0c2cbc3df | 997 | #ifdef BHI160 |
JoeMiller | 0:02c0c2cbc3df | 998 | u8 paramPage = PARAM_PAGE_SENSOR_INFO; |
JoeMiller | 0:02c0c2cbc3df | 999 | ParamInfo param[] = { sensorId + 64, 2 }; |
JoeMiller | 0:02c0c2cbc3df | 1000 | #else |
JoeMiller | 0:02c0c2cbc3df | 1001 | u8 paramPage = PARAM_PAGE_SENSOR_CONF; |
JoeMiller | 0:02c0c2cbc3df | 1002 | ParamInfo param[] = { sensorId, 2 }; |
JoeMiller | 0:02c0c2cbc3df | 1003 | #endif |
JoeMiller | 0:02c0c2cbc3df | 1004 | u16 config[2]; |
JoeMiller | 0:02c0c2cbc3df | 1005 | |
JoeMiller | 0:02c0c2cbc3df | 1006 | em7186_param_read((u8*)config, paramPage, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1007 | config[1] = delay; |
JoeMiller | 0:02c0c2cbc3df | 1008 | return em7186_param_write((u8*)config, paramPage, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1009 | } |
JoeMiller | 0:02c0c2cbc3df | 1010 | u32 em7186_set_meta_event(u8 eventId, u8 enable, u8 enableInt) |
JoeMiller | 0:02c0c2cbc3df | 1011 | { |
JoeMiller | 0:02c0c2cbc3df | 1012 | unsigned long metaEventBits; |
JoeMiller | 0:02c0c2cbc3df | 1013 | ParamInfo param[] = { 1, 8 }; |
JoeMiller | 0:02c0c2cbc3df | 1014 | |
JoeMiller | 0:02c0c2cbc3df | 1015 | em7186_param_read((u8*)&metaEventBits, PARAM_PAGE_SYSTEM, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1016 | unsigned long bitMask = !(0x03 << ((eventId - 1) * 2)); |
JoeMiller | 0:02c0c2cbc3df | 1017 | unsigned long setting = ((enable ? 0x02 : 0x00) | (enableInt ? 0x01 : 0x00)) << ((eventId - 1) * 2); |
JoeMiller | 0:02c0c2cbc3df | 1018 | metaEventBits = (metaEventBits & bitMask) | setting; |
JoeMiller | 0:02c0c2cbc3df | 1019 | em7186_param_write((u8*)&metaEventBits, PARAM_PAGE_SYSTEM, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1020 | |
JoeMiller | 0:02c0c2cbc3df | 1021 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 1022 | } |
JoeMiller | 0:02c0c2cbc3df | 1023 | u8 em7186_set_scale_factors() |
JoeMiller | 0:02c0c2cbc3df | 1024 | { |
JoeMiller | 0:02c0c2cbc3df | 1025 | // Fixed range |
JoeMiller | 0:02c0c2cbc3df | 1026 | em7186_sensor_scale[SENSOR_TYPE_ORIENTATION_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1027 | em7186_sensor_scale[SENSOR_TYPE_ORIENTATION] = |
JoeMiller | 0:02c0c2cbc3df | 1028 | 360.0f / powf(2.0f, 15.0f); // Fixed |
JoeMiller | 0:02c0c2cbc3df | 1029 | |
JoeMiller | 0:02c0c2cbc3df | 1030 | em7186_sensor_scale[SENSOR_TYPE_ROTATION_VECTOR] = |
JoeMiller | 0:02c0c2cbc3df | 1031 | em7186_sensor_scale[SENSOR_TYPE_ROTATION_VECTOR_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1032 | em7186_sensor_scale[SENSOR_TYPE_GAME_ROTATION_VECTOR] = |
JoeMiller | 0:02c0c2cbc3df | 1033 | em7186_sensor_scale[SENSOR_TYPE_GAME_ROTATION_VECTOR_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1034 | em7186_sensor_scale[SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR] = |
JoeMiller | 0:02c0c2cbc3df | 1035 | em7186_sensor_scale[SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1036 | em7186_sensor_scale[SENSOR_TYPE_PDR] = |
JoeMiller | 0:02c0c2cbc3df | 1037 | em7186_sensor_scale[SENSOR_TYPE_PDR_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1038 | em7186_sensor_scale[60] = |
JoeMiller | 0:02c0c2cbc3df | 1039 | 1.0f / powf(2.0f, 14.0f); // Fixed |
JoeMiller | 0:02c0c2cbc3df | 1040 | |
JoeMiller | 0:02c0c2cbc3df | 1041 | |
JoeMiller | 0:02c0c2cbc3df | 1042 | |
JoeMiller | 0:02c0c2cbc3df | 1043 | // Can change during system operation (if desired) |
JoeMiller | 0:02c0c2cbc3df | 1044 | float accelDynamicRange = 4.0f; // g |
JoeMiller | 6:4ba3f9a8191f | 1045 | float magDynamicRange = 1000.0f; // uT |
JoeMiller | 0:02c0c2cbc3df | 1046 | float gyroDynamicRange = 2000.0f; // d/s |
JoeMiller | 0:02c0c2cbc3df | 1047 | |
JoeMiller | 0:02c0c2cbc3df | 1048 | // Change depending on dynamic range |
JoeMiller | 0:02c0c2cbc3df | 1049 | em7186_sensor_scale[SENSOR_TYPE_ACCELEROMETER] = |
JoeMiller | 0:02c0c2cbc3df | 1050 | em7186_sensor_scale[SENSOR_TYPE_ACCELEROMETER_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1051 | em7186_sensor_scale[SENSOR_TYPE_GRAVITY] = |
JoeMiller | 0:02c0c2cbc3df | 1052 | em7186_sensor_scale[SENSOR_TYPE_GRAVITY_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1053 | em7186_sensor_scale[SENSOR_TYPE_LINEAR_ACCELERATION] = |
JoeMiller | 0:02c0c2cbc3df | 1054 | em7186_sensor_scale[SENSOR_TYPE_LINEAR_ACCELERATION_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1055 | 9.81f * accelDynamicRange / powf(2.0f, 15.0f); |
JoeMiller | 0:02c0c2cbc3df | 1056 | |
JoeMiller | 0:02c0c2cbc3df | 1057 | em7186_sensor_scale[SENSOR_TYPE_MAGNETIC_FIELD] = |
JoeMiller | 0:02c0c2cbc3df | 1058 | em7186_sensor_scale[SENSOR_TYPE_MAGNETIC_FIELD_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1059 | em7186_sensor_scale[SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED] = |
JoeMiller | 0:02c0c2cbc3df | 1060 | em7186_sensor_scale[SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1061 | magDynamicRange / powf(2.0f, 15.0f); |
JoeMiller | 0:02c0c2cbc3df | 1062 | |
JoeMiller | 0:02c0c2cbc3df | 1063 | em7186_sensor_scale[SENSOR_TYPE_GYROSCOPE] = |
JoeMiller | 0:02c0c2cbc3df | 1064 | em7186_sensor_scale[SENSOR_TYPE_GYROSCOPE_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1065 | em7186_sensor_scale[SENSOR_TYPE_GYROSCOPE_UNCALIBRATED] = |
JoeMiller | 0:02c0c2cbc3df | 1066 | em7186_sensor_scale[SENSOR_TYPE_GYROSCOPE_UNCALIBRATED_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1067 | (3.1415927f / 180.0f) * gyroDynamicRange / powf(2.0f, 15.0f); |
JoeMiller | 0:02c0c2cbc3df | 1068 | |
JoeMiller | 0:02c0c2cbc3df | 1069 | // Could change depending on dynamic range of physical sensor |
JoeMiller | 0:02c0c2cbc3df | 1070 | em7186_sensor_scale[SENSOR_TYPE_PRESSURE] = |
JoeMiller | 0:02c0c2cbc3df | 1071 | em7186_sensor_scale[SENSOR_TYPE_PRESSURE_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1072 | 1.0f / 128.0f; // Subject to change |
JoeMiller | 0:02c0c2cbc3df | 1073 | |
JoeMiller | 0:02c0c2cbc3df | 1074 | em7186_sensor_scale[SENSOR_TYPE_LIGHT] = |
JoeMiller | 0:02c0c2cbc3df | 1075 | em7186_sensor_scale[SENSOR_TYPE_LIGHT_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1076 | 10000.0f / powf(2.0f, 16.0f); // Subject to change |
JoeMiller | 0:02c0c2cbc3df | 1077 | |
JoeMiller | 0:02c0c2cbc3df | 1078 | em7186_sensor_scale[SENSOR_TYPE_PROXIMITY] = |
JoeMiller | 0:02c0c2cbc3df | 1079 | em7186_sensor_scale[SENSOR_TYPE_PROXIMITY_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1080 | 100.0f / powf(2.0f, 16.0f); // Subject to change |
JoeMiller | 0:02c0c2cbc3df | 1081 | |
JoeMiller | 0:02c0c2cbc3df | 1082 | em7186_sensor_scale[SENSOR_TYPE_RELATIVE_HUMIDITY] = |
JoeMiller | 0:02c0c2cbc3df | 1083 | em7186_sensor_scale[SENSOR_TYPE_RELATIVE_HUMIDITY_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1084 | 100.0f / powf(2.0f, 16.0f); // Subject to change |
JoeMiller | 0:02c0c2cbc3df | 1085 | |
JoeMiller | 0:02c0c2cbc3df | 1086 | em7186_sensor_scale[SENSOR_TYPE_TEMPERATURE] = |
JoeMiller | 0:02c0c2cbc3df | 1087 | em7186_sensor_scale[SENSOR_TYPE_TEMPERATURE_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1088 | em7186_sensor_scale[SENSOR_TYPE_AMBIENT_TEMPERATURE] = |
JoeMiller | 0:02c0c2cbc3df | 1089 | em7186_sensor_scale[SENSOR_TYPE_AMBIENT_TEMPERATURE_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1090 | 150.0f / powf(2.0f, 15.0f); // Subject to change |
JoeMiller | 0:02c0c2cbc3df | 1091 | |
JoeMiller | 0:02c0c2cbc3df | 1092 | em7186_sensor_scale[SENSOR_TYPE_ACTIVITY] = |
JoeMiller | 0:02c0c2cbc3df | 1093 | em7186_sensor_scale[SENSOR_TYPE_ACTIVITY_WAKE] = |
JoeMiller | 0:02c0c2cbc3df | 1094 | 1.0f; |
JoeMiller | 0:02c0c2cbc3df | 1095 | |
JoeMiller | 0:02c0c2cbc3df | 1096 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 1097 | } |
JoeMiller | 0:02c0c2cbc3df | 1098 | |
JoeMiller | 0:02c0c2cbc3df | 1099 | /* |
JoeMiller | 0:02c0c2cbc3df | 1100 | // Warm start parameter transfer. The parameter list and flags are presently going |
JoeMiller | 0:02c0c2cbc3df | 1101 | // through a major revision therefore, these functions are now on hold |
JoeMiller | 0:02c0c2cbc3df | 1102 | |
JoeMiller | 0:02c0c2cbc3df | 1103 | u32 em7186_warm_start_load(const char *filename) |
JoeMiller | 0:02c0c2cbc3df | 1104 | { |
JoeMiller | 0:02c0c2cbc3df | 1105 | FILE *fin; |
JoeMiller | 0:02c0c2cbc3df | 1106 | fin = fopen(filename, "rb"); |
JoeMiller | 0:02c0c2cbc3df | 1107 | if (!fin) return 0; |
JoeMiller | 0:02c0c2cbc3df | 1108 | WarmStartParams warmStartParams; |
JoeMiller | 0:02c0c2cbc3df | 1109 | fread(&warmStartParams, 1, sizeof(warmStartParams), fin); |
JoeMiller | 0:02c0c2cbc3df | 1110 | fclose(fin); |
JoeMiller | 0:02c0c2cbc3df | 1111 | |
JoeMiller | 0:02c0c2cbc3df | 1112 | em7186_param_write((u8*)&warmStartParams, PARAM_PAGE_WARM_START, warmStartList, sizeof(warmStartList) / sizeof(warmStartList[0])); |
JoeMiller | 0:02c0c2cbc3df | 1113 | |
JoeMiller | 0:02c0c2cbc3df | 1114 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 1115 | } |
JoeMiller | 0:02c0c2cbc3df | 1116 | u32 em7186_warm_start_save(const char *filename) |
JoeMiller | 0:02c0c2cbc3df | 1117 | { |
JoeMiller | 0:02c0c2cbc3df | 1118 | WarmStartParams warmStartParams; |
JoeMiller | 0:02c0c2cbc3df | 1119 | em7186_param_read((u8*)&warmStartParams, PARAM_PAGE_WARM_START, warmStartList, sizeof(warmStartList) / sizeof(warmStartList[0])); |
JoeMiller | 0:02c0c2cbc3df | 1120 | |
JoeMiller | 0:02c0c2cbc3df | 1121 | FILE *fout; |
JoeMiller | 0:02c0c2cbc3df | 1122 | fout = fopen(filename, "wb"); |
JoeMiller | 0:02c0c2cbc3df | 1123 | if (!fout) return 0; |
JoeMiller | 0:02c0c2cbc3df | 1124 | fwrite(&warmStartParams, 1, sizeof(warmStartParams), fout); |
JoeMiller | 0:02c0c2cbc3df | 1125 | fclose(fout); |
JoeMiller | 0:02c0c2cbc3df | 1126 | if (displayText) printf("Warm start parmeters Saved to warmstart.dat\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1127 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 1128 | }*/ |
JoeMiller | 0:02c0c2cbc3df | 1129 | |
JoeMiller | 0:02c0c2cbc3df | 1130 | |
JoeMiller | 0:02c0c2cbc3df | 1131 | |
JoeMiller | 0:02c0c2cbc3df | 1132 | //========================================================================= |
JoeMiller | 0:02c0c2cbc3df | 1133 | // Additional Control Functions |
JoeMiller | 0:02c0c2cbc3df | 1134 | //========================================================================= |
JoeMiller | 0:02c0c2cbc3df | 1135 | u32 em7186_ap_suspend(u8 suspend) |
JoeMiller | 0:02c0c2cbc3df | 1136 | { |
JoeMiller | 0:02c0c2cbc3df | 1137 | u32 status = 0; |
JoeMiller | 0:02c0c2cbc3df | 1138 | |
JoeMiller | 0:02c0c2cbc3df | 1139 | if (suspend) status = em7186_i2c_write_value(HOST_INTERFACE_CTRL_REG, HOST_INTERFACE_CTRL_AP_SUSPEND); |
JoeMiller | 0:02c0c2cbc3df | 1140 | else status = em7186_i2c_write_value(HOST_INTERFACE_CTRL_REG, 0); |
JoeMiller | 0:02c0c2cbc3df | 1141 | |
JoeMiller | 0:02c0c2cbc3df | 1142 | return status; |
JoeMiller | 0:02c0c2cbc3df | 1143 | } |
JoeMiller | 0:02c0c2cbc3df | 1144 | |
JoeMiller | 0:02c0c2cbc3df | 1145 | u32 em7186_flush_sensor(u8 sensorId) |
JoeMiller | 0:02c0c2cbc3df | 1146 | { |
JoeMiller | 0:02c0c2cbc3df | 1147 | return em7186_i2c_write_value(FIFO_FLUSH_REG, sensorId); |
JoeMiller | 0:02c0c2cbc3df | 1148 | } |
JoeMiller | 0:02c0c2cbc3df | 1149 | |
JoeMiller | 0:02c0c2cbc3df | 1150 | void disableSensors() |
JoeMiller | 0:02c0c2cbc3df | 1151 | { |
JoeMiller | 0:02c0c2cbc3df | 1152 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 1153 | for ( i = 0; i<64 ;i++) |
JoeMiller | 0:02c0c2cbc3df | 1154 | { |
JoeMiller | 0:02c0c2cbc3df | 1155 | if (sensorEnabled[i] == TRUE) |
JoeMiller | 0:02c0c2cbc3df | 1156 | { |
JoeMiller | 0:02c0c2cbc3df | 1157 | em7186_set_sensor_rate(sensorEnabled[i+1], 0); |
JoeMiller | 0:02c0c2cbc3df | 1158 | sensorEnabled[i] = FALSE; |
JoeMiller | 0:02c0c2cbc3df | 1159 | } |
JoeMiller | 0:02c0c2cbc3df | 1160 | } |
JoeMiller | 0:02c0c2cbc3df | 1161 | } |
JoeMiller | 0:02c0c2cbc3df | 1162 | |
JoeMiller | 0:02c0c2cbc3df | 1163 | u32 em7186_set_fifo_watermarks(u16 minRemainingWakeFifo, u16 minRemainingNonWakeFifo) |
JoeMiller | 0:02c0c2cbc3df | 1164 | { |
JoeMiller | 0:02c0c2cbc3df | 1165 | // if min remaining values are non-zero the watermark will be set that many bytes from the end of the fifo. |
JoeMiller | 0:02c0c2cbc3df | 1166 | // if a zero value is used the watermark is disabled. |
JoeMiller | 0:02c0c2cbc3df | 1167 | u16 config[4]; |
JoeMiller | 0:02c0c2cbc3df | 1168 | ParamInfo param[1] = { { PARAM_FIFO_CONTROL, 8 } }; |
JoeMiller | 0:02c0c2cbc3df | 1169 | |
JoeMiller | 0:02c0c2cbc3df | 1170 | em7186_param_read((u8*)config, PARAM_PAGE_SYSTEM, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1171 | config[0] = minRemainingWakeFifo ? config[1] - minRemainingWakeFifo : 0; |
JoeMiller | 0:02c0c2cbc3df | 1172 | config[2] = minRemainingNonWakeFifo ? config[3] - minRemainingNonWakeFifo : 0; |
JoeMiller | 0:02c0c2cbc3df | 1173 | return em7186_param_write((u8*)config, PARAM_PAGE_SYSTEM, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1174 | } |
JoeMiller | 0:02c0c2cbc3df | 1175 | |
JoeMiller | 0:02c0c2cbc3df | 1176 | u32 em7186_enable_raw_sensors(u8 enableMag, u8 enableAccel, u8 enableGyro) |
JoeMiller | 0:02c0c2cbc3df | 1177 | { |
JoeMiller | 0:02c0c2cbc3df | 1178 | u8 value = 0x00; |
JoeMiller | 0:02c0c2cbc3df | 1179 | if (enableMag) value |= 0x04; |
JoeMiller | 0:02c0c2cbc3df | 1180 | if (enableAccel) value |= 0x01; |
JoeMiller | 0:02c0c2cbc3df | 1181 | if (enableGyro) value |= 0x02; |
JoeMiller | 0:02c0c2cbc3df | 1182 | |
JoeMiller | 0:02c0c2cbc3df | 1183 | ParamInfo param[1] = { { 127, 1 } }; |
JoeMiller | 0:02c0c2cbc3df | 1184 | |
JoeMiller | 0:02c0c2cbc3df | 1185 | em7186_param_write(&value, PARAM_PAGE_WARM_START, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1186 | |
JoeMiller | 0:02c0c2cbc3df | 1187 | return 1; |
JoeMiller | 0:02c0c2cbc3df | 1188 | } |
JoeMiller | 0:02c0c2cbc3df | 1189 | |
JoeMiller | 0:02c0c2cbc3df | 1190 | void resetCpu() |
JoeMiller | 0:02c0c2cbc3df | 1191 | { |
JoeMiller | 0:02c0c2cbc3df | 1192 | disableSensors(); |
JoeMiller | 0:02c0c2cbc3df | 1193 | em7186_i2c_write_value(0xB6, 63); |
JoeMiller | 0:02c0c2cbc3df | 1194 | } |
JoeMiller | 0:02c0c2cbc3df | 1195 | |
JoeMiller | 0:02c0c2cbc3df | 1196 | u32 paramListSize(ParamInfo *paramList, u8 numParams) |
JoeMiller | 0:02c0c2cbc3df | 1197 | { |
JoeMiller | 0:02c0c2cbc3df | 1198 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 1199 | u32 size = 0; |
JoeMiller | 0:02c0c2cbc3df | 1200 | for (i = 0; i < numParams; i++) |
JoeMiller | 0:02c0c2cbc3df | 1201 | { |
JoeMiller | 0:02c0c2cbc3df | 1202 | size += paramList[i].size; |
JoeMiller | 0:02c0c2cbc3df | 1203 | } |
JoeMiller | 0:02c0c2cbc3df | 1204 | return size; |
JoeMiller | 0:02c0c2cbc3df | 1205 | } |
JoeMiller | 0:02c0c2cbc3df | 1206 | |
JoeMiller | 0:02c0c2cbc3df | 1207 | void displaySavedParams(u8 *values, ParamInfo *paramList, u8 numParams) |
JoeMiller | 0:02c0c2cbc3df | 1208 | { |
JoeMiller | 0:02c0c2cbc3df | 1209 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 1210 | u16 valueIndex = 0; |
JoeMiller | 0:02c0c2cbc3df | 1211 | for (i = 0; i < numParams; i++) |
JoeMiller | 0:02c0c2cbc3df | 1212 | { |
JoeMiller | 0:02c0c2cbc3df | 1213 | float* floatVals = (float*)&values[valueIndex]; |
JoeMiller | 0:02c0c2cbc3df | 1214 | u32* hexVals = (u32*)&values[valueIndex]; |
JoeMiller | 0:02c0c2cbc3df | 1215 | |
JoeMiller | 0:02c0c2cbc3df | 1216 | if (paramList[i].size >= 4) |
JoeMiller | 0:02c0c2cbc3df | 1217 | { |
JoeMiller | 0:02c0c2cbc3df | 1218 | printf("%d 1: %f, %08x\n\r", paramList[i].paramNo, floatVals[0], hexVals[0]); |
JoeMiller | 0:02c0c2cbc3df | 1219 | } |
JoeMiller | 0:02c0c2cbc3df | 1220 | if (paramList[i].size >= 8) |
JoeMiller | 0:02c0c2cbc3df | 1221 | { |
JoeMiller | 0:02c0c2cbc3df | 1222 | printf("%d 2: %f, %08x\n\r", paramList[i].paramNo, floatVals[1], hexVals[1]); |
JoeMiller | 0:02c0c2cbc3df | 1223 | } |
JoeMiller | 0:02c0c2cbc3df | 1224 | if (paramList[i].size == 1) |
JoeMiller | 0:02c0c2cbc3df | 1225 | { |
JoeMiller | 0:02c0c2cbc3df | 1226 | u8* hexVals = (u8*)&values[valueIndex]; |
JoeMiller | 0:02c0c2cbc3df | 1227 | printf("%d 1: %d\n\r", paramList[i].paramNo, hexVals[0]); |
JoeMiller | 0:02c0c2cbc3df | 1228 | } |
JoeMiller | 0:02c0c2cbc3df | 1229 | valueIndex += paramList[i].size; |
JoeMiller | 0:02c0c2cbc3df | 1230 | } |
JoeMiller | 0:02c0c2cbc3df | 1231 | } |
JoeMiller | 0:02c0c2cbc3df | 1232 | |
JoeMiller | 0:02c0c2cbc3df | 1233 | void displayParams(u8 paramPage, ParamInfo *paramList, u8 numParams) |
JoeMiller | 0:02c0c2cbc3df | 1234 | { |
JoeMiller | 0:02c0c2cbc3df | 1235 | u32 size = paramListSize(paramList, numParams); |
JoeMiller | 0:02c0c2cbc3df | 1236 | u8 *values = (u8 *)malloc(size); |
JoeMiller | 0:02c0c2cbc3df | 1237 | em7186_param_read(values, paramPage, paramList, numParams); |
JoeMiller | 0:02c0c2cbc3df | 1238 | displaySavedParams(values, paramList, numParams); |
JoeMiller | 0:02c0c2cbc3df | 1239 | free(values); |
JoeMiller | 0:02c0c2cbc3df | 1240 | } |
JoeMiller | 0:02c0c2cbc3df | 1241 | |
JoeMiller | 0:02c0c2cbc3df | 1242 | /* |
JoeMiller | 0:02c0c2cbc3df | 1243 | // Warm start parameter transfer. The parameter list and flags are presently going |
JoeMiller | 0:02c0c2cbc3df | 1244 | // through a major revision therefore, these functions are now on hold |
JoeMiller | 0:02c0c2cbc3df | 1245 | |
JoeMiller | 0:02c0c2cbc3df | 1246 | void warmStart() |
JoeMiller | 0:02c0c2cbc3df | 1247 | { |
JoeMiller | 0:02c0c2cbc3df | 1248 | // Save warm start params |
JoeMiller | 0:02c0c2cbc3df | 1249 | em7186_warm_start_save(warmStartFile); |
JoeMiller | 0:02c0c2cbc3df | 1250 | |
JoeMiller | 0:02c0c2cbc3df | 1251 | if (displayText) printf("\n\r\n\r-------------------- CPU Reset -------------------------------------\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1252 | // Reset the cpu |
JoeMiller | 0:02c0c2cbc3df | 1253 | resetCpu(); |
JoeMiller | 0:02c0c2cbc3df | 1254 | |
JoeMiller | 0:02c0c2cbc3df | 1255 | if (displayText) printf("\n\r\n\r---------------- Parameters after reset ----------------------------\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1256 | // Read the warmstart params after reset |
JoeMiller | 0:02c0c2cbc3df | 1257 | displayParams(2, warmStartList, sizeof(warmStartList) / sizeof(warmStartList[0])); |
JoeMiller | 0:02c0c2cbc3df | 1258 | |
JoeMiller | 0:02c0c2cbc3df | 1259 | if (displayText) printf("\n\r\n\r---------------- Parameters after upload----------------------------\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1260 | // Load warmstart parameters |
JoeMiller | 0:02c0c2cbc3df | 1261 | em7186_warm_start_load(warmStartFile); |
JoeMiller | 0:02c0c2cbc3df | 1262 | |
JoeMiller | 0:02c0c2cbc3df | 1263 | // Read the warmstart params after warmstart |
JoeMiller | 0:02c0c2cbc3df | 1264 | displayParams(2, warmStartList, sizeof(warmStartList) / sizeof(warmStartList[0])); |
JoeMiller | 0:02c0c2cbc3df | 1265 | }*/ |
JoeMiller | 0:02c0c2cbc3df | 1266 | |
JoeMiller | 0:02c0c2cbc3df | 1267 | char* strBits(void const * const ptr, u8 numBytes, char* str) |
JoeMiller | 0:02c0c2cbc3df | 1268 | { |
JoeMiller | 0:02c0c2cbc3df | 1269 | u8 *bytes = (u8*)ptr; |
JoeMiller | 0:02c0c2cbc3df | 1270 | u8 i, j; |
JoeMiller | 0:02c0c2cbc3df | 1271 | for (i = 0; i < numBytes; i++) |
JoeMiller | 0:02c0c2cbc3df | 1272 | { |
JoeMiller | 0:02c0c2cbc3df | 1273 | for (j = 0; j < 8; j++) |
JoeMiller | 0:02c0c2cbc3df | 1274 | { |
JoeMiller | 0:02c0c2cbc3df | 1275 | str[i * 8 + (7 - j)] = bytes[(numBytes - 1) - i] & (1 << j) ? '1' : '0'; |
JoeMiller | 0:02c0c2cbc3df | 1276 | } |
JoeMiller | 0:02c0c2cbc3df | 1277 | } |
JoeMiller | 0:02c0c2cbc3df | 1278 | str[numBytes * 8] = '\0'; |
JoeMiller | 0:02c0c2cbc3df | 1279 | return str; |
JoeMiller | 0:02c0c2cbc3df | 1280 | } |
JoeMiller | 0:02c0c2cbc3df | 1281 | |
JoeMiller | 0:02c0c2cbc3df | 1282 | void displayStatusRegisters() |
JoeMiller | 0:02c0c2cbc3df | 1283 | { |
JoeMiller | 0:02c0c2cbc3df | 1284 | u8 buf[4]; |
JoeMiller | 0:02c0c2cbc3df | 1285 | char str[17]; |
JoeMiller | 0:02c0c2cbc3df | 1286 | printf("\n------------ Displaying Status Registers -----------\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1287 | em7186_i2c_read(HOST_STATUS_REG, buf, 3); |
JoeMiller | 0:02c0c2cbc3df | 1288 | printf("Host Status: % 5u, %s\n\r", buf[0], strBits(&buf[0], sizeof(buf[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1289 | printf("Interrupt Status: % 5u, %s\n\r", buf[1], strBits(&buf[1], sizeof(buf[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1290 | printf("Chip Status: % 5u, %s\n\r", buf[2], strBits(&buf[2], sizeof(buf[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1291 | em7186_i2c_read(ERR_REG, buf, 4); |
JoeMiller | 0:02c0c2cbc3df | 1292 | printf("Error Register: % 5u, %s\n\r", buf[0], strBits(&buf[0], sizeof(buf[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1293 | printf("Interrupt State: % 5u, %s\n\r", buf[1], strBits(&buf[1], sizeof(buf[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1294 | printf("Debug Value: % 5u, %s\n\r", buf[2], strBits(&buf[2], sizeof(buf[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1295 | printf("Debug State: % 5u, %s\n\r", buf[3], strBits(&buf[3], sizeof(buf[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1296 | em7186_i2c_read(BYTES_REMANING_REG, buf, 2); |
JoeMiller | 0:02c0c2cbc3df | 1297 | u16* v = (u16*)&buf; |
JoeMiller | 0:02c0c2cbc3df | 1298 | printf("Bytes Remaining: % 5u, %s\n\n\r", v[0], strBits(&v[0], sizeof(v[0]), str)); |
JoeMiller | 0:02c0c2cbc3df | 1299 | } |
JoeMiller | 0:02c0c2cbc3df | 1300 | |
JoeMiller | 0:02c0c2cbc3df | 1301 | void displaySensorStatusBits(u8 id, const SensorStatus *status) |
JoeMiller | 0:02c0c2cbc3df | 1302 | { |
JoeMiller | 0:02c0c2cbc3df | 1303 | printf("|% 4u | % 4u | % 4u | % 4u | % 4u | % 4u | % 4u |\n\r", |
JoeMiller | 0:02c0c2cbc3df | 1304 | id, status->dataAvailable, status->i2cNack, status->deviceIdError, |
JoeMiller | 0:02c0c2cbc3df | 1305 | status->transientError, status->dataLost, status->powerMode); |
JoeMiller | 0:02c0c2cbc3df | 1306 | } |
JoeMiller | 0:02c0c2cbc3df | 1307 | |
JoeMiller | 0:02c0c2cbc3df | 1308 | void displaySensorStatus() |
JoeMiller | 0:02c0c2cbc3df | 1309 | { |
JoeMiller | 0:02c0c2cbc3df | 1310 | SensorStatus sensorStatus[32]; |
JoeMiller | 0:02c0c2cbc3df | 1311 | ParamInfo param[] = { PARAM_SENSOR_STATUS_BANK_0, 32 }; |
JoeMiller | 0:02c0c2cbc3df | 1312 | em7186_param_read((u8*)sensorStatus, PARAM_PAGE_SYSTEM, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1313 | printf("+------------------------------------------------------------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1314 | printf("| SENSOR STATUS |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1315 | printf("+-----+-----------+------+--------+-----------+------+-------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1316 | printf("| ID | Data | I2C | DEVICE | Transient | Data | Power |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1317 | printf("| | Available | NACK | ID ERR | Error | Lost | Mode |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1318 | printf("+-----+-----------+------+--------+-----------+------+-------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1319 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 1320 | for (i = 0; i < 32; i++) |
JoeMiller | 0:02c0c2cbc3df | 1321 | { |
JoeMiller | 0:02c0c2cbc3df | 1322 | displaySensorStatusBits(i + 1, &sensorStatus[i]); |
JoeMiller | 0:02c0c2cbc3df | 1323 | } |
JoeMiller | 0:02c0c2cbc3df | 1324 | param[0].paramNo = PARAM_SENSOR_STATUS_BANK_0 + 4; |
JoeMiller | 0:02c0c2cbc3df | 1325 | em7186_param_read((u8*)sensorStatus, PARAM_PAGE_SYSTEM, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1326 | for (i = 0; i < 16; i++) |
JoeMiller | 0:02c0c2cbc3df | 1327 | { |
JoeMiller | 0:02c0c2cbc3df | 1328 | displaySensorStatusBits(i + 65, &sensorStatus[i]); |
JoeMiller | 0:02c0c2cbc3df | 1329 | } |
JoeMiller | 0:02c0c2cbc3df | 1330 | printf("+-----+-----------+------+--------+-----------+------+-------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1331 | |
JoeMiller | 0:02c0c2cbc3df | 1332 | } |
JoeMiller | 0:02c0c2cbc3df | 1333 | |
JoeMiller | 0:02c0c2cbc3df | 1334 | void getPhysicalSensorStatus() |
JoeMiller | 0:02c0c2cbc3df | 1335 | { |
JoeMiller | 0:02c0c2cbc3df | 1336 | ParamInfo param[] = { PARAM_PHYSICAL_SENSOR_STATUS, 15 }; |
JoeMiller | 0:02c0c2cbc3df | 1337 | em7186_param_read((u8*)&physicalSensorStatus, PARAM_PAGE_SYSTEM, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1338 | } |
JoeMiller | 0:02c0c2cbc3df | 1339 | |
JoeMiller | 0:02c0c2cbc3df | 1340 | void displayPhysicalSensorStatus() |
JoeMiller | 0:02c0c2cbc3df | 1341 | { |
JoeMiller | 0:02c0c2cbc3df | 1342 | getPhysicalSensorStatus(); |
JoeMiller | 0:02c0c2cbc3df | 1343 | printf("+----------------------------------------------------------------------------------------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1344 | printf("| PHYSICAL SENSOR STATUS |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1345 | printf("+--------+--------+---------+-----+-----------+------+--------+-----------+------+-------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1346 | printf("| Sensor | Sample | Dynamic | ID | Data | I2C | DEVICE | Transient | Data | Power |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1347 | printf("| | Rate | Range | | Available | NACK | ID ERR | Error | Lost | Mode |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1348 | printf("+--------+--------+---------+-----+-----------+------+--------+-----------+------+-------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1349 | |
JoeMiller | 0:02c0c2cbc3df | 1350 | printf("| Accel | % 4u | % 4u ", physicalSensorStatus.accel.sampleRate, physicalSensorStatus.accel.dynamicRange); |
JoeMiller | 0:02c0c2cbc3df | 1351 | displaySensorStatusBits(1, &physicalSensorStatus.accel.status); |
JoeMiller | 0:02c0c2cbc3df | 1352 | |
JoeMiller | 0:02c0c2cbc3df | 1353 | printf("| Gyro | % 4u | % 4u ", physicalSensorStatus.gyro.sampleRate, physicalSensorStatus.gyro.dynamicRange); |
JoeMiller | 0:02c0c2cbc3df | 1354 | displaySensorStatusBits(2, &physicalSensorStatus.gyro.status); |
JoeMiller | 0:02c0c2cbc3df | 1355 | |
JoeMiller | 0:02c0c2cbc3df | 1356 | printf("| Mag | % 4u | % 4u ", physicalSensorStatus.mag.sampleRate, physicalSensorStatus.mag.dynamicRange); |
JoeMiller | 0:02c0c2cbc3df | 1357 | displaySensorStatusBits(3, &physicalSensorStatus.mag.status); |
JoeMiller | 0:02c0c2cbc3df | 1358 | printf("+--------+--------+---------+-----+-----------+------+--------+-----------+------+-------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1359 | } |
JoeMiller | 0:02c0c2cbc3df | 1360 | void displayPhysicalSensorInformation() |
JoeMiller | 0:02c0c2cbc3df | 1361 | { |
JoeMiller | 0:02c0c2cbc3df | 1362 | typedef struct |
JoeMiller | 0:02c0c2cbc3df | 1363 | { |
JoeMiller | 0:02c0c2cbc3df | 1364 | u8 sensorType; |
JoeMiller | 0:02c0c2cbc3df | 1365 | u8 driverId; |
JoeMiller | 0:02c0c2cbc3df | 1366 | u8 driverVersion; |
JoeMiller | 0:02c0c2cbc3df | 1367 | u8 current; |
JoeMiller | 0:02c0c2cbc3df | 1368 | u16 currentDynamicRange; |
JoeMiller | 0:02c0c2cbc3df | 1369 | u8 flags; |
JoeMiller | 0:02c0c2cbc3df | 1370 | u8 reserved; |
JoeMiller | 0:02c0c2cbc3df | 1371 | u16 currentRate; |
JoeMiller | 0:02c0c2cbc3df | 1372 | u8 numAxes; |
JoeMiller | 0:02c0c2cbc3df | 1373 | u8 orientationMatrix[5]; |
JoeMiller | 0:02c0c2cbc3df | 1374 | } PhysicalSensorInformation; |
JoeMiller | 0:02c0c2cbc3df | 1375 | |
JoeMiller | 0:02c0c2cbc3df | 1376 | PhysicalSensorInformation s; |
JoeMiller | 0:02c0c2cbc3df | 1377 | |
JoeMiller | 0:02c0c2cbc3df | 1378 | u64 physicalSensorPresent = 0; |
JoeMiller | 0:02c0c2cbc3df | 1379 | ParamInfo param = { 32, 4 }; |
JoeMiller | 0:02c0c2cbc3df | 1380 | em7186_param_read((u8*)&physicalSensorPresent, PARAM_PAGE_SYSTEM, ¶m, 1); |
JoeMiller | 0:02c0c2cbc3df | 1381 | |
JoeMiller | 0:02c0c2cbc3df | 1382 | u32 i; |
JoeMiller | 0:02c0c2cbc3df | 1383 | param.size = 16; |
JoeMiller | 0:02c0c2cbc3df | 1384 | |
JoeMiller | 0:02c0c2cbc3df | 1385 | printf("\n+----------------------------------+--------+---------+-------+---------+------------+------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1386 | printf("| Sensor | Driver | Driver | Power | Current | Current | Num |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1387 | printf("| | ID | Version | | Range | Rate | Axes |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1388 | printf("+----------------------------------+--------+---------+-------+---------+------------+------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1389 | for (i = 0; i < 64; i++) |
JoeMiller | 0:02c0c2cbc3df | 1390 | { |
JoeMiller | 0:02c0c2cbc3df | 1391 | if (physicalSensorPresent & (1LL << i)) |
JoeMiller | 0:02c0c2cbc3df | 1392 | { |
JoeMiller | 0:02c0c2cbc3df | 1393 | param.paramNo = i+32; |
JoeMiller | 0:02c0c2cbc3df | 1394 | em7186_param_read((u8*)&s, PARAM_PAGE_SYSTEM, ¶m, 1); |
JoeMiller | 0:02c0c2cbc3df | 1395 | printf("| %-32s | % 4u | % 4u | % 4u | % 4u | % 4u | % 4u |\n\r", |
JoeMiller | 0:02c0c2cbc3df | 1396 | em7186_sensor_name[s.sensorType], s.driverId, s.driverVersion, s.current, s.currentDynamicRange, s.currentRate, s.numAxes); |
JoeMiller | 0:02c0c2cbc3df | 1397 | } |
JoeMiller | 0:02c0c2cbc3df | 1398 | } |
JoeMiller | 0:02c0c2cbc3df | 1399 | printf("+----------------------------------+--------+---------+-------+---------+------------+------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1400 | } |
JoeMiller | 0:02c0c2cbc3df | 1401 | |
JoeMiller | 0:02c0c2cbc3df | 1402 | void getSensorInformation() |
JoeMiller | 0:02c0c2cbc3df | 1403 | { |
JoeMiller | 0:02c0c2cbc3df | 1404 | em7186_param_read((u8*)sensorInformation, PARAM_PAGE_SENSOR_INFO, sensorInfoParamList, sizeof(sensorInfoParamList) / sizeof(sensorInfoParamList[0])); |
JoeMiller | 0:02c0c2cbc3df | 1405 | haveSensorInfo = 1; |
JoeMiller | 0:02c0c2cbc3df | 1406 | |
JoeMiller | 0:02c0c2cbc3df | 1407 | magMaxRate = sensorInformation[SENSOR_TYPE_MAGNETIC_FIELD].maxRate; |
JoeMiller | 0:02c0c2cbc3df | 1408 | accelMaxRate = sensorInformation[SENSOR_TYPE_ACCELEROMETER].maxRate; |
JoeMiller | 0:02c0c2cbc3df | 1409 | gyroMaxRate = sensorInformation[SENSOR_TYPE_GYROSCOPE].maxRate; |
JoeMiller | 0:02c0c2cbc3df | 1410 | } |
JoeMiller | 0:02c0c2cbc3df | 1411 | |
JoeMiller | 0:02c0c2cbc3df | 1412 | void getSensorConfiguration() |
JoeMiller | 0:02c0c2cbc3df | 1413 | { |
JoeMiller | 0:02c0c2cbc3df | 1414 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 1415 | ParamInfo param[1] = { 0, 8 }; |
JoeMiller | 0:02c0c2cbc3df | 1416 | for (i = 1; i<sizeof(sensorInformation) / sizeof(sensorInformation[0]); i++) |
JoeMiller | 0:02c0c2cbc3df | 1417 | { |
JoeMiller | 0:02c0c2cbc3df | 1418 | if (sensorInformation[i].sensorId > 0) |
JoeMiller | 0:02c0c2cbc3df | 1419 | { |
JoeMiller | 0:02c0c2cbc3df | 1420 | param[0].paramNo = sensorInformation[i].sensorId; |
JoeMiller | 0:02c0c2cbc3df | 1421 | em7186_param_read((u8*)&sensorConfiguration[i], PARAM_PAGE_SENSOR_CONF, param, 1); |
JoeMiller | 0:02c0c2cbc3df | 1422 | } |
JoeMiller | 0:02c0c2cbc3df | 1423 | } |
JoeMiller | 0:02c0c2cbc3df | 1424 | } |
JoeMiller | 0:02c0c2cbc3df | 1425 | |
JoeMiller | 0:02c0c2cbc3df | 1426 | void displaySensorConfiguration() |
JoeMiller | 0:02c0c2cbc3df | 1427 | { |
JoeMiller | 0:02c0c2cbc3df | 1428 | if (!haveSensorInfo) { getSensorInformation(); }; |
JoeMiller | 0:02c0c2cbc3df | 1429 | getSensorConfiguration(); |
JoeMiller | 0:02c0c2cbc3df | 1430 | printf("+-------------------------------------------------------------------------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1431 | printf("| Sensor Configuration |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1432 | printf("+----------------------------------+-------+-------+-------------+--------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1433 | printf("| Sensor | Rate | Delay | Sensitivity | Range |\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1434 | printf("+----------------------------------+-------+-------+-------------+--------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1435 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 1436 | for (i = 0; i < sizeof(sensorInformation) / sizeof(sensorInformation[0]); i++) |
JoeMiller | 0:02c0c2cbc3df | 1437 | { |
JoeMiller | 0:02c0c2cbc3df | 1438 | if (sensorInformation[i].sensorId > 0) |
JoeMiller | 0:02c0c2cbc3df | 1439 | { |
JoeMiller | 0:02c0c2cbc3df | 1440 | printf("| %-32s | % 5u | % 5u | % 11u | % 6u |\n\r", |
JoeMiller | 0:02c0c2cbc3df | 1441 | em7186_sensor_name[sensorInformation[i].sensorId], |
JoeMiller | 0:02c0c2cbc3df | 1442 | sensorConfiguration[i].sampleRate, |
JoeMiller | 0:02c0c2cbc3df | 1443 | sensorConfiguration[i].maxReportLatency, |
JoeMiller | 0:02c0c2cbc3df | 1444 | sensorConfiguration[i].changeSensitivity, |
JoeMiller | 0:02c0c2cbc3df | 1445 | sensorConfiguration[i].dynamicRange); |
JoeMiller | 0:02c0c2cbc3df | 1446 | } |
JoeMiller | 0:02c0c2cbc3df | 1447 | } |
JoeMiller | 0:02c0c2cbc3df | 1448 | printf("+----------------------------------+-------+-------+-------------+--------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1449 | } |
JoeMiller | 0:02c0c2cbc3df | 1450 | |
JoeMiller | 0:02c0c2cbc3df | 1451 | void displaySensorInformation() |
JoeMiller | 0:02c0c2cbc3df | 1452 | { |
JoeMiller | 0:02c0c2cbc3df | 1453 | if (!haveSensorInfo) { getSensorInformation(); }; |
JoeMiller | 3:69239f60d620 | 1454 | printf("+------------------------------------------------------------------------------------------+\n\r"); |
JoeMiller | 3:69239f60d620 | 1455 | printf("| Sensor Information |\n\r"); |
JoeMiller | 3:69239f60d620 | 1456 | printf("+----------------------------------------+---------+-------+-------+-----+----------+------+\n\r"); |
JoeMiller | 3:69239f60d620 | 1457 | printf("| ID |Sensor | Driver | Power | Range | Res | Rate | Size |\n\r"); |
JoeMiller | 3:69239f60d620 | 1458 | printf("+-----|----------------------------------+---------+-------+-------+-----+----------+------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1459 | u8 i; |
JoeMiller | 0:02c0c2cbc3df | 1460 | for (i = 0; i < sizeof(sensorInfoParamList) / sizeof(sensorInfoParamList[0]); i++) |
JoeMiller | 0:02c0c2cbc3df | 1461 | { |
JoeMiller | 0:02c0c2cbc3df | 1462 | if (sensorInformation[i].sensorId > 0) |
JoeMiller | 0:02c0c2cbc3df | 1463 | { |
JoeMiller | 3:69239f60d620 | 1464 | printf("|%3u | %-32s | % 3u.%-3u | % 4u | % 5u | % 3u | %-3u-% 4u | % 3u |\n\r", |
JoeMiller | 3:69239f60d620 | 1465 | i, |
JoeMiller | 0:02c0c2cbc3df | 1466 | em7186_sensor_name[sensorInformation[i].sensorId], sensorInformation[i].driverId, |
JoeMiller | 0:02c0c2cbc3df | 1467 | sensorInformation[i].driverVersion, sensorInformation[i].power, |
JoeMiller | 0:02c0c2cbc3df | 1468 | sensorInformation[i].maxRange, sensorInformation[i].resolution, |
JoeMiller | 0:02c0c2cbc3df | 1469 | sensorInformation[i].minRate, sensorInformation[i].maxRate, |
JoeMiller | 0:02c0c2cbc3df | 1470 | sensorInformation[i].eventSize); |
JoeMiller | 0:02c0c2cbc3df | 1471 | } |
JoeMiller | 0:02c0c2cbc3df | 1472 | } |
JoeMiller | 3:69239f60d620 | 1473 | printf("+-----|----------------------------------+---------+-------+-------+-----+----------+------+\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1474 | } |
JoeMiller | 0:02c0c2cbc3df | 1475 | |
JoeMiller | 0:02c0c2cbc3df | 1476 | |
JoeMiller | 0:02c0c2cbc3df | 1477 | void read_BuildVersion(void) { |
JoeMiller | 0:02c0c2cbc3df | 1478 | |
JoeMiller | 0:02c0c2cbc3df | 1479 | ParamInfo param; // elements: {u8 paramNo; u8 size;} |
JoeMiller | 0:02c0c2cbc3df | 1480 | |
JoeMiller | 0:02c0c2cbc3df | 1481 | printf("\n\r\n\rSENtral Firmware build version information from PramIO Page 9\n\r"); |
JoeMiller | 0:02c0c2cbc3df | 1482 | |
JoeMiller | 0:02c0c2cbc3df | 1483 | struct pni_version { |
JoeMiller | 0:02c0c2cbc3df | 1484 | u8 major; |
JoeMiller | 0:02c0c2cbc3df | 1485 | u8 minor; |
JoeMiller | 0:02c0c2cbc3df | 1486 | u8 patch; |
JoeMiller | 0:02c0c2cbc3df | 1487 | u8 other; |
JoeMiller | 0:02c0c2cbc3df | 1488 | u32 build; |
JoeMiller | 0:02c0c2cbc3df | 1489 | }; |
JoeMiller | 0:02c0c2cbc3df | 1490 | |
JoeMiller | 0:02c0c2cbc3df | 1491 | struct pni_version pni_ver; |
JoeMiller | 0:02c0c2cbc3df | 1492 | |
JoeMiller | 0:02c0c2cbc3df | 1493 | |
JoeMiller | 0:02c0c2cbc3df | 1494 | param.paramNo = 1; |
JoeMiller | 0:02c0c2cbc3df | 1495 | param.size = 8; |
JoeMiller | 0:02c0c2cbc3df | 1496 | em7186_param_read((u8 *)&pni_ver, 9, ¶m, 1); |
JoeMiller | 0:02c0c2cbc3df | 1497 | |
JoeMiller | 0:02c0c2cbc3df | 1498 | printf(" major = %u\n\r", pni_ver.major); |
JoeMiller | 0:02c0c2cbc3df | 1499 | printf(" minor = %u\n\r", pni_ver.minor); |
JoeMiller | 0:02c0c2cbc3df | 1500 | printf(" patch = %u\n\r", pni_ver.patch); |
JoeMiller | 0:02c0c2cbc3df | 1501 | printf(" other = %u\n\r", pni_ver.other); |
JoeMiller | 0:02c0c2cbc3df | 1502 | printf(" build = %u\n\r", pni_ver.build); |
JoeMiller | 0:02c0c2cbc3df | 1503 | |
JoeMiller | 0:02c0c2cbc3df | 1504 | |
JoeMiller | 0:02c0c2cbc3df | 1505 | } |