working commands. singleton deleted

Dependents:   GonioTrainer

Committer:
dkester
Date:
Thu Jun 11 20:57:59 2015 +0000
Revision:
5:47cb37923f58
Parent:
4:f81029197ab2
working 11 jun

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkester 0:e188325211af 1 #include "OfflineCommand.h"
dkester 4:f81029197ab2 2
dkester 1:fd4c0e2decb8 3 volatile int32_t OfflineCommand::addr = 0;
dkester 4:f81029197ab2 4
dkester 2:c9e47ac47edb 5 OfflineCommand::OfflineCommand(Sensors* sensors, Storage* storage)
dkester 0:e188325211af 6 {
dkester 2:c9e47ac47edb 7 this->sensors = sensors;
dkester 2:c9e47ac47edb 8 this->storage = storage;
dkester 1:fd4c0e2decb8 9 addr = 0x0;
dkester 0:e188325211af 10 this->running = 0;
dkester 1:fd4c0e2decb8 11 this->state = 0;
dkester 0:e188325211af 12 }
dkester 4:f81029197ab2 13
dkester 0:e188325211af 14 void OfflineCommand::initialize()
dkester 0:e188325211af 15 {
dkester 1:fd4c0e2decb8 16 this->state = 0;
dkester 0:e188325211af 17 setTicker(0.1);
dkester 0:e188325211af 18 }
dkester 4:f81029197ab2 19
dkester 0:e188325211af 20 void OfflineCommand::execute()
dkester 0:e188325211af 21 {
dkester 0:e188325211af 22 if(running) {
dkester 0:e188325211af 23 writeToMemory();
dkester 0:e188325211af 24 }
dkester 0:e188325211af 25 }
dkester 4:f81029197ab2 26
dkester 0:e188325211af 27 void OfflineCommand::button()
dkester 0:e188325211af 28 {
dkester 1:fd4c0e2decb8 29 switch(state) {
dkester 1:fd4c0e2decb8 30 case 0:
dkester 1:fd4c0e2decb8 31 detachTicker();
dkester 1:fd4c0e2decb8 32 setLed(1);
dkester 1:fd4c0e2decb8 33 addr = 0;
dkester 1:fd4c0e2decb8 34 wait(0.1);
dkester 1:fd4c0e2decb8 35 eraseMemory();
dkester 1:fd4c0e2decb8 36 this->state = 1;
dkester 1:fd4c0e2decb8 37 setTicker(0.1);
dkester 1:fd4c0e2decb8 38 break;
dkester 1:fd4c0e2decb8 39 case 1:
dkester 1:fd4c0e2decb8 40 detachTicker();
dkester 1:fd4c0e2decb8 41 setLed(1);
dkester 1:fd4c0e2decb8 42 addr = 0;
dkester 1:fd4c0e2decb8 43 this->running = 1; //This will unlock the writeToMemory from the execution
dkester 1:fd4c0e2decb8 44 this->state = 2;
dkester 1:fd4c0e2decb8 45 this->sensors->wakeIMU();
dkester 1:fd4c0e2decb8 46 break;
dkester 1:fd4c0e2decb8 47 case 2:
dkester 1:fd4c0e2decb8 48 this->sensors->disableIMU();
dkester 1:fd4c0e2decb8 49 this->running = 0;
dkester 1:fd4c0e2decb8 50 this->state = 0;
dkester 4:f81029197ab2 51 setLed(0);
dkester 4:f81029197ab2 52 NRF_POWER->SYSTEMOFF = 1;
dkester 1:fd4c0e2decb8 53 break;
dkester 1:fd4c0e2decb8 54 }
dkester 4:f81029197ab2 55
dkester 0:e188325211af 56 }
dkester 4:f81029197ab2 57
dkester 0:e188325211af 58 void OfflineCommand::finish()
dkester 0:e188325211af 59 {
dkester 1:fd4c0e2decb8 60 this->state = 0;
dkester 3:32afe87d4b62 61 detachTicker();
dkester 0:e188325211af 62 setLed(0);
dkester 0:e188325211af 63 }
dkester 4:f81029197ab2 64
dkester 0:e188325211af 65 void OfflineCommand::writeToMemory()
dkester 0:e188325211af 66 {
dkester 4:f81029197ab2 67
dkester 4:f81029197ab2 68
dkester 3:32afe87d4b62 69 sensors->updateAngle();
dkester 3:32afe87d4b62 70 sensors->updateIMU();
dkester 3:32afe87d4b62 71
dkester 0:e188325211af 72 if(!storage->isBusy()) {
dkester 4:f81029197ab2 73
dkester 0:e188325211af 74 storage->pageProgram(addr);
dkester 4:f81029197ab2 75
dkester 3:32afe87d4b62 76 storage->writeData(sensors->getAngle(0));
dkester 3:32afe87d4b62 77 storage->writeData(sensors->getAngle(1));
dkester 3:32afe87d4b62 78 storage->writeData(sensors->getIMU(0));
dkester 3:32afe87d4b62 79 storage->writeData(sensors->getIMU(1));
dkester 2:c9e47ac47edb 80
dkester 0:e188325211af 81 storage->endAction();
dkester 4:f81029197ab2 82
dkester 1:fd4c0e2decb8 83 addr = addr + 0x4;
dkester 4:f81029197ab2 84
dkester 0:e188325211af 85 } else {
dkester 0:e188325211af 86 printf("busy: %d\n", storage->getSR1());
dkester 0:e188325211af 87 }
dkester 4:f81029197ab2 88
dkester 0:e188325211af 89 }
dkester 4:f81029197ab2 90
dkester 1:fd4c0e2decb8 91 void OfflineCommand::eraseMemory()
dkester 1:fd4c0e2decb8 92 {
dkester 4:f81029197ab2 93 __disable_irq();
dkester 4:f81029197ab2 94
dkester 3:32afe87d4b62 95 storage->read(0x00);
dkester 1:fd4c0e2decb8 96
dkester 3:32afe87d4b62 97 while(storage->readData() != -1){
dkester 3:32afe87d4b62 98 storage->endAction(); //end previous read action
dkester 1:fd4c0e2decb8 99
dkester 3:32afe87d4b62 100 storage->sectorErase(addr);
dkester 1:fd4c0e2decb8 101
dkester 3:32afe87d4b62 102 while(storage->isBusy()){ wait(0.01); }
dkester 3:32afe87d4b62 103
dkester 1:fd4c0e2decb8 104 printf("sector %d erased\n", addr);
dkester 3:32afe87d4b62 105 addr = addr + (1<<18);
dkester 3:32afe87d4b62 106 storage->read(addr); //set next section addr for read in the while statement
dkester 0:e188325211af 107 }
dkester 3:32afe87d4b62 108
dkester 3:32afe87d4b62 109 printf("ERASE done!\n");
dkester 3:32afe87d4b62 110 storage->endAction();
dkester 1:fd4c0e2decb8 111
dkester 1:fd4c0e2decb8 112 __enable_irq();
dkester 4:f81029197ab2 113 }
dkester 4:f81029197ab2 114