Original

Dependencies:   EFM32_SegmentLCD mbed-os mbed

main.cpp

Committer:
ura_pooh
Date:
2016-12-14
Revision:
0:7ade3b6a47a9

File content as of revision 0:7ade3b6a47a9:

#include "mbed.h"
#include "rtos.h"
#include "EFM32_SegmentLCD.h"

// import LCD Library
silabs::EFM32_SegmentLCD segmentDisplay;

//score counter
int32_t g_count;
 
// Hardware Resource
DigitalOut led1(LED1); // LED
DigitalOut led2(LED2); // LED
InterruptIn in1(PB9);  // Push Button
InterruptIn in2(PB10); // Push Button

// for OS Resource 
osThreadId MyThread1; // Thread ID
osThreadId MyThread2; // Thread ID
osThreadId MyThread3; // Thread ID
osThreadId MyThread4; // Thread ID

// Button Handler
void in1_handler() {
    osSignalSet(MyThread1, 3); //set signal for thread1
    g_count++; // Update score for single count
}

// Button Handler
void in2_handler() {
    osSignalSet(MyThread2, 10); // set signal for thread2
    g_count+=2; // Update score for double count
}

// Thread1 
void led1_thread(void const *args) {
    MyThread1 = Thread::gettid();  // Get this thread ID
    while(true) {
        Thread::signal_wait(3, osWaitForever );  // Waiting signal as 3 from BTN1
        led1 = !led1;  //Toggled LED0
        segmentDisplay.Number(g_count); // Display update for current count value 
        Thread::wait(100); // Wait 100ms 
        Thread::yield();  // Dispath Other Thread
    }    
    
}

// Thread2
void led2_thread(void const *args) {
    MyThread2 = Thread::gettid();  // Get this thread ID
    while (true) {
        Thread::signal_wait(10, osWaitForever); // Waiting signal as 10 from BTN2
        led2 = !led2; // Toggled LED1
        segmentDisplay.Number(g_count); //Display update for current count value
        Thread::wait(100); // Wait 100ms
        Thread::yield(); // Dispatch  Other Thread
    }
}

// Thread3 
void btn1_thread(void const *args) {
    int32_t btn_cnt1;  // for Display control
    MyThread3 = Thread::gettid(); // Get This Thread ID
    btn_cnt1 =0; // Status Initialize 
    
    while(true) {
        if(btn_cnt1 == 0) { // Status Check   
            segmentDisplay.Write("Bay-");  // Display Update for Text
            btn_cnt1 = 1;  // Change Status
        }
        else {
            segmentDisplay.Write("Blade"); // Display Update for Text
            btn_cnt1 =0;  // Change Status
        }
        Thread::wait(1000); // Wait 1000ms
        Thread::yield();  // Dispatch Other Thread
    }
}

// Thread4     
void btn2_thread(void const *args) {
    int32_t count;  // for Counter Value
    MyThread4 = Thread::gettid();  // Get Thread ID
    count=0; // Counter Initialize
    while(true) {
        segmentDisplay.ARing(count & 0x7, (count & 0x8) == 0);  // Ring Display Update 
        if(count > 16) count=0;  //Display Counter Value Update
        else count++; // Counter Increment
        Thread::wait(1000); // Wait 1000ms
        Thread::yield(); // Dispatch Other Thread
    }
}

// Main
int main() {
    g_count =0; // Global Counter Clear
    Thread thread1(led1_thread); // Create Thread
    Thread thread2(led2_thread); // Create Thread 
    Thread thread3(btn1_thread); // Create Thread 
    Thread thread4(btn2_thread); // Create Thread
    
    // Initialize pushbutton handler
    in1.rise(NULL); // BTN0 Initialize
    in1.fall(in1_handler); // BTN0 Handler Configuration
    in2.rise(NULL); // BTN1 Initialize
    in2.fall(in2_handler); // BTN1 Handler Configuration
    
    wait(1); // Wait for Display 
    segmentDisplay.Write("Shoot!");  // Display This Message
    
    // Loop
    while (true) {
         wait(1000);
    }
}