test firmware for BLE Micro V1.3 1. test io, vcc and ble 2. act as a UART to BLE bridge
Dependencies: BLE_API Buffer mbed
Fork of BLE_LEDBlinker by
ble_micro_test.cpp@12:c4090cb58976, 2015-12-08 (annotated)
- Committer:
- arch
- Date:
- Tue Dec 08 08:34:22 2015 +0000
- Revision:
- 12:c4090cb58976
- Parent:
- 11:c8cbc4bc2c17
fix USBTX/USBRX pins config
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
arch | 11:c8cbc4bc2c17 | 1 | |
arch | 11:c8cbc4bc2c17 | 2 | #include "mbed.h" |
arch | 11:c8cbc4bc2c17 | 3 | |
arch | 11:c8cbc4bc2c17 | 4 | |
arch | 11:c8cbc4bc2c17 | 5 | extern "C" { |
arch | 11:c8cbc4bc2c17 | 6 | #include "pstorage.h" |
arch | 11:c8cbc4bc2c17 | 7 | #include "nrf_error.h" |
arch | 11:c8cbc4bc2c17 | 8 | } |
arch | 11:c8cbc4bc2c17 | 9 | |
arch | 11:c8cbc4bc2c17 | 10 | pstorage_handle_t flash_handle; |
arch | 11:c8cbc4bc2c17 | 11 | pstorage_handle_t block_handle; |
arch | 11:c8cbc4bc2c17 | 12 | const uint32_t test_passed_code = 0xC0FFEE; |
arch | 11:c8cbc4bc2c17 | 13 | |
arch | 11:c8cbc4bc2c17 | 14 | volatile uint8_t pstorage_wait_flag = 0; |
arch | 11:c8cbc4bc2c17 | 15 | static pstorage_block_t pstorage_wait_handle = 0; |
arch | 11:c8cbc4bc2c17 | 16 | |
arch | 11:c8cbc4bc2c17 | 17 | static void flash_cb_handler(pstorage_handle_t * handle, |
arch | 11:c8cbc4bc2c17 | 18 | uint8_t op_code, |
arch | 11:c8cbc4bc2c17 | 19 | uint32_t result, |
arch | 11:c8cbc4bc2c17 | 20 | uint8_t * p_data, |
arch | 11:c8cbc4bc2c17 | 21 | uint32_t data_len) |
arch | 11:c8cbc4bc2c17 | 22 | { |
arch | 11:c8cbc4bc2c17 | 23 | if(handle->block_id == pstorage_wait_handle) { |
arch | 11:c8cbc4bc2c17 | 24 | pstorage_wait_flag = 0; //If we are waiting for this callback, clear the wait flag. |
arch | 11:c8cbc4bc2c17 | 25 | } |
arch | 11:c8cbc4bc2c17 | 26 | } |
arch | 11:c8cbc4bc2c17 | 27 | |
arch | 11:c8cbc4bc2c17 | 28 | int test_is_passed(void) |
arch | 11:c8cbc4bc2c17 | 29 | { |
arch | 11:c8cbc4bc2c17 | 30 | pstorage_module_param_t param; |
arch | 11:c8cbc4bc2c17 | 31 | uint32_t retval; |
arch | 11:c8cbc4bc2c17 | 32 | uint32_t present; |
arch | 11:c8cbc4bc2c17 | 33 | |
arch | 11:c8cbc4bc2c17 | 34 | retval = pstorage_init(); |
arch | 11:c8cbc4bc2c17 | 35 | if(retval != NRF_SUCCESS) { |
arch | 11:c8cbc4bc2c17 | 36 | return 0; |
arch | 11:c8cbc4bc2c17 | 37 | } |
arch | 11:c8cbc4bc2c17 | 38 | |
arch | 11:c8cbc4bc2c17 | 39 | param.block_size = 32; //Select block size of 32 bytes |
arch | 11:c8cbc4bc2c17 | 40 | param.block_count = 8; //Select 8 blocks, total of 256 bytes |
arch | 11:c8cbc4bc2c17 | 41 | param.cb = flash_cb_handler; //Set the pstorage callback handler |
arch | 11:c8cbc4bc2c17 | 42 | |
arch | 11:c8cbc4bc2c17 | 43 | retval = pstorage_register(¶m, &flash_handle); |
arch | 11:c8cbc4bc2c17 | 44 | if (retval != NRF_SUCCESS) { |
arch | 11:c8cbc4bc2c17 | 45 | return 0; |
arch | 11:c8cbc4bc2c17 | 46 | } |
arch | 11:c8cbc4bc2c17 | 47 | |
arch | 11:c8cbc4bc2c17 | 48 | //Get block identifiers |
arch | 11:c8cbc4bc2c17 | 49 | pstorage_block_identifier_get(&flash_handle, 0, &block_handle); |
arch | 11:c8cbc4bc2c17 | 50 | |
arch | 11:c8cbc4bc2c17 | 51 | retval = pstorage_load((uint8_t *)&present, &block_handle, 4, 0); //Read from flash, only one block is allowed for each pstorage_load command |
arch | 11:c8cbc4bc2c17 | 52 | if (retval != NRF_SUCCESS) { |
arch | 11:c8cbc4bc2c17 | 53 | return 0; |
arch | 11:c8cbc4bc2c17 | 54 | } |
arch | 11:c8cbc4bc2c17 | 55 | |
arch | 11:c8cbc4bc2c17 | 56 | if (present != test_passed_code) { |
arch | 11:c8cbc4bc2c17 | 57 | return 0; |
arch | 11:c8cbc4bc2c17 | 58 | } |
arch | 11:c8cbc4bc2c17 | 59 | |
arch | 11:c8cbc4bc2c17 | 60 | return 1; |
arch | 11:c8cbc4bc2c17 | 61 | } |
arch | 11:c8cbc4bc2c17 | 62 | |
arch | 11:c8cbc4bc2c17 | 63 | int test_save_result(int result) |
arch | 11:c8cbc4bc2c17 | 64 | { |
arch | 11:c8cbc4bc2c17 | 65 | if (result == 0) { |
arch | 11:c8cbc4bc2c17 | 66 | uint32_t retval; |
arch | 11:c8cbc4bc2c17 | 67 | pstorage_wait_handle = block_handle.block_id; //Specify which pstorage handle to wait for |
arch | 11:c8cbc4bc2c17 | 68 | pstorage_wait_flag = 1; //Set the wait flag. Cleared in the example_cb_handler |
arch | 11:c8cbc4bc2c17 | 69 | |
arch | 11:c8cbc4bc2c17 | 70 | //Store data to three blocks. Wait for the last store operation to finish before reading out the data. |
arch | 11:c8cbc4bc2c17 | 71 | retval = pstorage_store(&block_handle, (uint8_t *)&test_passed_code, 4, 0); //Write to flash, only one block is allowed for each pstorage_store command |
arch | 11:c8cbc4bc2c17 | 72 | if (retval != NRF_SUCCESS) { |
arch | 11:c8cbc4bc2c17 | 73 | return -1; |
arch | 11:c8cbc4bc2c17 | 74 | } |
arch | 11:c8cbc4bc2c17 | 75 | |
arch | 11:c8cbc4bc2c17 | 76 | // while(pstorage_wait_flag) { } // until store operation is finished. |
arch | 11:c8cbc4bc2c17 | 77 | } |
arch | 11:c8cbc4bc2c17 | 78 | |
arch | 11:c8cbc4bc2c17 | 79 | return 0; |
arch | 11:c8cbc4bc2c17 | 80 | } |
arch | 11:c8cbc4bc2c17 | 81 | |
arch | 11:c8cbc4bc2c17 | 82 | |
arch | 11:c8cbc4bc2c17 | 83 | int test_check_io() |
arch | 11:c8cbc4bc2c17 | 84 | { |
arch | 11:c8cbc4bc2c17 | 85 | // 10x2 pins |
arch | 11:c8cbc4bc2c17 | 86 | const uint32_t mask = ((uint32_t)1 << 11) - 1; |
arch | 11:c8cbc4bc2c17 | 87 | BusInOut group1(p18, p17, p23, p24, p0, p2, p3, p4, p9, p10); |
arch | 11:c8cbc4bc2c17 | 88 | BusInOut group2(p25, p28, p29, p30, p5, p6, p7, p8, p12, p13); |
arch | 11:c8cbc4bc2c17 | 89 | |
arch | 11:c8cbc4bc2c17 | 90 | group1.input(); |
arch | 11:c8cbc4bc2c17 | 91 | group2.output(); |
arch | 12:c4090cb58976 | 92 | |
arch | 12:c4090cb58976 | 93 | |
arch | 12:c4090cb58976 | 94 | for (int i = 0; i < 10; i++) { |
arch | 12:c4090cb58976 | 95 | uint32_t out = 1 << i; |
arch | 12:c4090cb58976 | 96 | group2.write(out); |
arch | 12:c4090cb58976 | 97 | if ((group1.read() & mask) != out) { |
arch | 12:c4090cb58976 | 98 | return -1; |
arch | 12:c4090cb58976 | 99 | } |
arch | 11:c8cbc4bc2c17 | 100 | } |
arch | 11:c8cbc4bc2c17 | 101 | |
arch | 11:c8cbc4bc2c17 | 102 | group2.input(); |
arch | 11:c8cbc4bc2c17 | 103 | group1.output(); |
arch | 11:c8cbc4bc2c17 | 104 | |
arch | 12:c4090cb58976 | 105 | for (int i = 0; i < 10; i++) { |
arch | 12:c4090cb58976 | 106 | uint32_t out = 1 << i; |
arch | 12:c4090cb58976 | 107 | group1.write(out); |
arch | 12:c4090cb58976 | 108 | if ((group2.read() & mask) != out) { |
arch | 12:c4090cb58976 | 109 | return -1; |
arch | 12:c4090cb58976 | 110 | } |
arch | 11:c8cbc4bc2c17 | 111 | } |
arch | 11:c8cbc4bc2c17 | 112 | |
arch | 11:c8cbc4bc2c17 | 113 | group1.input(); |
arch | 11:c8cbc4bc2c17 | 114 | |
arch | 11:c8cbc4bc2c17 | 115 | return 0; |
arch | 11:c8cbc4bc2c17 | 116 | } |
arch | 11:c8cbc4bc2c17 | 117 | |
arch | 11:c8cbc4bc2c17 | 118 | int test_check_vcc() |
arch | 11:c8cbc4bc2c17 | 119 | { |
arch | 11:c8cbc4bc2c17 | 120 | AnalogIn vcc(p1); |
arch | 11:c8cbc4bc2c17 | 121 | float sum = 0; |
arch | 11:c8cbc4bc2c17 | 122 | |
arch | 11:c8cbc4bc2c17 | 123 | for (int i = 0; i < 3; i++) { |
arch | 11:c8cbc4bc2c17 | 124 | sum += vcc.read(); |
arch | 11:c8cbc4bc2c17 | 125 | } |
arch | 11:c8cbc4bc2c17 | 126 | |
arch | 12:c4090cb58976 | 127 | float val = ((sum / 3.0) * 3.3); |
arch | 12:c4090cb58976 | 128 | if (val < 2.65 || val > 2.95) { // 2.8V |
arch | 11:c8cbc4bc2c17 | 129 | return -1; |
arch | 11:c8cbc4bc2c17 | 130 | } |
arch | 11:c8cbc4bc2c17 | 131 | |
arch | 11:c8cbc4bc2c17 | 132 | return 0; |
arch | 11:c8cbc4bc2c17 | 133 | } |
arch | 11:c8cbc4bc2c17 | 134 | |
arch | 11:c8cbc4bc2c17 | 135 | void test_output_result(int result) |
arch | 11:c8cbc4bc2c17 | 136 | { |
arch | 11:c8cbc4bc2c17 | 137 | const uint32_t periods[] = {160, 120, 80, 40}; |
arch | 11:c8cbc4bc2c17 | 138 | PwmOut wave(p11); |
arch | 11:c8cbc4bc2c17 | 139 | |
arch | 11:c8cbc4bc2c17 | 140 | wave.period_ms(periods[result]); |
arch | 11:c8cbc4bc2c17 | 141 | wave = 0.5; |
arch | 11:c8cbc4bc2c17 | 142 | |
arch | 11:c8cbc4bc2c17 | 143 | } |
arch | 11:c8cbc4bc2c17 | 144 |