summaryrefslogtreecommitdiff
path: root/2004/n/asserv/src/serial.c
diff options
context:
space:
mode:
Diffstat (limited to '2004/n/asserv/src/serial.c')
-rw-r--r--2004/n/asserv/src/serial.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/2004/n/asserv/src/serial.c b/2004/n/asserv/src/serial.c
index 784eb24..826539d 100644
--- a/2004/n/asserv/src/serial.c
+++ b/2004/n/asserv/src/serial.c
@@ -68,8 +68,8 @@ serial_init (void)
serial_recv ()
{
char c;
- if (serial_recv_full) return;
c = getc ();
+ if (serial_recv_full) return;
if (c == '\n' || c == '\r')
{
/* Fin de commande. */
@@ -108,25 +108,27 @@ serial_send ()
/* On ne fait pas le test, normalement ne doit pas arriver.
* assert (serial_send_buf_n < SERIAL_SEND_BUF_LEN); */
}
- else
+ else if (serial_unreliable_send_full)
{
- if (serial_unreliable_send_full)
+ /* Envoie le caractère non-fiable. */
+ c = serial_unreliable_send_buf[serial_unreliable_send_buf_n++];
+ /* Si fin de tampon, on le libère. */
+ if (c == EOB)
{
- /* Envoie le caractère non-fiable. */
- c = serial_unreliable_send_buf[serial_unreliable_send_buf_n++];
- /* Si fin de tampon, on le libère. */
- if (c == EOB)
- {
- serial_unreliable_send_buf_n = 0;
- serial_unreliable_send_full = 0;
- disable_interrupts (INT_TBE);
- }
- else
- putc (c);
- /* On ne fait pas le test, normalement ne doit pas arriver.
- * assert (serial_unreliable_send_buf_n <
- * SERIAL_UNRELIABLE_SEND_BUF_LEN); */
+ serial_unreliable_send_buf_n = 0;
+ serial_unreliable_send_full = 0;
+ disable_interrupts (INT_TBE);
}
+ else
+ putc (c);
+ /* On ne fait pas le test, normalement ne doit pas arriver.
+ * assert (serial_unreliable_send_buf_n <
+ * SERIAL_UNRELIABLE_SEND_BUF_LEN); */
+ }
+ else
+ {
+ /* Ne devrait pas arriver, mais soyons prudent. */
+ disable_interrupts (INT_TBE);
}
}
@@ -169,6 +171,23 @@ serial_send_rezet (void)
{
serial_send_char ('!');
serial_send_char ('z');
+ switch (restart_cause ())
+ {
+ case WDT_TIMEOUT:
+ serial_send_char ('w');
+ break;
+ case MCLR_FROM_SLEEP:
+ serial_send_char ('m');
+ break;
+ case BROWNOUT_RESTART:
+ serial_send_char ('b');
+ break;
+ case NORMAL_POWER_UP:
+ break;
+ default:
+ serial_send_char ('?');
+ break;
+ }
serial_send_char (CRLF);
}
@@ -194,7 +213,8 @@ serial_send_ok (void)
/* Envoie un rapport d'un moteur. */
void
-serial_send_motor_stat (char side, unsigned int vacc, unsigned long &e, unsigned long &pwm)
+serial_send_motor_stat (char side, unsigned int vacc, unsigned long &e,
+ unsigned long &pwm)
{
serial_unreliable_send_char ('!');
serial_unreliable_send_char ('M');
@@ -240,6 +260,7 @@ serial_send_char (char c)
/* Si fin de ligne, on envois. */
if (c == CRLF)
{
+ disable_interrupts (INT_TBE);
serial_send_full = 1;
serial_send_buf_n = 0;
enable_interrupts (INT_TBE);
@@ -258,6 +279,7 @@ serial_unreliable_send_char (char c)
/* Si fin de buffer, on envois. */
if (c == EOB)
{
+ disable_interrupts (INT_TBE);
serial_unreliable_send_full = 1;
serial_unreliable_send_buf_n = 0;
enable_interrupts (INT_TBE);