KL46Z-lab3_full
Dependencies: SLCD- mbed KL46Z-USBHost TSI MMA8451Q MAG3110 FATFileSystem
main_lab3.cpp@0:147f106a5503, 2019-02-21 (annotated)
- Committer:
- Lokkus
- Date:
- Thu Feb 21 07:42:01 2019 +0000
- Revision:
- 0:147f106a5503
KL46Z-lab3_full
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Lokkus | 0:147f106a5503 | 1 | //USB Academy - Lab3 rev 00 |
Lokkus | 0:147f106a5503 | 2 | //_____________________________________________________________// |
Lokkus | 0:147f106a5503 | 3 | //======== INCLUDES ===========================================// |
Lokkus | 0:147f106a5503 | 4 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯// |
Lokkus | 0:147f106a5503 | 5 | #include "mbed.h" |
Lokkus | 0:147f106a5503 | 6 | #include "MMA8451Q.h" |
Lokkus | 0:147f106a5503 | 7 | #include "MAG3110.h" |
Lokkus | 0:147f106a5503 | 8 | #include "SLCD.h" |
Lokkus | 0:147f106a5503 | 9 | #include "TSISensor.h" |
Lokkus | 0:147f106a5503 | 10 | |
Lokkus | 0:147f106a5503 | 11 | |
Lokkus | 0:147f106a5503 | 12 | //#include "USBMouse.h" //Lab1-Hid |
Lokkus | 0:147f106a5503 | 13 | //#include "USBSerial.h" //Lab2-cdc |
Lokkus | 0:147f106a5503 | 14 | #include "USBHostMSD.h" //Lab3-MSd |
Lokkus | 0:147f106a5503 | 15 | |
Lokkus | 0:147f106a5503 | 16 | |
Lokkus | 0:147f106a5503 | 17 | |
Lokkus | 0:147f106a5503 | 18 | |
Lokkus | 0:147f106a5503 | 19 | |
Lokkus | 0:147f106a5503 | 20 | //_____________________________________________________________// |
Lokkus | 0:147f106a5503 | 21 | //======== DEFINES & VARIABLES ================================// |
Lokkus | 0:147f106a5503 | 22 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯// |
Lokkus | 0:147f106a5503 | 23 | #define LED_ON 0 //outON, pwmON |
Lokkus | 0:147f106a5503 | 24 | #define LED_OFF 1 //outOFF,pwmOFF |
Lokkus | 0:147f106a5503 | 25 | DigitalOut gLED(LED_GREEN); //PTD5 |
Lokkus | 0:147f106a5503 | 26 | |
Lokkus | 0:147f106a5503 | 27 | #define rLEDperiod 150 //[ms] |
Lokkus | 0:147f106a5503 | 28 | PwmOut rLED(LED_RED); //PTE29 |
Lokkus | 0:147f106a5503 | 29 | |
Lokkus | 0:147f106a5503 | 30 | #define PRESS_ON 0 |
Lokkus | 0:147f106a5503 | 31 | #define PRESS_OFF 1 |
Lokkus | 0:147f106a5503 | 32 | DigitalIn sw1(PTC3); //if(sw1) Release else Press |
Lokkus | 0:147f106a5503 | 33 | DigitalIn sw3(PTC12); //while(sw3); wait for Press |
Lokkus | 0:147f106a5503 | 34 | |
Lokkus | 0:147f106a5503 | 35 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
Lokkus | 0:147f106a5503 | 36 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); |
Lokkus | 0:147f106a5503 | 37 | |
Lokkus | 0:147f106a5503 | 38 | SLCD slcd; //[88:88][8.8.8.8] SegmentLCD |
Lokkus | 0:147f106a5503 | 39 | |
Lokkus | 0:147f106a5503 | 40 | AnalogIn light(PTE22); //analog-light input |
Lokkus | 0:147f106a5503 | 41 | |
Lokkus | 0:147f106a5503 | 42 | TSISensor slider; //Capacitive Touch Slider |
Lokkus | 0:147f106a5503 | 43 | |
Lokkus | 0:147f106a5503 | 44 | MAG3110 mag(PTE25, PTE24); //Magnetometer |
Lokkus | 0:147f106a5503 | 45 | |
Lokkus | 0:147f106a5503 | 46 | Serial usb_osda(USBTX, USBRX); //OpenSDA Terminal |
Lokkus | 0:147f106a5503 | 47 | #define pf usb_osda //printf out -> osda (lab1,2,3) |
Lokkus | 0:147f106a5503 | 48 | |
Lokkus | 0:147f106a5503 | 49 | struct KL46_SENSOR_DATA { |
Lokkus | 0:147f106a5503 | 50 | int sw1State; |
Lokkus | 0:147f106a5503 | 51 | int sw3State; |
Lokkus | 0:147f106a5503 | 52 | float accValX; |
Lokkus | 0:147f106a5503 | 53 | float accValY; |
Lokkus | 0:147f106a5503 | 54 | float accValZ; |
Lokkus | 0:147f106a5503 | 55 | |
Lokkus | 0:147f106a5503 | 56 | float slider; |
Lokkus | 0:147f106a5503 | 57 | float light; |
Lokkus | 0:147f106a5503 | 58 | int magValX; |
Lokkus | 0:147f106a5503 | 59 | int magValY; |
Lokkus | 0:147f106a5503 | 60 | int magValZ; |
Lokkus | 0:147f106a5503 | 61 | |
Lokkus | 0:147f106a5503 | 62 | float magHeading; |
Lokkus | 0:147f106a5503 | 63 | } sensorData; |
Lokkus | 0:147f106a5503 | 64 | #define sD sensorData |
Lokkus | 0:147f106a5503 | 65 | |
Lokkus | 0:147f106a5503 | 66 | void SLCD_blinking_msg_wait(char *slcd_msg1, char *slcd_msg2); |
Lokkus | 0:147f106a5503 | 67 | |
Lokkus | 0:147f106a5503 | 68 | |
Lokkus | 0:147f106a5503 | 69 | int MagCalibrationXY(void); //mag calib |
Lokkus | 0:147f106a5503 | 70 | |
Lokkus | 0:147f106a5503 | 71 | |
Lokkus | 0:147f106a5503 | 72 | |
Lokkus | 0:147f106a5503 | 73 | //_____________________________________________________________// |
Lokkus | 0:147f106a5503 | 74 | //======== MAIN() =============================================// |
Lokkus | 0:147f106a5503 | 75 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯// |
Lokkus | 0:147f106a5503 | 76 | int main(void) |
Lokkus | 0:147f106a5503 | 77 | { |
Lokkus | 0:147f106a5503 | 78 | int mag_calib = 0; |
Lokkus | 0:147f106a5503 | 79 | FILE* fp; |
Lokkus | 0:147f106a5503 | 80 | //Lab3add |
Lokkus | 0:147f106a5503 | 81 | |
Lokkus | 0:147f106a5503 | 82 | |
Lokkus | 0:147f106a5503 | 83 | //---- MAIN/Inits -----------------------------------------// |
Lokkus | 0:147f106a5503 | 84 | |
Lokkus | 0:147f106a5503 | 85 | sw1.mode(PullUp); |
Lokkus | 0:147f106a5503 | 86 | sw3.mode(PullUp); |
Lokkus | 0:147f106a5503 | 87 | |
Lokkus | 0:147f106a5503 | 88 | gLED = LED_ON; //Green LED ON to indicate running/writing |
Lokkus | 0:147f106a5503 | 89 | rLED = LED_OFF; //Red LED OFF |
Lokkus | 0:147f106a5503 | 90 | rLED.period(rLEDperiod); //Red LED (rLED) tsi/accZ/mag |
Lokkus | 0:147f106a5503 | 91 | |
Lokkus | 0:147f106a5503 | 92 | //---- MAIN/Inits (Wait4SW1) -> Start! --------------------// |
Lokkus | 0:147f106a5503 | 93 | |
Lokkus | 0:147f106a5503 | 94 | //wait for Press SW1 - e.g. for HID/CDC/MSD Windows install. |
Lokkus | 0:147f106a5503 | 95 | //SLCD_blinking_msg_wait(" o","Helo"); //Helo (no usb); |
Lokkus | 0:147f106a5503 | 96 | SLCD_blinking_msg_wait(" o","MSd ");//Lab1=Hid;2=cdc;3=Msd |
Lokkus | 0:147f106a5503 | 97 | |
Lokkus | 0:147f106a5503 | 98 | //---- MAIN/Inits Interface -------------------------------// |
Lokkus | 0:147f106a5503 | 99 | |
Lokkus | 0:147f106a5503 | 100 | usb_osda.baud(115200); |
Lokkus | 0:147f106a5503 | 101 | usb_osda.printf("\n___________________________________\r\n"); |
Lokkus | 0:147f106a5503 | 102 | usb_osda.printf("\nFRDM-KL46Z_Lab\r\n \r\n I am a CDC serial port @OpenSDA/mUSB. Baud=115200 \r\n"); |
Lokkus | 0:147f106a5503 | 103 | |
Lokkus | 0:147f106a5503 | 104 | //---- MAIN/Inits Labs ------------------------------------// |
Lokkus | 0:147f106a5503 | 105 | //---- MAIN/Inits (Wait4SW1) -> Calib. eCompass -----------// |
Lokkus | 0:147f106a5503 | 106 | while (!mag_calib) { |
Lokkus | 0:147f106a5503 | 107 | pf.printf(" Press and release SW1 to calibrate eCompass.\r\n"); |
Lokkus | 0:147f106a5503 | 108 | SLCD_blinking_msg_wait(" o","CAL "); |
Lokkus | 0:147f106a5503 | 109 | |
Lokkus | 0:147f106a5503 | 110 | // Calibrate Magnetometer to eCompass |
Lokkus | 0:147f106a5503 | 111 | pf.printf(" ... r o t a t e the FRDM board in 3d/360° until [donE].\r\n"); |
Lokkus | 0:147f106a5503 | 112 | |
Lokkus | 0:147f106a5503 | 113 | mag_calib = MagCalibrationXY(); //to wait untill calib or cancel!!! |
Lokkus | 0:147f106a5503 | 114 | |
Lokkus | 0:147f106a5503 | 115 | if (mag_calib) { |
Lokkus | 0:147f106a5503 | 116 | if (mag_calib == -1) |
Lokkus | 0:147f106a5503 | 117 | { |
Lokkus | 0:147f106a5503 | 118 | pf.printf(" [SKiP]! Calibration skipped! ... See Accelerometer Z-axis.\r\n"); |
Lokkus | 0:147f106a5503 | 119 | SLCD_blinking_msg_wait(" o","SKiP"); //->acc |
Lokkus | 0:147f106a5503 | 120 | } else { |
Lokkus | 0:147f106a5503 | 121 | pf.printf(" [donE]! Calibration completed! ... Press and release SW1 to try eCompass.\r\n"); |
Lokkus | 0:147f106a5503 | 122 | SLCD_blinking_msg_wait(" o","donE"); //->mag |
Lokkus | 0:147f106a5503 | 123 | } |
Lokkus | 0:147f106a5503 | 124 | break; //while (!mag_calib) |
Lokkus | 0:147f106a5503 | 125 | } else { |
Lokkus | 0:147f106a5503 | 126 | slcd.printf("erro"); |
Lokkus | 0:147f106a5503 | 127 | pf.printf("r\n Error Calib !!! try again !!!\r\n\r\n"); |
Lokkus | 0:147f106a5503 | 128 | } //repet calib |
Lokkus | 0:147f106a5503 | 129 | } |
Lokkus | 0:147f106a5503 | 130 | |
Lokkus | 0:147f106a5503 | 131 | pf.printf("\r\n Lab3: pls plug USB-stick into mUSB/KL46Z \r\n"); |
Lokkus | 0:147f106a5503 | 132 | |
Lokkus | 0:147f106a5503 | 133 | slcd.printf("USb~"); //Lab1=Hid;2=cdc;3=Msd |
Lokkus | 0:147f106a5503 | 134 | USBHostMSD msd("usb"); //wait for plugged USB-stick |
Lokkus | 0:147f106a5503 | 135 | if (!msd.connect()) { |
Lokkus | 0:147f106a5503 | 136 | error(" USB Flash drive not found.\r\n"); |
Lokkus | 0:147f106a5503 | 137 | } |
Lokkus | 0:147f106a5503 | 138 | |
Lokkus | 0:147f106a5503 | 139 | //Attempt to crete file /usb/usb_lab3.txt @USB-stick. |
Lokkus | 0:147f106a5503 | 140 | fp = fopen("/usb/usb_lab3.txt", "w"); //rewrite, or create |
Lokkus | 0:147f106a5503 | 141 | if (fp) { |
Lokkus | 0:147f106a5503 | 142 | pf.printf(" ... sucess file-open (/usb/usb_lab3.txt @USB-stick)!\r\n\r\n"); |
Lokkus | 0:147f106a5503 | 143 | fprintf(fp, " Lab3: from FRDM-KL46Z \r\n\r\n"); |
Lokkus | 0:147f106a5503 | 144 | fclose(fp); fp=NULL; |
Lokkus | 0:147f106a5503 | 145 | } else pf.printf(" ... failed file-open (/usb/usb_lab3.txt @USB-stick)!\r\n\r\n"); |
Lokkus | 0:147f106a5503 | 146 | |
Lokkus | 0:147f106a5503 | 147 | |
Lokkus | 0:147f106a5503 | 148 | //---- MAIN/Inits (Wait4SW1) -> Calib. eCompass -----------// |
Lokkus | 0:147f106a5503 | 149 | |
Lokkus | 0:147f106a5503 | 150 | //---- MAIN/Inits Done! (Wait4SW1) -> MANI/Loop -----------// |
Lokkus | 0:147f106a5503 | 151 | |
Lokkus | 0:147f106a5503 | 152 | gLED = LED_OFF; //Inits are done |
Lokkus | 0:147f106a5503 | 153 | |
Lokkus | 0:147f106a5503 | 154 | //---- MAIN/Loop -----------------------------------------// |
Lokkus | 0:147f106a5503 | 155 | while (1) { |
Lokkus | 0:147f106a5503 | 156 | //disable all SLCD DPs |
Lokkus | 0:147f106a5503 | 157 | slcd.DP(0, false); slcd.DP(1, false); slcd.DP(2, false); |
Lokkus | 0:147f106a5503 | 158 | |
Lokkus | 0:147f106a5503 | 159 | // MAIN/Loop/Sensing and Storing data -----------------// |
Lokkus | 0:147f106a5503 | 160 | sD.sw1State = sw1; sD.sw3State = sw3; |
Lokkus | 0:147f106a5503 | 161 | sD.accValX = acc.getAccX(); //accX[-1..1]->mouse (Lab1) |
Lokkus | 0:147f106a5503 | 162 | sD.accValY = acc.getAccY(); //accY[-1..1]->mouse (Lab1) |
Lokkus | 0:147f106a5503 | 163 | sD.accValZ = acc.getAccZ(); //accZ[-1..1]->rLED |
Lokkus | 0:147f106a5503 | 164 | |
Lokkus | 0:147f106a5503 | 165 | sD.slider = slider.readPercentage() * 100; |
Lokkus | 0:147f106a5503 | 166 | sD.light = light; |
Lokkus | 0:147f106a5503 | 167 | sD.magValX = mag.readVal(MAG_OUT_X_MSB); |
Lokkus | 0:147f106a5503 | 168 | sD.magValY = mag.readVal(MAG_OUT_Y_MSB); |
Lokkus | 0:147f106a5503 | 169 | sD.magValZ = mag.readVal(MAG_OUT_Z_MSB); |
Lokkus | 0:147f106a5503 | 170 | sD.magHeading = mag.getHeading(); //calculate heading |
Lokkus | 0:147f106a5503 | 171 | // MAIN/Loop/Processing and Actions -------------------// |
Lokkus | 0:147f106a5503 | 172 | //sensor -> terminal |
Lokkus | 0:147f106a5503 | 173 | if (fp) { gLED = !gLED; //blinkig |
Lokkus | 0:147f106a5503 | 174 | pf.printf("%.2f\t", sD.magHeading); //->terminal |
Lokkus | 0:147f106a5503 | 175 | fprintf(fp,"%.2f\t ", sD.magHeading); //->usb_file |
Lokkus | 0:147f106a5503 | 176 | |
Lokkus | 0:147f106a5503 | 177 | pf.printf("% 1.2f\r\n", sD.accValZ); //->terminal |
Lokkus | 0:147f106a5503 | 178 | fprintf(fp,"% 1.2f\r\n", sD.accValZ); //->usb_file |
Lokkus | 0:147f106a5503 | 179 | } else gLED = LED_OFF; |
Lokkus | 0:147f106a5503 | 180 | |
Lokkus | 0:147f106a5503 | 181 | if(!fp && sw1==PRESS_ON) fp=fopen("/usb/usb_lab3.txt", "a"); |
Lokkus | 0:147f106a5503 | 182 | else |
Lokkus | 0:147f106a5503 | 183 | if(fp && sw1==PRESS_OFF) {fclose(fp); fp=NULL; gLED=LED_OFF;} |
Lokkus | 0:147f106a5503 | 184 | |
Lokkus | 0:147f106a5503 | 185 | rLED = abs(sD.accValZ); |
Lokkus | 0:147f106a5503 | 186 | |
Lokkus | 0:147f106a5503 | 187 | slcd.CharPosition=0; //prevent slcd rolling |
Lokkus | 0:147f106a5503 | 188 | slcd.printf("% 3.0f", sD.magHeading); |
Lokkus | 0:147f106a5503 | 189 | //slcd.printf("% 3.0f", sD.accValZ); |
Lokkus | 0:147f106a5503 | 190 | |
Lokkus | 0:147f106a5503 | 191 | |
Lokkus | 0:147f106a5503 | 192 | //acc: z-axis 1g min-blinking//acc: z-axis 1g min-blinking |
Lokkus | 0:147f106a5503 | 193 | rLED = abs(sD.accValZ); |
Lokkus | 0:147f106a5503 | 194 | |
Lokkus | 0:147f106a5503 | 195 | wait(0.05); //wait 50ms |
Lokkus | 0:147f106a5503 | 196 | } |
Lokkus | 0:147f106a5503 | 197 | |
Lokkus | 0:147f106a5503 | 198 | } |
Lokkus | 0:147f106a5503 | 199 | |
Lokkus | 0:147f106a5503 | 200 | |
Lokkus | 0:147f106a5503 | 201 | |
Lokkus | 0:147f106a5503 | 202 | |
Lokkus | 0:147f106a5503 | 203 | |
Lokkus | 0:147f106a5503 | 204 | //_____________________________________________________________// |
Lokkus | 0:147f106a5503 | 205 | //======== FUNC() =============================================// |
Lokkus | 0:147f106a5503 | 206 | //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯// |
Lokkus | 0:147f106a5503 | 207 | |
Lokkus | 0:147f106a5503 | 208 | //Lab2add |
Lokkus | 0:147f106a5503 | 209 | void SLCD_blinking_msg_wait(char *slcd_msg1, char *slcd_msg2) |
Lokkus | 0:147f106a5503 | 210 | { |
Lokkus | 0:147f106a5503 | 211 | char wait4sw1=0; //~500ms blinking |
Lokkus | 0:147f106a5503 | 212 | |
Lokkus | 0:147f106a5503 | 213 | //wait for Press SW1 - to start mag calibration |
Lokkus | 0:147f106a5503 | 214 | while(sw1 == PRESS_ON); //wait for release |
Lokkus | 0:147f106a5503 | 215 | while(sw1 == PRESS_OFF) { //wait for press |
Lokkus | 0:147f106a5503 | 216 | if (++wait4sw1 < 150) //300ms |
Lokkus | 0:147f106a5503 | 217 | slcd.printf(slcd_msg1); |
Lokkus | 0:147f106a5503 | 218 | else //200ms |
Lokkus | 0:147f106a5503 | 219 | slcd.printf(slcd_msg2); |
Lokkus | 0:147f106a5503 | 220 | wait(0.002); |
Lokkus | 0:147f106a5503 | 221 | } |
Lokkus | 0:147f106a5503 | 222 | while(sw1 == PRESS_ON); //wait for release |
Lokkus | 0:147f106a5503 | 223 | } |
Lokkus | 0:147f106a5503 | 224 | //Lab3add |
Lokkus | 0:147f106a5503 | 225 | int MagCalibrationXY(void) |
Lokkus | 0:147f106a5503 | 226 | { |
Lokkus | 0:147f106a5503 | 227 | int newX, tempXmax, tempXmin; |
Lokkus | 0:147f106a5503 | 228 | int newY, tempYmax, tempYmin; |
Lokkus | 0:147f106a5503 | 229 | int newZ, tempZmax, tempZmin; |
Lokkus | 0:147f106a5503 | 230 | int delta_avg=0, delta_avg_min=0, delta_avg_max=0, delta_calib_limit=800; |
Lokkus | 0:147f106a5503 | 231 | |
Lokkus | 0:147f106a5503 | 232 | // Read initial values of magnetomoter |
Lokkus | 0:147f106a5503 | 233 | //read it here to create a slight delay for calPin to settle!!! |
Lokkus | 0:147f106a5503 | 234 | tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB); |
Lokkus | 0:147f106a5503 | 235 | tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB); |
Lokkus | 0:147f106a5503 | 236 | tempZmax = tempZmin = mag.readVal(MAG_OUT_Z_MSB); |
Lokkus | 0:147f106a5503 | 237 | |
Lokkus | 0:147f106a5503 | 238 | // Update min and max values until calPin asserted again |
Lokkus | 0:147f106a5503 | 239 | while(sw1) {//wait for Press == manual calib stop |
Lokkus | 0:147f106a5503 | 240 | newX = mag.readVal(MAG_OUT_X_MSB); |
Lokkus | 0:147f106a5503 | 241 | newY = mag.readVal(MAG_OUT_Y_MSB); |
Lokkus | 0:147f106a5503 | 242 | newZ = mag.readVal(MAG_OUT_Z_MSB); |
Lokkus | 0:147f106a5503 | 243 | |
Lokkus | 0:147f106a5503 | 244 | if (newX > tempXmax) tempXmax = newX; |
Lokkus | 0:147f106a5503 | 245 | if (newX < tempXmin) tempXmin = newX; newX = tempXmax - tempXmin; |
Lokkus | 0:147f106a5503 | 246 | if (newY > tempYmax) tempYmax = newY; |
Lokkus | 0:147f106a5503 | 247 | if (newY < tempYmin) tempYmin = newY; newY = tempYmax - tempYmin; |
Lokkus | 0:147f106a5503 | 248 | if (newZ > tempZmax) tempZmax = newZ; |
Lokkus | 0:147f106a5503 | 249 | if (newZ < tempZmin) tempZmin = newZ; newZ = tempZmax - tempZmin; |
Lokkus | 0:147f106a5503 | 250 | |
Lokkus | 0:147f106a5503 | 251 | delta_avg = (newX + newY + newZ); |
Lokkus | 0:147f106a5503 | 252 | |
Lokkus | 0:147f106a5503 | 253 | //delta is too high? -> error, try new calib!!! |
Lokkus | 0:147f106a5503 | 254 | if (delta_avg > 5 * delta_calib_limit) {delta_avg = 0; break; } |
Lokkus | 0:147f106a5503 | 255 | |
Lokkus | 0:147f106a5503 | 256 | //div3 with error +0.8 pct |
Lokkus | 0:147f106a5503 | 257 | delta_avg = (21*(newX + newY + newZ))>>6; |
Lokkus | 0:147f106a5503 | 258 | |
Lokkus | 0:147f106a5503 | 259 | //calib ok for delat ~800-1200 (~80-120uT) |
Lokkus | 0:147f106a5503 | 260 | if (delta_avg > delta_calib_limit){ |
Lokkus | 0:147f106a5503 | 261 | delta_avg_min = delta_avg - (delta_avg>>2); |
Lokkus | 0:147f106a5503 | 262 | delta_avg_max = delta_avg + (delta_avg>>1); |
Lokkus | 0:147f106a5503 | 263 | if (delta_avg_min < newX && delta_avg_max > newX |
Lokkus | 0:147f106a5503 | 264 | && delta_avg_min < newY && delta_avg_max > newY |
Lokkus | 0:147f106a5503 | 265 | && delta_avg_min < newZ && delta_avg_max > newZ) break; |
Lokkus | 0:147f106a5503 | 266 | } |
Lokkus | 0:147f106a5503 | 267 | |
Lokkus | 0:147f106a5503 | 268 | //show calib progress 0->100% |
Lokkus | 0:147f106a5503 | 269 | slcd.printf("C%3.0f", (float)delta_avg/delta_calib_limit*100); |
Lokkus | 0:147f106a5503 | 270 | } |
Lokkus | 0:147f106a5503 | 271 | |
Lokkus | 0:147f106a5503 | 272 | if (sw1 == PRESS_ON || delta_avg ) { |
Lokkus | 0:147f106a5503 | 273 | mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax ); |
Lokkus | 0:147f106a5503 | 274 | if (sw1 == PRESS_ON) return -1; //==-1 ..user skip |
Lokkus | 0:147f106a5503 | 275 | return delta_avg; //>0 .. done, ok calib |
Lokkus | 0:147f106a5503 | 276 | } |
Lokkus | 0:147f106a5503 | 277 | return 0; //==0 .. error, no calib |
Lokkus | 0:147f106a5503 | 278 | } |