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
- Committer:
- murilopontes
- Date:
- 2014-03-11
- Revision:
- 1:e1b8d88fa26d
- Parent:
- 0:0959f6b614a2
- Child:
- 2:c0591e9eb622
File content as of revision 1:e1b8d88fa26d:
#include "mbed.h" #include "rtos.h" #include "tinysh.h" Serial pc(USBTX, USBRX); //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// /////// RTOS TESTING /////////////////////////////////////////// Mutex stdio_mutex; void notify(const char* name, int state) { stdio_mutex.lock(); printf("%s: %d\n\r", name, state); stdio_mutex.unlock(); } Semaphore two_slots(2); void test_thread(void const *name) { while (true) { two_slots.wait(); printf("%s\n\r", (const char*)name); Thread::wait(1000); two_slots.release(); } } DigitalOut led(LED1); void led_thread(void const *argument) { while (true) { // Signal flags that are reported as event are automatically cleared. Thread::signal_wait(0x1); led = !led; } } void led_send(){ Thread thread(led_thread); while (true) { Thread::wait(1000); thread.signal_set(0x1); } } typedef struct { float voltage; /* AD result of measured voltage */ float current; /* AD result of measured current */ uint32_t counter; /* A counter value */ } message_t; MemoryPool<message_t, 16> mpool; Queue<message_t, 16> queue; /* Send Thread */ void send_thread (void const *args) { uint32_t i = 0; while (true) { i++; // fake data update message_t *message = mpool.alloc(); message->voltage = (i * 0.1) * 33; message->current = (i * 0.1) * 11; message->counter = i; queue.put(message); Thread::wait(1000); } } int main3 (void) { Thread thread(send_thread); while (true) { osEvent evt = queue.get(); if (evt.status == osEventMessage) { message_t *message = (message_t*)evt.value.p; printf("\nVoltage: %.2f V\n\r" , message->voltage); printf("Current: %.2f A\n\r" , message->current); printf("Number of cycles: %u\n\r", message->counter); mpool.free(message); } } } /* Mail */ typedef struct { float voltage; /* AD result of measured voltage */ float current; /* AD result of measured current */ uint32_t counter; /* A counter value */ } mail_t; Mail<mail_t, 16> mail_box; void send_thread2 (void const *args) { uint32_t i = 0; while (true) { i++; // fake data update mail_t *mail = mail_box.alloc(); mail->voltage = (i * 0.1) * 33; mail->current = (i * 0.1) * 11; mail->counter = i; mail_box.put(mail); Thread::wait(1000); } } int main4 (void) { Thread thread(send_thread2); while (true) { osEvent evt = mail_box.get(); if (evt.status == osEventMail) { mail_t *mail = (mail_t*)evt.value.p; printf("\nVoltage: %.2f V\n\r" , mail->voltage); printf("Current: %.2f A\n\r" , mail->current); printf("Number of cycles: %u\n\r", mail->counter); mail_box.free(mail); } } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// /////// HARDWARE TEST KL25 ACCEL /////////////////////////// #include "MMA8451Q.h" #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) PinName const SDA = PTE25; PinName const SCL = PTE24; #elif defined (TARGET_KL05Z) PinName const SDA = PTB4; PinName const SCL = PTB3; #else #error TARGET NOT DEFINED #endif #define MMA8451_I2C_ADDRESS (0x1d<<1) PwmOut rled(LED1); PwmOut gled(LED2); PwmOut bled(LED3); MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); void kl25z_read_accel(int argc, char **argv){ float x, y, z; x = rled = 1.0 - abs(acc.getAccX()); y = gled = 1.0 - abs(acc.getAccY()); z = bled = 1.0 - abs(acc.getAccZ()); pc.printf("X: %1.2f, Y: %1.2f, Z: %1.2f\r\n", x, y, z); } tinysh_cmd_t cmd_accel={0,"accel","read ACCEL accel","[args]",kl25z_read_accel,0,0,0}; //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// /////// HARDWARE TEST KL25 TSI /////////////////////////// #include "tsi_sensor.h" /* This defines will be replaced by PinNames soon */ #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) #define ELEC0 9 #define ELEC1 10 #elif defined (TARGET_KL05Z) #define ELEC0 9 #define ELEC1 8 #else #error TARGET NOT DEFINED #endif TSIAnalogSlider tsi(ELEC0, ELEC1, 40); void kl25z_read_tsi(int argc, char **argv) { pc.printf("tsi=%f\r\n",tsi.readPercentage()); } tinysh_cmd_t cmd_tsi={0,"tsi","read TSI sensor value","[args]",kl25z_read_tsi,0,0,0}; //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// /////// TINY SHELL EXAMPLE AS THREAD /////////////////////////// void foo_fnt(int argc, char **argv) { printf("foo command called\r\n"); for(int i=0;i<argc;i++) { printf("argv[%d]=\"%s\"\r\n",i,argv[i]); } } tinysh_cmd_t myfoocmd={0,"foo","foo command","[args]",foo_fnt,0,0,0}; void tinysh_char_out(unsigned char c) { pc.putc(c); } void tinyshell_thread(void const *args) { pc.baud(115200); pc.printf("kl25z tiny shell build %s %s\r\n",__DATE__,__TIME__); tinysh_set_prompt("$ "); tinysh_add_command(&myfoocmd); tinysh_add_command(&cmd_tsi); tinysh_add_command(&cmd_accel); while(true) { tinysh_char_in( pc.getc() ); } } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// int main() { // Thread thread_shell(tinyshell_thread); Thread::wait(osWaitForever); }