DA14580 Bluetooth Smart IC writer library

Dependents:   11u35_usbLocalFilesystem

Committer:
k4zuki
Date:
Wed Aug 19 14:41:13 2015 +0000
Revision:
0:3bdbabca8a09
Child:
3:a9684679d1ec
DA14580 Bluetooth Smart IC writer library: first version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
k4zuki 0:3bdbabca8a09 1 #include "mbed.h"
k4zuki 0:3bdbabca8a09 2 #include "DA14580.h"
k4zuki 0:3bdbabca8a09 3
k4zuki 0:3bdbabca8a09 4 DA14580::DA14580( PinName TX, PinName RX, PinName RESET ) : _ble(TX,RX), _reset(RESET)
k4zuki 0:3bdbabca8a09 5 {
k4zuki 0:3bdbabca8a09 6 init();
k4zuki 0:3bdbabca8a09 7 }
k4zuki 0:3bdbabca8a09 8
k4zuki 0:3bdbabca8a09 9 DA14580::DA14580( RawSerial &ble, PinName RESET ) : _ble(ble), _reset(RESET)
k4zuki 0:3bdbabca8a09 10 {
k4zuki 0:3bdbabca8a09 11 init();
k4zuki 0:3bdbabca8a09 12 }
k4zuki 0:3bdbabca8a09 13
k4zuki 0:3bdbabca8a09 14 DA14580::~DA14580()
k4zuki 0:3bdbabca8a09 15 {
k4zuki 0:3bdbabca8a09 16 }
k4zuki 0:3bdbabca8a09 17
k4zuki 0:3bdbabca8a09 18 void DA14580::init()
k4zuki 0:3bdbabca8a09 19 {
k4zuki 0:3bdbabca8a09 20
k4zuki 0:3bdbabca8a09 21 _ble.baud(57600);
k4zuki 0:3bdbabca8a09 22 _crc = 0x00;
k4zuki 0:3bdbabca8a09 23 _recieve = 0;
k4zuki 0:3bdbabca8a09 24 _read = 0;
k4zuki 0:3bdbabca8a09 25 _filesize = 0;
k4zuki 0:3bdbabca8a09 26 _reset = 0;
k4zuki 0:3bdbabca8a09 27 _timeout = 100;
k4zuki 0:3bdbabca8a09 28 _status = SUCCESS;
k4zuki 0:3bdbabca8a09 29 }
k4zuki 0:3bdbabca8a09 30
k4zuki 0:3bdbabca8a09 31 int DA14580::load()
k4zuki 0:3bdbabca8a09 32 {
k4zuki 0:3bdbabca8a09 33
k4zuki 0:3bdbabca8a09 34 _status = SUCCESS;
k4zuki 0:3bdbabca8a09 35
k4zuki 0:3bdbabca8a09 36 _fp = fopen( LOADER_FILE, "rb" );
k4zuki 0:3bdbabca8a09 37 if (_fp) {
k4zuki 0:3bdbabca8a09 38 _filesize = file_size(_fp);
k4zuki 0:3bdbabca8a09 39 while((_timeout--) >0) {
k4zuki 0:3bdbabca8a09 40 if( _ble.readable() ) {
k4zuki 0:3bdbabca8a09 41 _recieve = _ble.getc();
k4zuki 0:3bdbabca8a09 42 if(_recieve == STX) {
k4zuki 0:3bdbabca8a09 43 _ble.putc(SOH);
k4zuki 0:3bdbabca8a09 44 break;
k4zuki 0:3bdbabca8a09 45 }
k4zuki 0:3bdbabca8a09 46 }
k4zuki 0:3bdbabca8a09 47 }
k4zuki 0:3bdbabca8a09 48 if(_timeout <= 0) {
k4zuki 0:3bdbabca8a09 49 _status = E_TIMEOUT_STX;
k4zuki 0:3bdbabca8a09 50 } else {
k4zuki 0:3bdbabca8a09 51 _timeout = 100;
k4zuki 0:3bdbabca8a09 52 _ble.putc(_filesize & 0xff);
k4zuki 0:3bdbabca8a09 53 _ble.putc( (_filesize >> 8) & 0xff);
k4zuki 0:3bdbabca8a09 54 while((_timeout--) >0) {
k4zuki 0:3bdbabca8a09 55 if( _ble.readable() ) {
k4zuki 0:3bdbabca8a09 56 _recieve = _ble.getc();
k4zuki 0:3bdbabca8a09 57 if(_recieve == ACK) {
k4zuki 0:3bdbabca8a09 58 break;
k4zuki 0:3bdbabca8a09 59 }
k4zuki 0:3bdbabca8a09 60 }
k4zuki 0:3bdbabca8a09 61 }
k4zuki 0:3bdbabca8a09 62 if(_timeout <= 0) {
k4zuki 0:3bdbabca8a09 63 _status = E_ACK_NOT_RETURNED;
k4zuki 0:3bdbabca8a09 64 } else {
k4zuki 0:3bdbabca8a09 65 _timeout = 100;
k4zuki 0:3bdbabca8a09 66 for(int i = 0; i < _filesize; i++) {
k4zuki 0:3bdbabca8a09 67 _read = getc(_fp);
k4zuki 0:3bdbabca8a09 68 _ble.putc(_read);
k4zuki 0:3bdbabca8a09 69 _crc = _crc ^ _read;
k4zuki 0:3bdbabca8a09 70 if((i % 16) == 0) {
k4zuki 0:3bdbabca8a09 71 }
k4zuki 0:3bdbabca8a09 72 }
k4zuki 0:3bdbabca8a09 73 while((_timeout--) >0) {
k4zuki 0:3bdbabca8a09 74 if( _ble.readable() ) {
k4zuki 0:3bdbabca8a09 75 _recieve = _ble.getc();
k4zuki 0:3bdbabca8a09 76 if(_recieve == _crc) {
k4zuki 0:3bdbabca8a09 77 _ble.putc(ACK);
k4zuki 0:3bdbabca8a09 78 break;
k4zuki 0:3bdbabca8a09 79 }
k4zuki 0:3bdbabca8a09 80 }
k4zuki 0:3bdbabca8a09 81 }
k4zuki 0:3bdbabca8a09 82 if(_timeout <= 0) {
k4zuki 0:3bdbabca8a09 83 _status = E_ACK_NOT_RETURNED;
k4zuki 0:3bdbabca8a09 84 }
k4zuki 0:3bdbabca8a09 85 }
k4zuki 0:3bdbabca8a09 86 }
k4zuki 0:3bdbabca8a09 87 fclose(_fp);
k4zuki 0:3bdbabca8a09 88 #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
k4zuki 0:3bdbabca8a09 89 #warning "free(_fp)"
k4zuki 0:3bdbabca8a09 90 free(_fp);
k4zuki 0:3bdbabca8a09 91 #endif
k4zuki 0:3bdbabca8a09 92 } else {
k4zuki 0:3bdbabca8a09 93 _status = E_FILE_NOT_FOUND;
k4zuki 0:3bdbabca8a09 94 }
k4zuki 0:3bdbabca8a09 95 return _status;
k4zuki 0:3bdbabca8a09 96
k4zuki 0:3bdbabca8a09 97
k4zuki 0:3bdbabca8a09 98 }
k4zuki 0:3bdbabca8a09 99
k4zuki 0:3bdbabca8a09 100 int DA14580::file_size( FILE *fp )
k4zuki 0:3bdbabca8a09 101 {
k4zuki 0:3bdbabca8a09 102 int size;
k4zuki 0:3bdbabca8a09 103
k4zuki 0:3bdbabca8a09 104 fseek( fp, 0, SEEK_END ); // seek to end of file
k4zuki 0:3bdbabca8a09 105 size = ftell( fp ); // get current file pointer
k4zuki 0:3bdbabca8a09 106 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
k4zuki 0:3bdbabca8a09 107
k4zuki 0:3bdbabca8a09 108 return size;
k4zuki 0:3bdbabca8a09 109 }
k4zuki 0:3bdbabca8a09 110