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.

Committer:
murilopontes
Date:
Tue Mar 11 14:29:16 2014 +0000
Revision:
3:87a19cb69c25
Parent:
2:c0591e9eb622
updates and include cc1101 radio library

Who changed what in which revision?

UserRevisionLine numberNew 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 3:87a19cb69c25 269
murilopontes 3:87a19cb69c25 270 //kl25z led power is inverted 1=off 0=on.
murilopontes 3:87a19cb69c25 271 rled=0.99;
murilopontes 3:87a19cb69c25 272 gled=0.99;
murilopontes 3:87a19cb69c25 273 bled=0.99;
murilopontes 2:c0591e9eb622 274
murilopontes 1:e1b8d88fa26d 275 //
murilopontes 1:e1b8d88fa26d 276 Thread thread_shell(tinyshell_thread);
murilopontes 2:c0591e9eb622 277
murilopontes 1:e1b8d88fa26d 278 Thread::wait(osWaitForever);
murilopontes 0:0959f6b614a2 279 }