tinyshell demo example
Dependencies: mbed tinyshell MMA8451Q mbed-rtos tsi_sensor cc1101
Demonstrate how to implement commands to test all hardware avaliable in the board using shell commands.
TSI Sensor percentage
MMA8451Q Accelerometer values with RGB Led PWM.
mbed-RTOS test all features.
main.cpp@2:c0591e9eb622, 2014-03-11 (annotated)
- Committer:
- murilopontes
- Date:
- Tue Mar 11 05:02:06 2014 +0000
- Revision:
- 2:c0591e9eb622
- Parent:
- 1:e1b8d88fa26d
- Child:
- 3:87a19cb69c25
format code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
murilopontes | 0:0959f6b614a2 | 1 | #include "mbed.h" |
murilopontes | 1:e1b8d88fa26d | 2 | #include "rtos.h" |
murilopontes | 2:c0591e9eb622 | 3 | #include "tinysh.h" |
murilopontes | 1:e1b8d88fa26d | 4 | |
murilopontes | 1:e1b8d88fa26d | 5 | Serial pc(USBTX, USBRX); |
murilopontes | 1:e1b8d88fa26d | 6 | |
murilopontes | 1:e1b8d88fa26d | 7 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 8 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 9 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 10 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 11 | /////// RTOS TESTING /////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 12 | |
murilopontes | 2:c0591e9eb622 | 13 | Mutex stdio_mutex; |
murilopontes | 2:c0591e9eb622 | 14 | |
murilopontes | 2:c0591e9eb622 | 15 | void notify(const char* name, int state) |
murilopontes | 2:c0591e9eb622 | 16 | { |
murilopontes | 1:e1b8d88fa26d | 17 | stdio_mutex.lock(); |
murilopontes | 1:e1b8d88fa26d | 18 | printf("%s: %d\n\r", name, state); |
murilopontes | 1:e1b8d88fa26d | 19 | stdio_mutex.unlock(); |
murilopontes | 1:e1b8d88fa26d | 20 | } |
murilopontes | 1:e1b8d88fa26d | 21 | |
murilopontes | 1:e1b8d88fa26d | 22 | Semaphore two_slots(2); |
murilopontes | 2:c0591e9eb622 | 23 | |
murilopontes | 2:c0591e9eb622 | 24 | void test_thread(void const *name) |
murilopontes | 2:c0591e9eb622 | 25 | { |
murilopontes | 1:e1b8d88fa26d | 26 | while (true) { |
murilopontes | 1:e1b8d88fa26d | 27 | two_slots.wait(); |
murilopontes | 1:e1b8d88fa26d | 28 | printf("%s\n\r", (const char*)name); |
murilopontes | 1:e1b8d88fa26d | 29 | Thread::wait(1000); |
murilopontes | 1:e1b8d88fa26d | 30 | two_slots.release(); |
murilopontes | 1:e1b8d88fa26d | 31 | } |
murilopontes | 1:e1b8d88fa26d | 32 | } |
murilopontes | 2:c0591e9eb622 | 33 | |
murilopontes | 1:e1b8d88fa26d | 34 | DigitalOut led(LED1); |
murilopontes | 2:c0591e9eb622 | 35 | |
murilopontes | 2:c0591e9eb622 | 36 | void led_thread(void const *argument) |
murilopontes | 2:c0591e9eb622 | 37 | { |
murilopontes | 1:e1b8d88fa26d | 38 | while (true) { |
murilopontes | 1:e1b8d88fa26d | 39 | // Signal flags that are reported as event are automatically cleared. |
murilopontes | 1:e1b8d88fa26d | 40 | Thread::signal_wait(0x1); |
murilopontes | 1:e1b8d88fa26d | 41 | led = !led; |
murilopontes | 1:e1b8d88fa26d | 42 | } |
murilopontes | 1:e1b8d88fa26d | 43 | } |
murilopontes | 2:c0591e9eb622 | 44 | |
murilopontes | 2:c0591e9eb622 | 45 | void led_send() |
murilopontes | 2:c0591e9eb622 | 46 | { |
murilopontes | 2:c0591e9eb622 | 47 | Thread thread(led_thread); |
murilopontes | 2:c0591e9eb622 | 48 | |
murilopontes | 1:e1b8d88fa26d | 49 | while (true) { |
murilopontes | 1:e1b8d88fa26d | 50 | Thread::wait(1000); |
murilopontes | 1:e1b8d88fa26d | 51 | thread.signal_set(0x1); |
murilopontes | 1:e1b8d88fa26d | 52 | } |
murilopontes | 2:c0591e9eb622 | 53 | } |
murilopontes | 2:c0591e9eb622 | 54 | |
murilopontes | 1:e1b8d88fa26d | 55 | |
murilopontes | 1:e1b8d88fa26d | 56 | typedef struct { |
murilopontes | 1:e1b8d88fa26d | 57 | float voltage; /* AD result of measured voltage */ |
murilopontes | 1:e1b8d88fa26d | 58 | float current; /* AD result of measured current */ |
murilopontes | 1:e1b8d88fa26d | 59 | uint32_t counter; /* A counter value */ |
murilopontes | 1:e1b8d88fa26d | 60 | } message_t; |
murilopontes | 2:c0591e9eb622 | 61 | |
murilopontes | 1:e1b8d88fa26d | 62 | MemoryPool<message_t, 16> mpool; |
murilopontes | 1:e1b8d88fa26d | 63 | Queue<message_t, 16> queue; |
murilopontes | 2:c0591e9eb622 | 64 | |
murilopontes | 1:e1b8d88fa26d | 65 | /* Send Thread */ |
murilopontes | 2:c0591e9eb622 | 66 | void send_thread (void const *args) |
murilopontes | 2:c0591e9eb622 | 67 | { |
murilopontes | 1:e1b8d88fa26d | 68 | uint32_t i = 0; |
murilopontes | 1:e1b8d88fa26d | 69 | while (true) { |
murilopontes | 1:e1b8d88fa26d | 70 | i++; // fake data update |
murilopontes | 1:e1b8d88fa26d | 71 | message_t *message = mpool.alloc(); |
murilopontes | 2:c0591e9eb622 | 72 | message->voltage = (i * 0.1) * 33; |
murilopontes | 1:e1b8d88fa26d | 73 | message->current = (i * 0.1) * 11; |
murilopontes | 1:e1b8d88fa26d | 74 | message->counter = i; |
murilopontes | 1:e1b8d88fa26d | 75 | queue.put(message); |
murilopontes | 1:e1b8d88fa26d | 76 | Thread::wait(1000); |
murilopontes | 1:e1b8d88fa26d | 77 | } |
murilopontes | 1:e1b8d88fa26d | 78 | } |
murilopontes | 2:c0591e9eb622 | 79 | |
murilopontes | 2:c0591e9eb622 | 80 | int main3 (void) |
murilopontes | 2:c0591e9eb622 | 81 | { |
murilopontes | 1:e1b8d88fa26d | 82 | Thread thread(send_thread); |
murilopontes | 2:c0591e9eb622 | 83 | |
murilopontes | 1:e1b8d88fa26d | 84 | while (true) { |
murilopontes | 1:e1b8d88fa26d | 85 | osEvent evt = queue.get(); |
murilopontes | 1:e1b8d88fa26d | 86 | if (evt.status == osEventMessage) { |
murilopontes | 1:e1b8d88fa26d | 87 | message_t *message = (message_t*)evt.value.p; |
murilopontes | 1:e1b8d88fa26d | 88 | printf("\nVoltage: %.2f V\n\r" , message->voltage); |
murilopontes | 1:e1b8d88fa26d | 89 | printf("Current: %.2f A\n\r" , message->current); |
murilopontes | 1:e1b8d88fa26d | 90 | printf("Number of cycles: %u\n\r", message->counter); |
murilopontes | 2:c0591e9eb622 | 91 | |
murilopontes | 1:e1b8d88fa26d | 92 | mpool.free(message); |
murilopontes | 1:e1b8d88fa26d | 93 | } |
murilopontes | 1:e1b8d88fa26d | 94 | } |
murilopontes | 2:c0591e9eb622 | 95 | } |
murilopontes | 2:c0591e9eb622 | 96 | |
murilopontes | 1:e1b8d88fa26d | 97 | |
murilopontes | 1:e1b8d88fa26d | 98 | |
murilopontes | 1:e1b8d88fa26d | 99 | |
murilopontes | 0:0959f6b614a2 | 100 | |
murilopontes | 1:e1b8d88fa26d | 101 | /* Mail */ |
murilopontes | 1:e1b8d88fa26d | 102 | typedef struct { |
murilopontes | 2:c0591e9eb622 | 103 | float voltage; /* AD result of measured voltage */ |
murilopontes | 2:c0591e9eb622 | 104 | float current; /* AD result of measured current */ |
murilopontes | 2:c0591e9eb622 | 105 | uint32_t counter; /* A counter value */ |
murilopontes | 1:e1b8d88fa26d | 106 | } mail_t; |
murilopontes | 2:c0591e9eb622 | 107 | |
murilopontes | 1:e1b8d88fa26d | 108 | Mail<mail_t, 16> mail_box; |
murilopontes | 2:c0591e9eb622 | 109 | |
murilopontes | 2:c0591e9eb622 | 110 | void send_thread2 (void const *args) |
murilopontes | 2:c0591e9eb622 | 111 | { |
murilopontes | 1:e1b8d88fa26d | 112 | uint32_t i = 0; |
murilopontes | 1:e1b8d88fa26d | 113 | while (true) { |
murilopontes | 1:e1b8d88fa26d | 114 | i++; // fake data update |
murilopontes | 1:e1b8d88fa26d | 115 | mail_t *mail = mail_box.alloc(); |
murilopontes | 2:c0591e9eb622 | 116 | mail->voltage = (i * 0.1) * 33; |
murilopontes | 1:e1b8d88fa26d | 117 | mail->current = (i * 0.1) * 11; |
murilopontes | 1:e1b8d88fa26d | 118 | mail->counter = i; |
murilopontes | 1:e1b8d88fa26d | 119 | mail_box.put(mail); |
murilopontes | 1:e1b8d88fa26d | 120 | Thread::wait(1000); |
murilopontes | 1:e1b8d88fa26d | 121 | } |
murilopontes | 1:e1b8d88fa26d | 122 | } |
murilopontes | 2:c0591e9eb622 | 123 | |
murilopontes | 2:c0591e9eb622 | 124 | int main4 (void) |
murilopontes | 2:c0591e9eb622 | 125 | { |
murilopontes | 1:e1b8d88fa26d | 126 | Thread thread(send_thread2); |
murilopontes | 2:c0591e9eb622 | 127 | |
murilopontes | 1:e1b8d88fa26d | 128 | while (true) { |
murilopontes | 1:e1b8d88fa26d | 129 | osEvent evt = mail_box.get(); |
murilopontes | 1:e1b8d88fa26d | 130 | if (evt.status == osEventMail) { |
murilopontes | 1:e1b8d88fa26d | 131 | mail_t *mail = (mail_t*)evt.value.p; |
murilopontes | 1:e1b8d88fa26d | 132 | printf("\nVoltage: %.2f V\n\r" , mail->voltage); |
murilopontes | 1:e1b8d88fa26d | 133 | printf("Current: %.2f A\n\r" , mail->current); |
murilopontes | 1:e1b8d88fa26d | 134 | printf("Number of cycles: %u\n\r", mail->counter); |
murilopontes | 2:c0591e9eb622 | 135 | |
murilopontes | 1:e1b8d88fa26d | 136 | mail_box.free(mail); |
murilopontes | 1:e1b8d88fa26d | 137 | } |
murilopontes | 1:e1b8d88fa26d | 138 | } |
murilopontes | 1:e1b8d88fa26d | 139 | } |
murilopontes | 1:e1b8d88fa26d | 140 | |
murilopontes | 2:c0591e9eb622 | 141 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 142 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 143 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 144 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 145 | /////// HARDWARE TEST KL25 ACCEL /////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 146 | |
murilopontes | 1:e1b8d88fa26d | 147 | |
murilopontes | 1:e1b8d88fa26d | 148 | #include "MMA8451Q.h" |
murilopontes | 1:e1b8d88fa26d | 149 | |
murilopontes | 1:e1b8d88fa26d | 150 | #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) |
murilopontes | 2:c0591e9eb622 | 151 | PinName const SDA = PTE25; |
murilopontes | 2:c0591e9eb622 | 152 | PinName const SCL = PTE24; |
murilopontes | 1:e1b8d88fa26d | 153 | #elif defined (TARGET_KL05Z) |
murilopontes | 2:c0591e9eb622 | 154 | PinName const SDA = PTB4; |
murilopontes | 2:c0591e9eb622 | 155 | PinName const SCL = PTB3; |
murilopontes | 1:e1b8d88fa26d | 156 | #else |
murilopontes | 2:c0591e9eb622 | 157 | #error TARGET NOT DEFINED |
murilopontes | 1:e1b8d88fa26d | 158 | #endif |
murilopontes | 1:e1b8d88fa26d | 159 | |
murilopontes | 1:e1b8d88fa26d | 160 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
murilopontes | 1:e1b8d88fa26d | 161 | |
murilopontes | 2:c0591e9eb622 | 162 | PwmOut rled(LED1); |
murilopontes | 2:c0591e9eb622 | 163 | PwmOut gled(LED2); |
murilopontes | 2:c0591e9eb622 | 164 | PwmOut bled(LED3); |
murilopontes | 1:e1b8d88fa26d | 165 | |
murilopontes | 2:c0591e9eb622 | 166 | MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); |
murilopontes | 1:e1b8d88fa26d | 167 | |
murilopontes | 2:c0591e9eb622 | 168 | void kl25z_read_accel(int argc, char **argv) |
murilopontes | 2:c0591e9eb622 | 169 | { |
murilopontes | 2:c0591e9eb622 | 170 | float x, y, z; |
murilopontes | 2:c0591e9eb622 | 171 | |
murilopontes | 2:c0591e9eb622 | 172 | x = rled = 1.0 - abs(acc.getAccX()); |
murilopontes | 2:c0591e9eb622 | 173 | y = gled = 1.0 - abs(acc.getAccY()); |
murilopontes | 2:c0591e9eb622 | 174 | z = bled = 1.0 - abs(acc.getAccZ()); |
murilopontes | 2:c0591e9eb622 | 175 | pc.printf("X: %1.2f, Y: %1.2f, Z: %1.2f\r\n", x, y, z); |
murilopontes | 1:e1b8d88fa26d | 176 | } |
murilopontes | 1:e1b8d88fa26d | 177 | |
murilopontes | 2:c0591e9eb622 | 178 | tinysh_cmd_t cmd_accel= {0,"accel","read ACCEL accel","[args]",kl25z_read_accel,0,0,0}; |
murilopontes | 1:e1b8d88fa26d | 179 | |
murilopontes | 2:c0591e9eb622 | 180 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 181 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 182 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 183 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 184 | /////// HARDWARE TEST KL25 TSI /////////////////////////// |
murilopontes | 2:c0591e9eb622 | 185 | |
murilopontes | 2:c0591e9eb622 | 186 | |
murilopontes | 1:e1b8d88fa26d | 187 | #include "tsi_sensor.h" |
murilopontes | 1:e1b8d88fa26d | 188 | /* This defines will be replaced by PinNames soon */ |
murilopontes | 1:e1b8d88fa26d | 189 | #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) |
murilopontes | 2:c0591e9eb622 | 190 | #define ELEC0 9 |
murilopontes | 2:c0591e9eb622 | 191 | #define ELEC1 10 |
murilopontes | 1:e1b8d88fa26d | 192 | #elif defined (TARGET_KL05Z) |
murilopontes | 2:c0591e9eb622 | 193 | #define ELEC0 9 |
murilopontes | 2:c0591e9eb622 | 194 | #define ELEC1 8 |
murilopontes | 1:e1b8d88fa26d | 195 | #else |
murilopontes | 2:c0591e9eb622 | 196 | #error TARGET NOT DEFINED |
murilopontes | 1:e1b8d88fa26d | 197 | #endif |
murilopontes | 1:e1b8d88fa26d | 198 | |
murilopontes | 1:e1b8d88fa26d | 199 | TSIAnalogSlider tsi(ELEC0, ELEC1, 40); |
murilopontes | 1:e1b8d88fa26d | 200 | |
murilopontes | 1:e1b8d88fa26d | 201 | void kl25z_read_tsi(int argc, char **argv) |
murilopontes | 1:e1b8d88fa26d | 202 | { |
murilopontes | 1:e1b8d88fa26d | 203 | pc.printf("tsi=%f\r\n",tsi.readPercentage()); |
murilopontes | 1:e1b8d88fa26d | 204 | } |
murilopontes | 1:e1b8d88fa26d | 205 | |
murilopontes | 2:c0591e9eb622 | 206 | tinysh_cmd_t cmd_tsi= {0,"tsi","read TSI sensor value","[args]",kl25z_read_tsi,0,0,0}; |
murilopontes | 1:e1b8d88fa26d | 207 | |
murilopontes | 1:e1b8d88fa26d | 208 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 209 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 210 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 211 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 212 | /////// TINY SHELL EXAMPLE AS THREAD /////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 213 | |
murilopontes | 1:e1b8d88fa26d | 214 | |
murilopontes | 1:e1b8d88fa26d | 215 | |
murilopontes | 1:e1b8d88fa26d | 216 | void foo_fnt(int argc, char **argv) |
murilopontes | 1:e1b8d88fa26d | 217 | { |
murilopontes | 2:c0591e9eb622 | 218 | printf("foo command called\r\n"); |
murilopontes | 2:c0591e9eb622 | 219 | for(int i=0; i<argc; i++) { |
murilopontes | 2:c0591e9eb622 | 220 | printf("argv[%d]=\"%s\"\r\n",i,argv[i]); |
murilopontes | 1:e1b8d88fa26d | 221 | } |
murilopontes | 1:e1b8d88fa26d | 222 | } |
murilopontes | 2:c0591e9eb622 | 223 | tinysh_cmd_t myfoocmd= {0,"foo","foo command","[args]",foo_fnt,0,0,0}; |
murilopontes | 1:e1b8d88fa26d | 224 | |
murilopontes | 1:e1b8d88fa26d | 225 | |
murilopontes | 1:e1b8d88fa26d | 226 | |
murilopontes | 1:e1b8d88fa26d | 227 | |
murilopontes | 1:e1b8d88fa26d | 228 | |
murilopontes | 1:e1b8d88fa26d | 229 | |
murilopontes | 1:e1b8d88fa26d | 230 | void tinysh_char_out(unsigned char c) |
murilopontes | 1:e1b8d88fa26d | 231 | { |
murilopontes | 2:c0591e9eb622 | 232 | pc.putc(c); |
murilopontes | 1:e1b8d88fa26d | 233 | } |
murilopontes | 1:e1b8d88fa26d | 234 | |
murilopontes | 2:c0591e9eb622 | 235 | void tinyshell_thread(void const *args) |
murilopontes | 2:c0591e9eb622 | 236 | { |
murilopontes | 2:c0591e9eb622 | 237 | pc.baud(115200); |
murilopontes | 2:c0591e9eb622 | 238 | pc.printf("kl25z tiny shell build %s %s\r\n",__DATE__,__TIME__); |
murilopontes | 2:c0591e9eb622 | 239 | tinysh_set_prompt("$ "); |
murilopontes | 2:c0591e9eb622 | 240 | tinysh_add_command(&myfoocmd); |
murilopontes | 2:c0591e9eb622 | 241 | tinysh_add_command(&cmd_tsi); |
murilopontes | 2:c0591e9eb622 | 242 | tinysh_add_command(&cmd_accel); |
murilopontes | 2:c0591e9eb622 | 243 | |
murilopontes | 2:c0591e9eb622 | 244 | |
murilopontes | 2:c0591e9eb622 | 245 | |
murilopontes | 2:c0591e9eb622 | 246 | |
murilopontes | 2:c0591e9eb622 | 247 | while(true) { |
murilopontes | 2:c0591e9eb622 | 248 | tinysh_char_in( pc.getc() ); |
murilopontes | 1:e1b8d88fa26d | 249 | } |
murilopontes | 1:e1b8d88fa26d | 250 | |
murilopontes | 1:e1b8d88fa26d | 251 | } |
murilopontes | 1:e1b8d88fa26d | 252 | |
murilopontes | 1:e1b8d88fa26d | 253 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 254 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 255 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 256 | //////////////////////////////////////////////////////////////// |
murilopontes | 1:e1b8d88fa26d | 257 | |
murilopontes | 1:e1b8d88fa26d | 258 | |
murilopontes | 2:c0591e9eb622 | 259 | |
murilopontes | 1:e1b8d88fa26d | 260 | |
murilopontes | 1:e1b8d88fa26d | 261 | |
murilopontes | 1:e1b8d88fa26d | 262 | |
murilopontes | 1:e1b8d88fa26d | 263 | |
murilopontes | 1:e1b8d88fa26d | 264 | |
murilopontes | 1:e1b8d88fa26d | 265 | |
murilopontes | 0:0959f6b614a2 | 266 | |
murilopontes | 2:c0591e9eb622 | 267 | int main() |
murilopontes | 2:c0591e9eb622 | 268 | { |
murilopontes | 2:c0591e9eb622 | 269 | |
murilopontes | 1:e1b8d88fa26d | 270 | // |
murilopontes | 1:e1b8d88fa26d | 271 | Thread thread_shell(tinyshell_thread); |
murilopontes | 2:c0591e9eb622 | 272 | |
murilopontes | 1:e1b8d88fa26d | 273 | Thread::wait(osWaitForever); |
murilopontes | 0:0959f6b614a2 | 274 | } |