From: Nicolas D. <Ba...@us...> - 2011-03-29 21:50:15
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "krobot". The branch, master has been updated via 65a3c60237406303ecfc2efd5ae63e399d10d09b (commit) via 7aa55dd0d34b44ce45913414c760604d434ae503 (commit) via 4fa085f2f3a9ec372adaf1879e9eaac4c4e62c71 (commit) from f899b5a05ceb8f1181ca877a1cdf16a9dae90a6a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 65a3c60237406303ecfc2efd5ae63e399d10d09b Author: Nicolas Dandrimont <Nic...@cr...> Date: Tue Mar 29 23:47:50 2011 +0200 [USB_CAN/Firmware] Rationnalize serial writes commit 7aa55dd0d34b44ce45913414c760604d434ae503 Author: Nicolas Dandrimont <Nic...@cr...> Date: Tue Mar 29 23:47:20 2011 +0200 [USB_CAN/Firmware] Add a semaphore to avoid serial tx interference commit 4fa085f2f3a9ec372adaf1879e9eaac4c4e62c71 Author: Nicolas Dandrimont <Nic...@cr...> Date: Tue Mar 29 23:45:02 2011 +0200 [USB_CAN/Firmware] Use LED1 for tx, LED2 for rx, LED3 for power ----------------------------------------------------------------------- Changes: diff --git a/elec/boards/USB_CAN/Firmware/usb_can/main.c b/elec/boards/USB_CAN/Firmware/usb_can/main.c index 278d29d..40de93d 100644 --- a/elec/boards/USB_CAN/Firmware/usb_can/main.c +++ b/elec/boards/USB_CAN/Firmware/usb_can/main.c @@ -116,21 +116,27 @@ static void NORETURN can_receive_process(void) { can_rx_frame frame; int retval; bool received = false; + bool i = false; for (;;) { received = can_receive(usbcan.can, &frame, ms_to_ticks(100)); if (received) { + i = !i; retval = usb_can_emit(&usbcan, &frame); + if (i) + LED2_ON(); + else + LED2_OFF(); } } } static void NORETURN blinky_process(void) { for (;;) { - LED2_ON(); + LED3_ON(); timer_delay(500); - LED2_OFF(); + LED3_OFF(); timer_delay(500); } } diff --git a/elec/boards/USB_CAN/Firmware/usb_can/usb_can.c b/elec/boards/USB_CAN/Firmware/usb_can/usb_can.c index 07564ec..fc43170 100644 --- a/elec/boards/USB_CAN/Firmware/usb_can/usb_can.c +++ b/elec/boards/USB_CAN/Firmware/usb_can/usb_can.c @@ -58,6 +58,7 @@ void usb_can_init(usb_can *usbcan, can_driver *can, struct Serial *ser) { usbcan->is_open = false; usbcan->timestamped = false; usbcan->get_timestamp = get_timestamp; + sem_init(&usbcan->sem_receive); } @@ -100,14 +101,16 @@ int usb_can_execute_command(usb_can *usbcan, char *command) { frame.data32[0] = 0; frame.data32[1] = 0; + sem_obtain(&usbcan->sem_receive); + switch (command[0]) { case 'V': /* Version number */ - kfile_write(&usbcan->ser->fd, "V0402\r", 6); + kfile_write(&usbcan->ser->fd, "V0402\r", strlen("V0402\r")); break; case 'N': /* Serial number */ - kfile_write(&usbcan->ser->fd, "NKROB\r", 6); + kfile_write(&usbcan->ser->fd, "NKROB\r", strlen("NKROB\r")); break; case 'O': /* Open CAN Channel */ @@ -168,10 +171,11 @@ int usb_can_execute_command(usb_can *usbcan, char *command) { if (send) { ret = can_transmit(usbcan->can, &frame, ms_to_ticks(10)); if (ret) - kfile_write(&usbcan->ser->fd, frame.ide ? "\r" : "\r", 1); + kfile_write(&usbcan->ser->fd, "\r", 1); else kfile_write(&usbcan->ser->fd, "\a", 1); } + sem_release(&usbcan->sem_receive); return 0; } @@ -182,6 +186,10 @@ int usb_can_emit(usb_can *usbcan, can_rx_frame *frame) { int i = 0, j = 0; uint16_t timestamp; + // Do not interfere with the send ACK + if (!sem_attempt(&usbcan->sem_receive)) + return 0; + buffer[0] = frame->rtr ? 'r' : 't'; // Extended identifier : uppercase identifier @@ -213,5 +221,6 @@ int usb_can_emit(usb_can *usbcan, can_rx_frame *frame) { kfile_write(&usbcan->ser->fd, buffer, i); + sem_release(&usbcan->sem_receive); return 0; } diff --git a/elec/boards/USB_CAN/Firmware/usb_can/usb_can.h b/elec/boards/USB_CAN/Firmware/usb_can/usb_can.h index 800e4a5..d24c859 100644 --- a/elec/boards/USB_CAN/Firmware/usb_can/usb_can.h +++ b/elec/boards/USB_CAN/Firmware/usb_can/usb_can.h @@ -25,7 +25,9 @@ #define USB_CAN_H #include <stdio.h> +#include <string.h> +#include <kern/sem.h> #include <drv/can.h> #include <drv/ser.h> #include <drv/timer.h> @@ -39,6 +41,7 @@ typedef struct _usb_can { bool is_open; // Channel open? bool timestamped; // Emit timestamps? usb_can_timestamp *get_timestamp; // Get Timestamp function + struct Semaphore sem_receive; // Avoid receiving when tx_ing } usb_can; uint16_t get_timestamp(void); hooks/post-receive -- krobot |