Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C12832_lcd DebounceInterrupts mbed-rtos mbed USBDevice
Revision 2:ef21b03bb9c2, committed 2014-03-25
- Comitter:
- bhakti08
- Date:
- Tue Mar 25 20:11:11 2014 +0000
- Parent:
- 1:aa410246cf19
- Commit message:
- Final Version
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Mar 25 01:50:16 2014 +0000
+++ b/main.cpp Tue Mar 25 20:11:11 2014 +0000
@@ -1,3 +1,14 @@
+/*****************************************************************************/
+/* Main program for the implementation of RTOS_ALARM Clock */
+/*Function: To sound an alarm when the actual time is equal to alarm time */
+/*Features: USB access to set the time */
+/* User can set the time with the joystick */
+/* Audio Visual alarm available */
+/* Alarm turns OFF automaticaaly after 1 min if not turned OFF */
+/*Author: Bhakti Kulkarni */
+/*Date: 03/25/2014 */
+/*****************************************************************************/
+
#include "mbed.h"
#include "C12832_lcd.h"
#include "DebouncedIn.h"
@@ -14,26 +25,31 @@
#define MAX_SECS 60
C12832_LCD lcd;
-//Serial pc(USBTX,USBRX);
USBSerial serial;
-DebouncedInterrupt increase(p12);
-DebouncedInterrupt select(p14);
-Mutex M_lcd;
-DebouncedIn stop_alarm(p16);
-Ticker update_time;
-DigitalOut wake_up(LED2);
-PwmOut speaker(p26);
+DebouncedInterrupt increase(p12); //Switch to increase time
+DebouncedInterrupt select(p14); //Switch to toggle between hrs and mins
+Mutex M_lcd; //Mutex for LCD
+DebouncedIn stop_alarm(p16); //Switch to stop the alarm
+Ticker update_time; //Ticker to update actual time
+DigitalOut wake_up(LED2); //Visual alarm LED
+PwmOut speaker(p26); //Speaker for audible alarm
-
+/*Global variables for mins and hrs*/
int hrs;
int mins;
int hrs_set = MAX_HRS;
int mins_set = MAX_MINS;
int sec_set = 0;
-bool selection= HR;
-bool set_time_sig;
+bool selection= HR; //Signal to indicate the hrs/mins to be changed
+/*****************************************************************************/
+/* ISR for increasing the time */
+/*Function: This routine checks the value of selection signal. */
+/* If selection value - HR it updates hrs and if selection = MIN */
+/* it updates the minute value. It also checks for the maximum */
+/* value of hrs and mins and reset appropriate variable */
+/*****************************************************************************/
void increase_time()
{
if (selection == HR)
@@ -56,15 +72,25 @@
}
}
}
+/*****************************************************************************/
+/*****************************************************************************/
+/* ISR to update selection */
+/*Function: Allows the user to toggle between the hours and minutes */
+/*****************************************************************************/
void select_time()
{
selection = !selection;
}
+/*****************************************************************************/
+/*****************************************************************************/
+/* Thread to update LCD */
+/*Function: This thread updates the LCD with the actual and the alarm time */
+/*****************************************************************************/
void update_lcd(void const *args)
{
- M_lcd.lock();
+ M_lcd.lock(); //Mutex to lock the LCD
lcd.cls();
lcd.locate(0,20);
while(1) {
@@ -77,8 +103,14 @@
Thread::wait(25);
}
}
+/*****************************************************************************/
-
+/*****************************************************************************/
+/* Ticker function to update the actual time */
+/*This function is called every second. It increments no. of seconds */
+/*Also checks for max secs, mins and hours and accordingly adjusts other */
+/*variables. */
+/*****************************************************************************/
void time_update()
{
sec_set++;
@@ -99,7 +131,37 @@
sec_set = 0;
}
}
-void alarm_on();
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* Function to sound the alarm */
+/*This function is called when the alarm time = actual time */
+/*It sounds the alarm till alarm_stop button is pressed | 1 min is ellapsed */
+/*The variable frequency and beat rate of the PWM decide the tone of alarm */
+/*****************************************************************************/
+void alarm_on()
+{
+ float frequency[]={659,554,659,554,440,494,554,587,494,659,554,440};
+ float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2}; //beat array
+ while (!stop_alarm && !(hrs_set == hrs && mins_set == mins+DURATION)) {
+ wake_up = 1;
+ for (int i=0;i<=11;i++) {
+ speaker.period(1/(2*frequency[i])); // set PWM period
+ speaker=0.5; // set duty cycle
+ wait(0.4*beat[i]); // hold for beat period
+ }
+ }
+ wake_up =0; //Turn OFF visual alarm
+ speaker = 0.0; //Turn OFF audio alarm
+}
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* Thread for time Comparison */
+/*This thread comapres the actual and the alarm time and calls the alarm */
+/*function when both the timings are equal. It also reset the alarm time */
+/*after the alarm is turned OFF(either by user or after a minute is ellapsed)*/
+/*****************************************************************************/
void sound_alarm(void const *args)
{
while (true){
@@ -112,24 +174,15 @@
Thread::wait(50);
}
}
-
+/*****************************************************************************/
-void alarm_on()
-{
- float frequency[]={659,554,659,554,440,494,554,587,494,659,554,440};
- float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2}; //beat array
- while (!stop_alarm && !(hrs_set == hrs && mins_set == mins+DURATION)) {
- wake_up = 1;
- for (int i=0;i<=11;i++) {
- speaker.period(1/(2*frequency[i])); // set PWM period
- speaker=0.5; // set duty cycle
- wait(0.4*beat[i]); // hold for beat period
- }
- }
- wake_up =0;
- speaker = 0.0;
-}
-
+/*****************************************************************************/
+/* Main Thread */
+/*Initializes all the threads and the USB inerface. */
+/*This thread makes a blocking call to set the time. In this application */
+/*blocking call is used since the actual time is necessary parameter for the */
+/*alarm clock. Without the time alarm clock has no function to do. */
+/*****************************************************************************/
int main() {
char ch;
increase.attach(&increase_time);
@@ -143,17 +196,17 @@
serial.scanf("%d",&hrs_set);
if (hrs_set > MAX_HRS)
serial.printf("Enter Valid hours\r\n");
- }while (hrs_set > MAX_HRS);
+ }while (hrs_set > MAX_HRS); //error checking for hours entered
serial.printf("Set mins\r\n");
do
{
serial.scanf("%d",&mins_set);
if (mins_set > MAX_MINS)
serial.printf("Enter Valid minutes\r\n");
- }while (mins_set > MAX_MINS);
+ }while (mins_set > MAX_MINS); //error checking for minutes entered
update_time.attach(&time_update,1);
while(1)
{
- Thread::wait(10000);
+ Thread::wait(1000);
}
}