From: Xavier L. <Ba...@us...> - 2012-05-15 20:14:03
|
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 ff93134afe82b8e1bc1ea72a8d8af8a2b6c756e6 (commit) via 7f4506759a33ee70857837cccfc047a1ef6f03f5 (commit) from a66675c38188c8ce812898d3d4865d53294c7be6 (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 ff93134afe82b8e1bc1ea72a8d8af8a2b6c756e6 Author: Xavier Lagorce <Xav...@cr...> Date: Tue May 15 22:13:33 2012 +0200 [control2011] More CAN packets (bugged ?...) commit 7f4506759a33ee70857837cccfc047a1ef6f03f5 Author: Xavier Lagorce <Xav...@cr...> Date: Tue May 15 18:39:56 2012 +0200 [Controller_Motor_STM32] Added a mechanism to send CAN frames indicating software errors ----------------------------------------------------------------------- Changes: diff --git a/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_messages.h b/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_messages.h index aa5c8b1..94ebea0 100644 --- a/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_messages.h +++ b/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_messages.h @@ -23,6 +23,7 @@ #define CAN_MSG_STATUS 103 // status_can_msg_t #define CAN_MSG_ODOMETRY 104 // odometry_can_msg_t #define CAN_MSG_GHOST 105 // ghost_can_msg_t +#define CAN_MSG_CONTROL_ERROR 106 // error_can_msg_t // Received commands #define CAN_MSG_MOVE 201 // move_can_msg_t @@ -58,6 +59,12 @@ typedef struct { uint8_t is_moving; } status_msg_t; +// Error packet +typedef struct { + uint8_t err1; + uint8_t err2; +} error_msg_t; + // Robot state typedef struct { int16_t x __attribute__((__packed__)); // X position in mm (fixed point representation...) @@ -142,6 +149,11 @@ typedef union { } status_can_msg_t; typedef union { + error_msg_t data; + uint32_t data32[2]; +} error_can_msg_t; + +typedef union { odometry_msg_t data; uint32_t data32[2]; } odometry_can_msg_t; diff --git a/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.c b/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.c index bae2706..5ed50a6 100644 --- a/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.c +++ b/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.c @@ -20,6 +20,7 @@ PROC_DEFINE_STACK(stack_can_send, KERN_MINSTACKSIZE * 8); PROC_DEFINE_STACK(stack_can_receive, KERN_MINSTACKSIZE * 8); // globals volatile uint8_t mode; +volatile uint8_t err1, err2, send_err; // Process for communication static void NORETURN canMonitor_process(void); @@ -45,12 +46,19 @@ void canMonitorInit(void) { proc_new(canMonitorListen_process, NULL, sizeof(stack_can_receive), stack_can_receive); } +void can_send_error(uint8_t e1, uint8_t e2) { + err1 |= e1; + err2 |= e2; + send_err = 1; +} + static void NORETURN canMonitor_process(void) { //encoder_can_msg_t msg_enc; motor_can_msg_t msg_mot; odometry_can_msg_t msg_odo; ghost_can_msg_t msg_ghost; status_can_msg_t status_msg; + error_can_msg_t error_msg; can_tx_frame txm; robot_state_t odometry; float u; @@ -136,6 +144,17 @@ static void NORETURN canMonitor_process(void) { txm.eid = CAN_MSG_STATUS; can_transmit(CAND1, &txm, ms_to_ticks(10)); + // Send error packet if requested + if (send_err) { + error_msg.data.err1 = err1; err1 = 0; + error_msg.data.err2 = err2; err2 = 0; + send_err = 0; + txm.data32[0] = error_msg.data32[0]; + txm.data32[1] = error_msg.data32[1]; + txm.eid = CAN_MSG_CONTROL_ERROR; + can_transmit(CAND1, &txm, ms_to_ticks(10)); + } + // Wait for the next transmission timer timer_waitEvent(&timer_can); } diff --git a/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.h b/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.h index da6ad7f..c157f58 100644 --- a/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.h +++ b/elec/boards/Controller_Motor_STM32/Firmwares/Propulsion_Drive/controller_motor_stm32/can_monitor.h @@ -21,5 +21,6 @@ #include "can_messages.h" void canMonitorInit(void); +void can_send_error(uint8_t err1, uint8_t err2); #endif /* __CAN_MONITOR_H */ diff --git a/info/control2011/src/lib/krobot_message.ml b/info/control2011/src/lib/krobot_message.ml index 4addf15..285dfdc 100644 --- a/info/control2011/src/lib/krobot_message.ml +++ b/info/control2011/src/lib/krobot_message.ml @@ -36,10 +36,12 @@ type t = | Encoder_position_direction_3_4 of int * direction * int * direction | Encoder_position_speed_3 of float * float | Encoder_position_speed_4 of float * float + | Control_error of int * int | Motor_status of bool * bool * bool * bool | Motor_move of float * float * float | Motor_turn of float * float * float | Motor_bezier of float * float * float * float * float * float + | Motor_command of int * int | Motor_stop of float * float | Motor_bezier_limits of float * float * float | Odometry of float * float * float @@ -144,6 +146,10 @@ let to_string = function sprintf "Motor_status(%B, %B, %B, %B)" m1 m2 m3 m4 + | Control_error(e1, e2) -> + sprintf + "Control_error(%d, %d)" + e1 e2 | Motor_move(dist, speed, acc) -> sprintf "Motor_move(%f, %f, %f)" @@ -164,6 +170,10 @@ let to_string = function sprintf "Motor_bezier_limits(%f, %f, %f)" v_max a_tan_max a_rad_max + | Motor_command(motor_id, speed) -> + sprintf + "Motor_command(%d, %d)" + motor_id speed | Odometry(x, y, theta) -> sprintf "Odometry(%f, %f, %f)" @@ -256,6 +266,16 @@ let encode = function ~remote:false ~format:F29bits ~data + | Control_error(e1, e2) -> + let data = String.create 2 in + put_uint8 data 0 e1; + put_uint8 data 1 e2; + frame + ~identifier:106 + ~kind:Data + ~remote:false + ~format:F29bits + ~data | Odometry(x, y, theta) -> let data = String.create 6 in put_sint16 data 0 (truncate (x *. 1000.)); @@ -315,6 +335,16 @@ let encode = function ~remote:false ~format:F29bits ~data:(encode_bezier (x, y, d1, d2, theta, v)) + | Motor_command(motor_id, speed) -> + let data = String.create 5 in + put_uint8 data 0 motor_id; + put_sint32 data 1 speed; + frame + ~identifier:208 + ~kind:Data + ~remote:false + ~format:F29bits + ~data | Set_odometry(x, y, theta) -> let data = String.create 6 in put_sint16 data 0 (truncate (x *. 1000.)); @@ -595,6 +625,10 @@ let decode frame = float (get_sint16 frame.data 4) /. 10000., get_uint8 frame.data 6, get_uint8 frame.data 7 <> 0) + | 106 -> + Control_error + (get_uint8 frame.data 0, + get_uint8 frame.data 1) | 201 -> Motor_move (float (get_sint32 frame.data 0) /. 1000., @@ -630,6 +664,10 @@ let decode frame = (float (get_uint16 frame.data 0) /. 1000., float (get_uint16 frame.data 2) /. 1000., float (get_uint16 frame.data 4) /. 1000.) + | 208 -> + Motor_command + (get_uint8 frame.data 0, + get_sint32 frame.data 1) | 231 -> Elevator(get_float32 frame.data 0, get_float32 frame.data 4) @@ -641,7 +679,7 @@ let decode frame = | 302 -> Beacon_lowlevel_position (float (get_uint16 frame.data 0), - float (get_uint16 frame.data 2) /. 10000., + float (get_uint16 frame.data 2) (*/. 10000*), get_uint32 frame.data 4) | 311 -> Switch1_status diff --git a/info/control2011/src/lib/krobot_message.mli b/info/control2011/src/lib/krobot_message.mli index 752e937..4d79d4d 100644 --- a/info/control2011/src/lib/krobot_message.mli +++ b/info/control2011/src/lib/krobot_message.mli @@ -55,6 +55,8 @@ type t = (** The position and speed of encoder 3. *) | Encoder_position_speed_4 of float * float (** The position and speed of encoder 4. *) + | Control_error of int * int + (** Errors generated by a motor controller card. *) | Motor_status of bool * bool * bool * bool (** Status of the 4 motors. *) | Motor_move of float * float * float @@ -73,6 +75,8 @@ type t = *) | Motor_bezier of float * float * float * float * float * float (** [Motor_bezier(x_end, y_end, d1, d2, theta_end, v_end)] *) + | Motor_command of int * int + (** [Motor_command(motor_id, PWM_value)] *) | Motor_stop of float * float (** [Motor_stop(lin_acc, rot_acc)] command to stop following the current Bezier Spline and the queued ones. hooks/post-receive -- krobot |