📄 traffic.c
字号:
/*----------------------------------------------------------------------------
* Task 2 'command': command processor
*---------------------------------------------------------------------------*/
__task void command (void) {
U32 i;
printf (menu); /* display command menu */
while (1) { /* endless loop */
printf ("\nCommand: "); /* display prompt */
getline (cmdline, sizeof (cmdline)); /* get command line input */
for (i = 0; cmdline[i] != 0; i++) { /* convert to uppercase */
cmdline[i] = (char) toupper(cmdline[i]);
}
for (i = 0; cmdline[i] == ' '; i++); /* skip blanks */
switch (cmdline[i]) { /* proceed to command function */
case 'D': /* Display Time Command */
printf ("Start Time: %02d:%02d:%02d "
"End Time: %02d:%02d:%02d\n",
start.hour, start.min, start.sec,
end.hour, end.min, end.sec);
printf (" type ESC to abort\r");
t_getesc = os_tsk_create (get_escape, 0);/* ESC check in display loop*/
escape = __FALSE; /* clear escape flag */
display_time = __TRUE; /* set display time flag */
os_evt_clr (0x0003, t_command); /* clear pending signals */
while (!escape) { /* while no ESC entered */
printf ("Clock Time: %02d:%02d:%02d\r", /* display time */
ctime.hour, ctime.min, ctime.sec);
os_evt_wait_or (0x0003, 0xffff); /* wait for time change or ESC*/
}
os_tsk_delete (t_getesc); /* terminate 'get_escape' task.*/
display_time = __FALSE; /* clear display time flag */
printf ("\n\n");
break;
case 'T': /* Set Time Command */
if (readtime (&cmdline[i+1])) { /* read time input and */
ctime.hour = rtime.hour; /* store in 'ctime' */
ctime.min = rtime.min;
ctime.sec = rtime.sec;
}
break;
case 'E': /* Set End Time Command */
if (readtime (&cmdline[i+1])) { /* read time input and */
end.hour = rtime.hour; /* store in 'end' */
end.min = rtime.min;
end.sec = rtime.sec;
}
break;
case 'S': /* Set Start Time Command */
if (readtime (&cmdline[i+1])) { /* read time input and */
start.hour = rtime.hour; /* store in 'start' */
start.min = rtime.min;
start.sec = rtime.sec;
}
break;
default: /* Error Handling */
printf (menu); /* display command menu */
break;
}
}
}
/*----------------------------------------------------------------------------
* signalon: check if clock time is between start and end
*---------------------------------------------------------------------------*/
char signalon (void) {
if (memcmp (&start, &end, sizeof (struct time)) < 0) {
if (memcmp (&start, &ctime, sizeof (struct time)) < 0 &&
memcmp (&ctime, &end, sizeof (struct time)) < 0) {
return (1);
}
}
else {
if (memcmp (&end, &ctime, sizeof (start)) > 0 &&
memcmp (&ctime, &start, sizeof (start)) > 0) {
return (1);
}
}
return (0); /* signal off, blinking on */
}
/*----------------------------------------------------------------------------
* Task 4 'blinking': runs if current time is outside start & end time
*---------------------------------------------------------------------------*/
__task void blinking (void) { /* blink yellow light */
SET (red|yellow|green|stop|walk, 0); /* all lights off */
while (1) { /* endless loop */
SET (yellow, 1); /* yellow light on */
os_dly_wait (30); /* wait for timeout: 30 ticks */
SET (yellow, 0); /* yellow light off */
os_dly_wait (30); /* wait for timeout: 30 ticks */
if (signalon ()) { /* if blinking time over */
os_tsk_create (lights, 0); /* start lights */
os_tsk_delete_self (); /* and stop blinking */
}
}
}
/*----------------------------------------------------------------------------
* Task 5 'lights': executes if current time is between start & end time
*---------------------------------------------------------------------------*/
__task void lights (void) { /* traffic light operation */
SET (red|stop, 1); /* red & stop lights on */
SET (yellow|green|walk, 0);
while (1) { /* endless loop */
os_dly_wait (50); /* wait for timeout: 50 ticks */
if (!signalon ()) { /* if traffic signal time over */
os_tsk_create (blinking, 0); /* start blinking */
os_tsk_delete_self (); /* stop lights */
}
SET (yellow, 1);
os_dly_wait (50); /* wait for timeout: 50 ticks */
SET (red|yellow, 0); /* green light for cars */
SET (green, 1);
os_evt_clr (0x0010, t_lights);
os_dly_wait (50); /* wait for timeout: 50 ticks */
os_evt_wait_and (0x0010, 750); /* wait for event with timeout */
SET (yellow, 1); /* timeout value: 750 ticks */
SET (green, 0);
os_dly_wait (50); /* wait for timeout: 50 ticks */
SET (red, 1); /* red light for cars */
SET (yellow, 0);
os_dly_wait (50); /* wait for timeout: 50 ticks */
SET (stop, 0); /* green light for walkers */
SET (walk, 1);
os_dly_wait (250); /* wait for timeout: 250 ticks */
SET (stop, 1); /* red light for walkers */
SET (walk, 0);
}
}
/*----------------------------------------------------------------------------
* Task 6 'keyread': process key stroke from pedestrian push button
*---------------------------------------------------------------------------*/
__task void keyread (void) {
while (1) { /* endless loop */
if ((IOPIN0 & key) == 0) { /* if key pressed */
os_evt_set (0x0010, t_lights); /* send signal to task lights */
}
os_dly_wait (5); /* wait for timeout: 5 ticks */
}
}
/*----------------------------------------------------------------------------
* end of file
*---------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -