Code for the project of LELEC2811 2017
Dependencies: FreescaleIAP MMA8491Q_PG mbed
Fork of LELEC_2811_Accelerometer by
main.cpp@2:f146ae6546b5, 2017-11-27 (annotated)
- Committer:
- ATCuriosity
- Date:
- Mon Nov 27 15:14:24 2017 +0000
- Revision:
- 2:f146ae6546b5
- Parent:
- 1:1406d318a3b7
- Child:
- 3:d03eae745223
v1.000000000
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ATCuriosity | 2:f146ae6546b5 | 1 | /* LELEC 2811 - BadmintonLogger - Group G */ |
Salamandre | 0:a18d6e69c993 | 2 | #include "mbed.h" |
Salamandre | 0:a18d6e69c993 | 3 | #include "FreescaleIAP.h" // Library for Flash Access |
ATCuriosity | 2:f146ae6546b5 | 4 | #include "MMA8491Q_PG.h" // Accelerometer |
Salamandre | 0:a18d6e69c993 | 5 | |
Salamandre | 0:a18d6e69c993 | 6 | #define MMA8491_I2C_ADDRESS (0x55<<1) |
Salamandre | 0:a18d6e69c993 | 7 | |
Salamandre | 0:a18d6e69c993 | 8 | #define NO_JUMPER 0 |
Salamandre | 0:a18d6e69c993 | 9 | #define JUMPER_PRESENT 1 |
Salamandre | 0:a18d6e69c993 | 10 | |
Salamandre | 0:a18d6e69c993 | 11 | #define LEVEL_0 0 |
Salamandre | 0:a18d6e69c993 | 12 | #define LEVEL_1 1 |
Salamandre | 0:a18d6e69c993 | 13 | |
Salamandre | 0:a18d6e69c993 | 14 | #define LED_ON 0 |
Salamandre | 0:a18d6e69c993 | 15 | #define LED_OFF 1 |
Salamandre | 0:a18d6e69c993 | 16 | |
Salamandre | 0:a18d6e69c993 | 17 | #define DISABLE_STATE 0 |
Salamandre | 0:a18d6e69c993 | 18 | #define ENABLE_STATE 1 |
Salamandre | 0:a18d6e69c993 | 19 | |
Salamandre | 0:a18d6e69c993 | 20 | #define REG_OUT_X_MSB 0x01 |
Salamandre | 0:a18d6e69c993 | 21 | #define REG_OUT_Y_MSB 0x03 |
Salamandre | 0:a18d6e69c993 | 22 | #define REG_OUT_Z_MSB 0x05 |
Salamandre | 0:a18d6e69c993 | 23 | |
Salamandre | 0:a18d6e69c993 | 24 | #define FLASH_NO_ACQ_DONE 0 |
Salamandre | 0:a18d6e69c993 | 25 | #define FLASH_ACQ_DONE 1 |
Salamandre | 0:a18d6e69c993 | 26 | #define ERASE_FLASH_ERROR -1 |
Salamandre | 0:a18d6e69c993 | 27 | #define WRITE_FLASH_ERROR -2 |
Salamandre | 0:a18d6e69c993 | 28 | |
Salamandre | 0:a18d6e69c993 | 29 | #define SECTOR_SIZE 1024 |
Salamandre | 0:a18d6e69c993 | 30 | #define RESERVED_SECTOR 32 |
Salamandre | 0:a18d6e69c993 | 31 | |
ATCuriosity | 2:f146ae6546b5 | 32 | #define ACQ_TIMER_PERIOD 0.01 // Time between 2 acquisitions (here 10 mSec) |
Salamandre | 0:a18d6e69c993 | 33 | |
Salamandre | 0:a18d6e69c993 | 34 | typedef struct{ |
Salamandre | 0:a18d6e69c993 | 35 | int16_t X; |
Salamandre | 0:a18d6e69c993 | 36 | int16_t Y; |
Salamandre | 0:a18d6e69c993 | 37 | int16_t Z; |
Salamandre | 0:a18d6e69c993 | 38 | } Accel_Data; |
Salamandre | 0:a18d6e69c993 | 39 | |
Salamandre | 0:a18d6e69c993 | 40 | // --- Setup I2C for MMA8491 |
Salamandre | 0:a18d6e69c993 | 41 | MMA8491Q my8491(PTE0, PTE1, MMA8491_I2C_ADDRESS); |
Salamandre | 0:a18d6e69c993 | 42 | |
Salamandre | 0:a18d6e69c993 | 43 | // --- Set Serial Port |
ATCuriosity | 2:f146ae6546b5 | 44 | Serial Host_Comm(USBTX, USBRX); // tx, rxSerial pc(USBTX, USBRX); // tx, rx |
Salamandre | 0:a18d6e69c993 | 45 | |
ATCuriosity | 2:f146ae6546b5 | 46 | Ticker myTick_Acq; // Periodical timer for Acquisition |
Salamandre | 0:a18d6e69c993 | 47 | |
ATCuriosity | 2:f146ae6546b5 | 48 | DigitalOut Led_Red(LED1); // Define I/O for Leds |
Salamandre | 0:a18d6e69c993 | 49 | DigitalOut Led_Green(LED2); |
Salamandre | 0:a18d6e69c993 | 50 | DigitalOut Led_Blue(LED3); |
Salamandre | 0:a18d6e69c993 | 51 | |
Salamandre | 0:a18d6e69c993 | 52 | DigitalOut Accel_Enable(PTA13); |
Salamandre | 0:a18d6e69c993 | 53 | |
ATCuriosity | 2:f146ae6546b5 | 54 | DigitalOut Start_Pulse_Out(PTC9); // Used to enter/exit Acquisition mode |
ATCuriosity | 2:f146ae6546b5 | 55 | DigitalIn Start_Pulse_In(PTC11); // ShortPin J1_15 and J1_16 to enter in Acq_Mode |
Salamandre | 0:a18d6e69c993 | 56 | |
Salamandre | 0:a18d6e69c993 | 57 | // Globale variable |
ATCuriosity | 2:f146ae6546b5 | 58 | volatile bool bTimer; // 1 means a Timer tick is done |
Salamandre | 0:a18d6e69c993 | 59 | |
Salamandre | 0:a18d6e69c993 | 60 | int Flash_Base_Address = RESERVED_SECTOR * SECTOR_SIZE ; // Store Flash Base Adresse with 32K reserved for Application Code |
Salamandre | 0:a18d6e69c993 | 61 | int Nb_Sector; |
Salamandre | 0:a18d6e69c993 | 62 | uint32_t KL25_Flash_Size; |
Salamandre | 0:a18d6e69c993 | 63 | |
Salamandre | 0:a18d6e69c993 | 64 | // Function Declaration |
Salamandre | 0:a18d6e69c993 | 65 | |
Salamandre | 0:a18d6e69c993 | 66 | void Clear_Led(void); |
Salamandre | 0:a18d6e69c993 | 67 | int Acquisition_Flash(void); |
Salamandre | 0:a18d6e69c993 | 68 | int Read_Data_Logging(void); |
Salamandre | 0:a18d6e69c993 | 69 | bool Check_Jumper(void); |
Salamandre | 0:a18d6e69c993 | 70 | void myTimer_Acq_Task(void); |
Salamandre | 0:a18d6e69c993 | 71 | void Acquisition_Task(void); |
Salamandre | 0:a18d6e69c993 | 72 | void Read_Task(void); |
Salamandre | 0:a18d6e69c993 | 73 | |
Salamandre | 0:a18d6e69c993 | 74 | extern IAPCode verify_erased(int address, unsigned int length); |
Salamandre | 0:a18d6e69c993 | 75 | |
Salamandre | 0:a18d6e69c993 | 76 | int main() { |
Salamandre | 0:a18d6e69c993 | 77 | |
Salamandre | 0:a18d6e69c993 | 78 | uint8_t Count; |
Salamandre | 0:a18d6e69c993 | 79 | |
Salamandre | 0:a18d6e69c993 | 80 | Start_Pulse_In.mode(PullNone); // Input Pin is programmed as floating |
Salamandre | 0:a18d6e69c993 | 81 | Accel_Enable = DISABLE_STATE; // Turn Accel Enable to disabled state |
Salamandre | 0:a18d6e69c993 | 82 | |
ATCuriosity | 2:f146ae6546b5 | 83 | // --- Baud rate setting |
Salamandre | 0:a18d6e69c993 | 84 | Host_Comm.baud(115200); |
Salamandre | 0:a18d6e69c993 | 85 | |
Salamandre | 0:a18d6e69c993 | 86 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 87 | |
Salamandre | 0:a18d6e69c993 | 88 | KL25_Flash_Size = flash_size(); // Get Size of KL25 Embedded Flash |
Salamandre | 0:a18d6e69c993 | 89 | Nb_Sector = (KL25_Flash_Size / SECTOR_SIZE) - RESERVED_SECTOR; // Reserve Max 32K for App Code |
Salamandre | 0:a18d6e69c993 | 90 | |
Salamandre | 0:a18d6e69c993 | 91 | myTick_Acq.attach(&myTimer_Acq_Task, ACQ_TIMER_PERIOD); |
Salamandre | 0:a18d6e69c993 | 92 | |
ATCuriosity | 2:f146ae6546b5 | 93 | Host_Comm.printf("\n\rLELEC2811 Badminton Logger V1.0 Nov2017 Group G\n\r"); |
Salamandre | 0:a18d6e69c993 | 94 | |
Salamandre | 0:a18d6e69c993 | 95 | for (;;) |
Salamandre | 0:a18d6e69c993 | 96 | { |
Salamandre | 0:a18d6e69c993 | 97 | if (Check_Jumper() == JUMPER_PRESENT) |
Salamandre | 0:a18d6e69c993 | 98 | { |
Salamandre | 0:a18d6e69c993 | 99 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 100 | |
Salamandre | 0:a18d6e69c993 | 101 | Count = 5; |
Salamandre | 0:a18d6e69c993 | 102 | while (Count !=0) |
Salamandre | 0:a18d6e69c993 | 103 | { |
Salamandre | 0:a18d6e69c993 | 104 | if (Check_Jumper() == JUMPER_PRESENT) |
Salamandre | 0:a18d6e69c993 | 105 | { |
Salamandre | 0:a18d6e69c993 | 106 | Led_Blue = LED_ON; // Blink to alert user "Enter in Acquisition" |
Salamandre | 0:a18d6e69c993 | 107 | wait_ms(900); |
Salamandre | 0:a18d6e69c993 | 108 | Led_Blue = LED_OFF; |
Salamandre | 0:a18d6e69c993 | 109 | wait_ms(100); |
Salamandre | 0:a18d6e69c993 | 110 | Count --; |
Salamandre | 0:a18d6e69c993 | 111 | if (Count == 0) |
Salamandre | 0:a18d6e69c993 | 112 | { |
Salamandre | 0:a18d6e69c993 | 113 | Acquisition_Task(); |
Salamandre | 0:a18d6e69c993 | 114 | } |
Salamandre | 0:a18d6e69c993 | 115 | } |
Salamandre | 0:a18d6e69c993 | 116 | else |
Salamandre | 0:a18d6e69c993 | 117 | { |
Salamandre | 0:a18d6e69c993 | 118 | Count = 0; |
Salamandre | 0:a18d6e69c993 | 119 | } |
Salamandre | 0:a18d6e69c993 | 120 | } |
Salamandre | 0:a18d6e69c993 | 121 | } |
Salamandre | 0:a18d6e69c993 | 122 | else |
Salamandre | 0:a18d6e69c993 | 123 | { |
Salamandre | 0:a18d6e69c993 | 124 | Read_Task(); |
Salamandre | 0:a18d6e69c993 | 125 | } |
Salamandre | 0:a18d6e69c993 | 126 | } |
Salamandre | 0:a18d6e69c993 | 127 | } |
Salamandre | 0:a18d6e69c993 | 128 | |
Salamandre | 0:a18d6e69c993 | 129 | void Read_Task() |
Salamandre | 0:a18d6e69c993 | 130 | { |
Salamandre | 0:a18d6e69c993 | 131 | char host_cmd; |
Salamandre | 0:a18d6e69c993 | 132 | IAPCode Flash_State; |
Salamandre | 0:a18d6e69c993 | 133 | bool bAcq_Done; |
Salamandre | 0:a18d6e69c993 | 134 | |
Salamandre | 0:a18d6e69c993 | 135 | Flash_State = verify_erased(Flash_Base_Address, KL25_Flash_Size - (RESERVED_SECTOR * SECTOR_SIZE)); |
Salamandre | 0:a18d6e69c993 | 136 | if (Flash_State == 0) // Virgin Flash ? |
Salamandre | 0:a18d6e69c993 | 137 | { |
Salamandre | 0:a18d6e69c993 | 138 | bAcq_Done = 0; |
Salamandre | 0:a18d6e69c993 | 139 | } |
Salamandre | 0:a18d6e69c993 | 140 | else |
Salamandre | 0:a18d6e69c993 | 141 | { |
Salamandre | 0:a18d6e69c993 | 142 | bAcq_Done = 1; |
Salamandre | 0:a18d6e69c993 | 143 | } |
Salamandre | 0:a18d6e69c993 | 144 | |
Salamandre | 0:a18d6e69c993 | 145 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 146 | wait_ms(500); |
Salamandre | 0:a18d6e69c993 | 147 | |
Salamandre | 0:a18d6e69c993 | 148 | if (bAcq_Done == 1) |
Salamandre | 0:a18d6e69c993 | 149 | { |
Salamandre | 0:a18d6e69c993 | 150 | Led_Green = LED_ON; |
Salamandre | 0:a18d6e69c993 | 151 | Host_Comm.putc('1'); |
Salamandre | 0:a18d6e69c993 | 152 | } |
Salamandre | 0:a18d6e69c993 | 153 | else |
Salamandre | 0:a18d6e69c993 | 154 | { |
Salamandre | 0:a18d6e69c993 | 155 | Led_Red = LED_ON; |
Salamandre | 0:a18d6e69c993 | 156 | Host_Comm.putc('0'); |
Salamandre | 0:a18d6e69c993 | 157 | } |
Salamandre | 0:a18d6e69c993 | 158 | |
Salamandre | 0:a18d6e69c993 | 159 | if(Host_Comm.readable()) // Did we receive a char from Host ? |
Salamandre | 0:a18d6e69c993 | 160 | { |
Salamandre | 0:a18d6e69c993 | 161 | host_cmd = Host_Comm.getc(); // Get it |
Salamandre | 0:a18d6e69c993 | 162 | |
Salamandre | 0:a18d6e69c993 | 163 | if ((host_cmd == 'R') || (host_cmd == 'r')) // Read Flash Command ? |
Salamandre | 0:a18d6e69c993 | 164 | { |
Salamandre | 0:a18d6e69c993 | 165 | Read_Data_Logging(); // Read and send acquisition data |
Salamandre | 0:a18d6e69c993 | 166 | } |
Salamandre | 0:a18d6e69c993 | 167 | } |
Salamandre | 0:a18d6e69c993 | 168 | wait_ms(50); |
Salamandre | 0:a18d6e69c993 | 169 | } |
Salamandre | 0:a18d6e69c993 | 170 | |
Salamandre | 0:a18d6e69c993 | 171 | void Acquisition_Task() |
Salamandre | 0:a18d6e69c993 | 172 | { |
Salamandre | 0:a18d6e69c993 | 173 | int Acq_Status; |
Salamandre | 0:a18d6e69c993 | 174 | |
Salamandre | 0:a18d6e69c993 | 175 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 176 | |
Salamandre | 0:a18d6e69c993 | 177 | Acq_Status = Acquisition_Flash(); |
Salamandre | 0:a18d6e69c993 | 178 | |
Salamandre | 0:a18d6e69c993 | 179 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 180 | |
Salamandre | 0:a18d6e69c993 | 181 | while (Check_Jumper() == JUMPER_PRESENT) |
Salamandre | 0:a18d6e69c993 | 182 | { |
Salamandre | 0:a18d6e69c993 | 183 | if (Acq_Status != FLASH_ACQ_DONE) |
Salamandre | 0:a18d6e69c993 | 184 | { |
Salamandre | 0:a18d6e69c993 | 185 | Led_Red = !Led_Red; |
Salamandre | 0:a18d6e69c993 | 186 | } |
Salamandre | 0:a18d6e69c993 | 187 | else |
Salamandre | 0:a18d6e69c993 | 188 | { |
Salamandre | 0:a18d6e69c993 | 189 | Led_Green = !Led_Green; |
Salamandre | 0:a18d6e69c993 | 190 | } |
Salamandre | 0:a18d6e69c993 | 191 | wait_ms(100); |
Salamandre | 0:a18d6e69c993 | 192 | } |
Salamandre | 0:a18d6e69c993 | 193 | } |
Salamandre | 0:a18d6e69c993 | 194 | |
Salamandre | 0:a18d6e69c993 | 195 | void Clear_Led(void) |
Salamandre | 0:a18d6e69c993 | 196 | { |
Salamandre | 0:a18d6e69c993 | 197 | Led_Red = LED_OFF; |
Salamandre | 0:a18d6e69c993 | 198 | Led_Green = LED_OFF; |
Salamandre | 0:a18d6e69c993 | 199 | Led_Blue = LED_OFF ; // Bug on board : Turning On Blue Led decrease consumption... |
Salamandre | 0:a18d6e69c993 | 200 | } |
Salamandre | 0:a18d6e69c993 | 201 | |
Salamandre | 0:a18d6e69c993 | 202 | bool Check_Jumper() // If J1_15 and J1_16 connected together -> return JUMPER_PRESENT |
Salamandre | 0:a18d6e69c993 | 203 | { |
Salamandre | 0:a18d6e69c993 | 204 | uint8_t i; |
Salamandre | 0:a18d6e69c993 | 205 | |
Salamandre | 0:a18d6e69c993 | 206 | for (i = 0 ; i < 2 ; i ++) |
Salamandre | 0:a18d6e69c993 | 207 | { |
Salamandre | 0:a18d6e69c993 | 208 | Start_Pulse_Out = LEVEL_1; |
Salamandre | 0:a18d6e69c993 | 209 | wait_ms(1); |
Salamandre | 0:a18d6e69c993 | 210 | if (Start_Pulse_In != LEVEL_1) |
Salamandre | 0:a18d6e69c993 | 211 | { |
Salamandre | 0:a18d6e69c993 | 212 | return NO_JUMPER; |
Salamandre | 0:a18d6e69c993 | 213 | } |
Salamandre | 0:a18d6e69c993 | 214 | |
Salamandre | 0:a18d6e69c993 | 215 | Start_Pulse_Out = LEVEL_0; |
Salamandre | 0:a18d6e69c993 | 216 | wait_ms(1); |
Salamandre | 0:a18d6e69c993 | 217 | if (Start_Pulse_In != LEVEL_0) |
Salamandre | 0:a18d6e69c993 | 218 | { |
Salamandre | 0:a18d6e69c993 | 219 | return NO_JUMPER; |
Salamandre | 0:a18d6e69c993 | 220 | } |
Salamandre | 0:a18d6e69c993 | 221 | } |
Salamandre | 0:a18d6e69c993 | 222 | return JUMPER_PRESENT; |
Salamandre | 0:a18d6e69c993 | 223 | } |
Salamandre | 0:a18d6e69c993 | 224 | |
Salamandre | 0:a18d6e69c993 | 225 | int Acquisition_Flash(void) |
Salamandre | 0:a18d6e69c993 | 226 | { |
Salamandre | 0:a18d6e69c993 | 227 | int Status; |
Salamandre | 0:a18d6e69c993 | 228 | int Flash_Ptr ; |
Salamandre | 0:a18d6e69c993 | 229 | uint8_t Data_Ptr; |
Salamandre | 0:a18d6e69c993 | 230 | Accel_Data myData[2]; |
Salamandre | 0:a18d6e69c993 | 231 | uint8_t Ready; |
Salamandre | 0:a18d6e69c993 | 232 | int Led_Counter; |
Salamandre | 0:a18d6e69c993 | 233 | |
Salamandre | 0:a18d6e69c993 | 234 | |
Salamandre | 0:a18d6e69c993 | 235 | for (Flash_Ptr = Flash_Base_Address ; Flash_Ptr < KL25_Flash_Size ; Flash_Ptr += 0x400) |
Salamandre | 0:a18d6e69c993 | 236 | { |
Salamandre | 0:a18d6e69c993 | 237 | Status = erase_sector(Flash_Ptr); // Erase sector |
Salamandre | 0:a18d6e69c993 | 238 | |
Salamandre | 0:a18d6e69c993 | 239 | if (Status !=0) |
Salamandre | 0:a18d6e69c993 | 240 | { |
Salamandre | 0:a18d6e69c993 | 241 | return ERASE_FLASH_ERROR; |
Salamandre | 0:a18d6e69c993 | 242 | } |
Salamandre | 0:a18d6e69c993 | 243 | } |
Salamandre | 0:a18d6e69c993 | 244 | |
Salamandre | 0:a18d6e69c993 | 245 | Flash_Ptr = Flash_Base_Address; |
Salamandre | 0:a18d6e69c993 | 246 | |
Salamandre | 0:a18d6e69c993 | 247 | Led_Blue = LED_ON; |
Salamandre | 0:a18d6e69c993 | 248 | |
Salamandre | 0:a18d6e69c993 | 249 | Led_Counter = 0; |
Salamandre | 0:a18d6e69c993 | 250 | Data_Ptr = 0; |
Salamandre | 0:a18d6e69c993 | 251 | while (Flash_Ptr < KL25_Flash_Size ) // Acq Loop |
Salamandre | 0:a18d6e69c993 | 252 | { |
Salamandre | 0:a18d6e69c993 | 253 | while (bTimer == 0) // Wait Acq Tick Timer |
Salamandre | 0:a18d6e69c993 | 254 | { |
Salamandre | 0:a18d6e69c993 | 255 | |
Salamandre | 0:a18d6e69c993 | 256 | } |
Salamandre | 0:a18d6e69c993 | 257 | bTimer = 0; |
Salamandre | 0:a18d6e69c993 | 258 | |
Salamandre | 0:a18d6e69c993 | 259 | Accel_Enable = ENABLE_STATE; // Rising Edge -> Start Accel Measure |
Salamandre | 0:a18d6e69c993 | 260 | |
Salamandre | 0:a18d6e69c993 | 261 | if ((float) Led_Counter * ACQ_TIMER_PERIOD == 1.0) // Blink at 1 Hz |
Salamandre | 0:a18d6e69c993 | 262 | { |
Salamandre | 0:a18d6e69c993 | 263 | Led_Counter = 0; |
Salamandre | 0:a18d6e69c993 | 264 | Led_Blue = !Led_Blue; |
Salamandre | 0:a18d6e69c993 | 265 | } |
Salamandre | 0:a18d6e69c993 | 266 | |
Salamandre | 0:a18d6e69c993 | 267 | |
Salamandre | 0:a18d6e69c993 | 268 | Ready = 0; |
Salamandre | 0:a18d6e69c993 | 269 | while((Ready && 0x10) == 0) // Wait Accelerometer have new data's |
Salamandre | 0:a18d6e69c993 | 270 | { |
Salamandre | 0:a18d6e69c993 | 271 | Ready = my8491.Read_Status(); |
Salamandre | 0:a18d6e69c993 | 272 | } |
Salamandre | 0:a18d6e69c993 | 273 | |
Salamandre | 0:a18d6e69c993 | 274 | myData[Data_Ptr].X = my8491.getAccAxis(REG_OUT_X_MSB); |
Salamandre | 0:a18d6e69c993 | 275 | myData[Data_Ptr].Y = my8491.getAccAxis(REG_OUT_Y_MSB); |
Salamandre | 0:a18d6e69c993 | 276 | myData[Data_Ptr].Z = my8491.getAccAxis(REG_OUT_Z_MSB); |
Salamandre | 0:a18d6e69c993 | 277 | |
Salamandre | 0:a18d6e69c993 | 278 | Led_Counter++; |
Salamandre | 0:a18d6e69c993 | 279 | |
Salamandre | 0:a18d6e69c993 | 280 | Accel_Enable = DISABLE_STATE; |
Salamandre | 0:a18d6e69c993 | 281 | |
Salamandre | 0:a18d6e69c993 | 282 | //Host_Comm.printf("\n\r%x\tX = %f", Flash_Ptr, float(myData[Data_Ptr].X)*4.0/4096.0 ); |
Salamandre | 0:a18d6e69c993 | 283 | //Host_Comm.printf("\tY = %f", float(myData[Data_Ptr].Y)*4.0/4096.0 ); |
Salamandre | 0:a18d6e69c993 | 284 | //Host_Comm.printf("\tZ = %f", float(myData[Data_Ptr].Z)*4.0/4096.0 ); |
Salamandre | 0:a18d6e69c993 | 285 | |
Salamandre | 0:a18d6e69c993 | 286 | Data_Ptr ++; |
Salamandre | 0:a18d6e69c993 | 287 | |
Salamandre | 0:a18d6e69c993 | 288 | if (Data_Ptr == 2)// Save 2 acquistions -> 2 * 3 * 2 bytes = 12 bytes |
Salamandre | 0:a18d6e69c993 | 289 | { |
Salamandre | 0:a18d6e69c993 | 290 | Data_Ptr = 0; |
Salamandre | 0:a18d6e69c993 | 291 | Status = program_flash(Flash_Ptr, (char *) &myData[0].X, 4); // Write 4 bytes in the Flash |
Salamandre | 0:a18d6e69c993 | 292 | if (Status !=0) |
Salamandre | 0:a18d6e69c993 | 293 | { |
Salamandre | 0:a18d6e69c993 | 294 | return WRITE_FLASH_ERROR; |
Salamandre | 0:a18d6e69c993 | 295 | } |
Salamandre | 0:a18d6e69c993 | 296 | |
Salamandre | 0:a18d6e69c993 | 297 | Flash_Ptr += 4; |
Salamandre | 0:a18d6e69c993 | 298 | Status = program_flash(Flash_Ptr, (char *) &myData[0].Z, 4); // Write 4 bytes in the Flash |
Salamandre | 0:a18d6e69c993 | 299 | if (Status !=0) |
Salamandre | 0:a18d6e69c993 | 300 | { |
Salamandre | 0:a18d6e69c993 | 301 | return WRITE_FLASH_ERROR; |
Salamandre | 0:a18d6e69c993 | 302 | } |
Salamandre | 0:a18d6e69c993 | 303 | |
Salamandre | 0:a18d6e69c993 | 304 | Flash_Ptr += 4; |
Salamandre | 1:1406d318a3b7 | 305 | //Status = program_flash(Flash_Ptr, (char *) &myData[1].Y, 4); // Write 4 bytes in the Flash |
Salamandre | 1:1406d318a3b7 | 306 | Status = program_flash(Flash_Ptr, (char *) &myData[0].Y, 4); // Bug corrected 23/11/2016 |
Salamandre | 0:a18d6e69c993 | 307 | if (Status !=0) |
Salamandre | 0:a18d6e69c993 | 308 | { |
Salamandre | 0:a18d6e69c993 | 309 | return WRITE_FLASH_ERROR; |
Salamandre | 0:a18d6e69c993 | 310 | } |
Salamandre | 0:a18d6e69c993 | 311 | |
Salamandre | 0:a18d6e69c993 | 312 | Flash_Ptr += 4; |
Salamandre | 0:a18d6e69c993 | 313 | |
Salamandre | 0:a18d6e69c993 | 314 | if ((Flash_Ptr & 0x3FC) == 0x3FC) |
Salamandre | 0:a18d6e69c993 | 315 | { |
Salamandre | 0:a18d6e69c993 | 316 | Flash_Ptr += 4; //170 * 6 = 1020 ---> skip 4 last bytes of each sector of 1024 bytes |
Salamandre | 0:a18d6e69c993 | 317 | } |
Salamandre | 0:a18d6e69c993 | 318 | } |
Salamandre | 0:a18d6e69c993 | 319 | if (Check_Jumper() != JUMPER_PRESENT) // If Jumper remoded -> Stop Acquisition |
Salamandre | 0:a18d6e69c993 | 320 | { |
Salamandre | 0:a18d6e69c993 | 321 | return FLASH_ACQ_DONE ; |
Salamandre | 0:a18d6e69c993 | 322 | } |
Salamandre | 0:a18d6e69c993 | 323 | } |
Salamandre | 0:a18d6e69c993 | 324 | return FLASH_ACQ_DONE ; |
Salamandre | 0:a18d6e69c993 | 325 | } |
Salamandre | 0:a18d6e69c993 | 326 | |
Salamandre | 0:a18d6e69c993 | 327 | int Read_Data_Logging() |
Salamandre | 0:a18d6e69c993 | 328 | { |
Salamandre | 0:a18d6e69c993 | 329 | int16_t *data = (int16_t *) Flash_Base_Address; // uint16 pointer of data stored in Flash |
Salamandre | 0:a18d6e69c993 | 330 | int Flash_Ptr; |
Salamandre | 0:a18d6e69c993 | 331 | char cmd; |
Salamandre | 0:a18d6e69c993 | 332 | int Record_Counter; |
Salamandre | 0:a18d6e69c993 | 333 | float X_Val, Y_Val, Z_Val; |
Salamandre | 0:a18d6e69c993 | 334 | int16_t Raw_X, Raw_Y, Raw_Z; |
Salamandre | 0:a18d6e69c993 | 335 | int Max_Record; |
Salamandre | 0:a18d6e69c993 | 336 | |
Salamandre | 0:a18d6e69c993 | 337 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 338 | |
Salamandre | 0:a18d6e69c993 | 339 | Max_Record = Nb_Sector * (SECTOR_SIZE / sizeof(Accel_Data)); |
Salamandre | 0:a18d6e69c993 | 340 | Record_Counter = 0; |
Salamandre | 0:a18d6e69c993 | 341 | Flash_Ptr = 0; |
Salamandre | 0:a18d6e69c993 | 342 | |
Salamandre | 0:a18d6e69c993 | 343 | //Host_Comm.printf("\n\rBegin of Data"); |
Salamandre | 0:a18d6e69c993 | 344 | |
Salamandre | 0:a18d6e69c993 | 345 | while (Record_Counter < Max_Record) |
Salamandre | 0:a18d6e69c993 | 346 | { |
Salamandre | 0:a18d6e69c993 | 347 | Led_Green = !Led_Green; |
Salamandre | 0:a18d6e69c993 | 348 | Led_Blue = !Led_Green; |
Salamandre | 0:a18d6e69c993 | 349 | |
Salamandre | 0:a18d6e69c993 | 350 | if(Host_Comm.readable()) |
Salamandre | 0:a18d6e69c993 | 351 | { |
Salamandre | 0:a18d6e69c993 | 352 | cmd = Host_Comm.getc(); |
Salamandre | 0:a18d6e69c993 | 353 | if ((cmd == 'S') || (cmd == 's')) // Receiving 'S' or 's' means stop Read Flash |
Salamandre | 0:a18d6e69c993 | 354 | { |
Salamandre | 0:a18d6e69c993 | 355 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 356 | return 0; |
Salamandre | 0:a18d6e69c993 | 357 | } |
Salamandre | 0:a18d6e69c993 | 358 | } |
Salamandre | 0:a18d6e69c993 | 359 | |
Salamandre | 0:a18d6e69c993 | 360 | Record_Counter ++; |
Salamandre | 0:a18d6e69c993 | 361 | |
Salamandre | 0:a18d6e69c993 | 362 | Raw_X = data[Flash_Ptr++]; |
Salamandre | 0:a18d6e69c993 | 363 | Raw_Y = data[Flash_Ptr++]; |
Salamandre | 0:a18d6e69c993 | 364 | Raw_Z = data[Flash_Ptr++]; |
Salamandre | 0:a18d6e69c993 | 365 | |
Salamandre | 0:a18d6e69c993 | 366 | if ((Raw_X == -1) && (Raw_Y == -1) && (Raw_Z == -1)) // Valid data ? (!= 0xFFFFFFFF from empty Flash sector) |
Salamandre | 0:a18d6e69c993 | 367 | { |
Salamandre | 0:a18d6e69c993 | 368 | } |
Salamandre | 0:a18d6e69c993 | 369 | else |
Salamandre | 0:a18d6e69c993 | 370 | { |
Salamandre | 0:a18d6e69c993 | 371 | X_Val = float(Raw_X) * 4.0/4096.0; |
Salamandre | 0:a18d6e69c993 | 372 | Y_Val = float(Raw_Y) * 4.0/4096.0; |
Salamandre | 0:a18d6e69c993 | 373 | Z_Val = float(Raw_Z) * 4.0/4096.0; |
Salamandre | 0:a18d6e69c993 | 374 | |
Salamandre | 0:a18d6e69c993 | 375 | Host_Comm.printf("\n\r%d\tX=%.4f\tY=%.4f\tZ=%.4f", Record_Counter, X_Val, Y_Val, Z_Val); |
Salamandre | 0:a18d6e69c993 | 376 | } |
Salamandre | 0:a18d6e69c993 | 377 | |
Salamandre | 0:a18d6e69c993 | 378 | if ((Flash_Ptr & 0x1FE) == 0x1FE) |
Salamandre | 0:a18d6e69c993 | 379 | { |
Salamandre | 0:a18d6e69c993 | 380 | Flash_Ptr +=2; // skip the last bytes at the end of a sector |
Salamandre | 0:a18d6e69c993 | 381 | } |
Salamandre | 0:a18d6e69c993 | 382 | } |
Salamandre | 0:a18d6e69c993 | 383 | //Host_Comm.printf("\n\rEnd of Data"); |
Salamandre | 0:a18d6e69c993 | 384 | Clear_Led(); |
Salamandre | 0:a18d6e69c993 | 385 | return 0; |
Salamandre | 0:a18d6e69c993 | 386 | } |
Salamandre | 0:a18d6e69c993 | 387 | |
Salamandre | 0:a18d6e69c993 | 388 | /* Interrupt Task */ |
Salamandre | 0:a18d6e69c993 | 389 | void myTimer_Acq_Task() |
Salamandre | 0:a18d6e69c993 | 390 | { |
Salamandre | 0:a18d6e69c993 | 391 | bTimer = 1; |
Salamandre | 0:a18d6e69c993 | 392 | } |