add setting time with user command
This commit is contained in:
parent
6edccc845d
commit
5879eeea71
81
main.c
81
main.c
|
@ -27,6 +27,7 @@ The time is read from a DS1307 RTC module.
|
||||||
#include <stdlib.h> // standard utilities
|
#include <stdlib.h> // standard utilities
|
||||||
#include <unistd.h> // standard streams
|
#include <unistd.h> // standard streams
|
||||||
#include <errno.h> // error number utilities
|
#include <errno.h> // error number utilities
|
||||||
|
#include <string.h> // string utilities
|
||||||
|
|
||||||
/* STM32 (including CM3) libraries */
|
/* STM32 (including CM3) libraries */
|
||||||
#include <libopencm3/stm32/rcc.h> // real-time control clock library
|
#include <libopencm3/stm32/rcc.h> // real-time control clock library
|
||||||
|
@ -71,6 +72,10 @@ const uint32_t ticks_midday = 12*60*60*TICKS_PER_SECOND;
|
||||||
uint8_t clock_leds[WS2812B_LEDS*3] = {0};
|
uint8_t clock_leds[WS2812B_LEDS*3] = {0};
|
||||||
/** current time in tick */
|
/** current time in tick */
|
||||||
volatile uint32_t current_time = 0;
|
volatile uint32_t current_time = 0;
|
||||||
|
/** user input command */
|
||||||
|
char command[32] = {0};
|
||||||
|
/** user input command index */
|
||||||
|
uint8_t command_i = 0;
|
||||||
|
|
||||||
int _write(int file, char *ptr, int len)
|
int _write(int file, char *ptr, int len)
|
||||||
{
|
{
|
||||||
|
@ -267,6 +272,67 @@ static void clock_animate_time(uint32_t time)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @brief process user command
|
||||||
|
* @param[in] str user command string (\0 ended)
|
||||||
|
*/
|
||||||
|
static void process_command(char* str)
|
||||||
|
{
|
||||||
|
/* split command */
|
||||||
|
const char* delimiter = " ";
|
||||||
|
char* word = strtok(str,delimiter);
|
||||||
|
if (!word) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
/* parse command */
|
||||||
|
if (0==strcmp(word,"help")) {
|
||||||
|
printf("available commands:\n");
|
||||||
|
printf("date [YYYY-MM-DD]\n");
|
||||||
|
printf("time [HH:MM:SS]\n");
|
||||||
|
} else if (0==strcmp(word,"date")) {
|
||||||
|
word = strtok(NULL,delimiter);
|
||||||
|
if (!word) {
|
||||||
|
printf("current date: %04d-%02d-%02d\n", rtc_read_year(), rtc_read_month(), rtc_read_date());
|
||||||
|
} else if (strlen(word)!=10 || word[0]!='2' || word[1]!='0' || word[2]<'0' || word[2]>'9' || word[3]<'0' || word[3]>'9' || word[5]<'0' || word[5]>'1' || word[6]<'0' || word[6]>'9' || word[8]<'0' || word[8]>'3' || word[9]<'0' || word[9]>'9') {
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
if (!rtc_write_year((word[0]-'0')*1000+(word[1]-'0')*100+(word[2]-'0')*10+(word[3]-'0')*1)) {
|
||||||
|
printf("setting year failed\n");
|
||||||
|
} else if (!rtc_write_month((word[5]-'0')*10+(word[6]-'0')*1)) {
|
||||||
|
printf("setting month failed\n");
|
||||||
|
} else if (!rtc_write_date((word[8]-'0')*10+(word[9]-'0')*1)) {
|
||||||
|
printf("setting day failed\n");
|
||||||
|
} else {
|
||||||
|
printf("date set\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (0==strcmp(word,"time")) {
|
||||||
|
word = strtok(NULL,delimiter);
|
||||||
|
if (!word) {
|
||||||
|
printf("current time: %02d:%02d:%02d\n", rtc_read_hours(), rtc_read_minutes(), rtc_read_seconds());
|
||||||
|
} else if (strlen(word)!=8 || word[0]<'0' || word[0]>'2' || word[1]<'0' || word[1]>'9' || word[3]<'0' || word[3]>'5' || word[4]<'0' || word[4]>'9' || word[6]<'0' || word[6]>'5' || word[7]<'0' || word[7]>'9') {
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
if (!rtc_write_hours((word[0]-'0')*10+(word[1]-'0')*1)) {
|
||||||
|
printf("setting hours failed\n");
|
||||||
|
} else if (!rtc_write_minutes((word[3]-'0')*10+(word[4]-'0')*1)) {
|
||||||
|
printf("setting minutes failed\n");
|
||||||
|
} else if (!rtc_write_seconds((word[6]-'0')*10+(word[7]-'0')*1)) {
|
||||||
|
printf("setting seconds failed\n");
|
||||||
|
} else {
|
||||||
|
current_time = rtc_read_hours()*ticks_hour+rtc_read_minutes()*ticks_minute+rtc_read_seconds()*ticks_second; // set also internal time
|
||||||
|
rtc_oscillator_enable(); // be sure the oscillation is enabled
|
||||||
|
printf("time set\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return; // command successfully processed
|
||||||
|
error:
|
||||||
|
puts("command not recognized. enter help to list commands");
|
||||||
|
}
|
||||||
|
|
||||||
/** @brief program entry point
|
/** @brief program entry point
|
||||||
* this is the firmware function started by the micro-controller
|
* this is the firmware function started by the micro-controller
|
||||||
*/
|
*/
|
||||||
|
@ -321,9 +387,6 @@ int main(void)
|
||||||
current_time = rtc_time[2]*ticks_hour+rtc_time[1]*ticks_minute+rtc_time[0]*ticks_second; // the current time
|
current_time = rtc_time[2]*ticks_hour+rtc_time[1]*ticks_minute+rtc_time[0]*ticks_second; // the current time
|
||||||
clock_animate_time(current_time); // set time with animation
|
clock_animate_time(current_time); // set time with animation
|
||||||
|
|
||||||
//rtc_write_time(0,52,9,4,23,3,2016);
|
|
||||||
//rtc_oscillator_enable();
|
|
||||||
|
|
||||||
printf("input commands\n");
|
printf("input commands\n");
|
||||||
bool action = false; // if an action has been performed don't go to sleep
|
bool action = false; // if an action has been performed don't go to sleep
|
||||||
button_flag = false; // reset button flag
|
button_flag = false; // reset button flag
|
||||||
|
@ -346,6 +409,18 @@ int main(void)
|
||||||
char_flag = false; // reset flag
|
char_flag = false; // reset flag
|
||||||
action = true; // action has been performed
|
action = true; // action has been performed
|
||||||
printf("%c",c); // echo receive character
|
printf("%c",c); // echo receive character
|
||||||
|
if (c=='\n') { // end of command received
|
||||||
|
if (command_i>0) { // there is a command to process
|
||||||
|
command[command_i] = 0; // end string
|
||||||
|
command_i = 0; // prepare for next command
|
||||||
|
process_command(command); // process user command
|
||||||
|
}
|
||||||
|
} else if (c!='\r') { // user command input
|
||||||
|
command[command_i] = c; // save command input
|
||||||
|
if (command_i<LENGTH(command)-2) { // verify if there is place to save next character
|
||||||
|
command_i++; // save next character
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while (button_flag) { // user pressed button
|
while (button_flag) { // user pressed button
|
||||||
button_flag = false; // reset flag
|
button_flag = false; // reset flag
|
||||||
|
|
Loading…
Reference in New Issue