2 * Copyright Droids Corporation, Microb Technology, Eirbot (2005)
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Revision : $Id: robot_system.h,v 1.5.4.3 2008-04-06 17:33:57 zer0 Exp $
23 * The goal of this module is to provide an interface to motor and
24 * encoders of the robot. This module provide a function that returns
25 * the value of virtual encoders containing distance and angle. It
26 * also allow the user to command virtual angle and distance PWMs.
30 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_USE_F64
33 #include "angle_distance.h"
35 #ifndef _ROBOT_SYSTEM_H_
36 #define _ROBOT_SYSTEM_H_
40 #define RS_IGNORE_EXT_GAIN 2
41 #define RS_IGNORE_MOT_GAIN 4
48 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
49 struct rs_polar pmot_prev;
50 struct rs_wheels wmot_prev;
55 int32_t (*left_mot_encoder)(void *);
56 void* left_mot_encoder_param;
59 int32_t (*right_mot_encoder)(void *);
60 void* right_mot_encoder_param;
64 struct rs_polar virtual_pwm;
65 struct rs_polar virtual_encoders;
67 struct rs_polar pext_prev;
68 struct rs_wheels wext_prev;
70 /* External encoders */
71 int32_t (*left_ext_encoder)(void *);
72 void* left_ext_encoder_param;
73 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_USE_F64
79 int32_t (*right_ext_encoder)(void *);
80 void* right_ext_encoder_param;
81 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_USE_F64
84 double right_ext_gain;
88 void (*left_pwm)(void *, int32_t);
90 void (*right_pwm)(void *, int32_t);
91 void *right_pwm_param;
94 /** Set the structure to 0 */
95 void rs_init( struct robot_system * );
99 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
100 /** define ratio between mot and ext track. (track_mot / track_ext) */
101 void rs_set_ratio(struct robot_system * rs, double ratio);
104 /** define left PWM function and param */
105 void rs_set_left_pwm(struct robot_system * rs, void (*left_pwm)(void *, int32_t), void *left_pwm_param);
107 /** define right PWM function and param */
108 void rs_set_right_pwm(struct robot_system * rs, void (*right_pwm)(void *, int32_t), void *right_pwm_param);
110 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
111 /** define left motor encoder function and param */
112 void rs_set_left_mot_encoder(struct robot_system * rs, int32_t (*left_mot_encoder)(void *),
113 void *left_mot_encoder_param, double gain);
115 /** define right motor encoder function and param */
116 void rs_set_right_mot_encoder(struct robot_system * rs, int32_t (*right_mot_encoder)(void *),
117 void *right_mot_encoder_param, double gain);
120 /** define left external encoder function and param */
121 void rs_set_left_ext_encoder(struct robot_system * rs, int32_t (*left_ext_encoder)(void *),
122 void *left_ext_encoder_param, double gain);
124 /** define right external encoder function and param */
125 void rs_set_right_ext_encoder(struct robot_system * rs, int32_t (*right_ext_encoder)(void *),
126 void *right_ext_encoder_param, double gain);
128 /**** Virtual encoders and PWM */
131 * set the real pwms according to the specified angle (it also
132 * depends on the last distance command sent)
134 void rs_set_angle(void * rs, int32_t angle);
137 * set the real pwms according to the specified distance (it also
138 * depends on the last angle command sent)
140 void rs_set_distance(void * rs, int32_t distance);
143 * get the virtual angle according to real encoders value.
145 int32_t rs_get_angle(void * rs);
148 * get the virtual distance according to real encoders value.
150 int32_t rs_get_distance(void * rs);
153 * get the angle according to ext encoders value.
155 int32_t rs_get_ext_angle(void * rs);
158 * get the distance according to ext encoders value.
160 int32_t rs_get_ext_distance(void * rs);
162 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
164 * get the angle according to mot encoders value.
166 int32_t rs_get_mot_angle(void * rs);
169 * get the distance according to mot encoders value.
171 int32_t rs_get_mot_distance(void * rs);
174 /* same for left/right */
175 int32_t rs_get_ext_left(void * rs);
176 int32_t rs_get_ext_right(void * rs);
177 #ifdef CONFIG_MODULE_ROBOT_SYSTEM_MOT_AND_EXT
178 int32_t rs_get_mot_left(void * rs);
179 int32_t rs_get_mot_right(void * rs);
184 * Read the encoders, and update internal virtual counters. Call this
185 * function is needed before reading the virtual encoders. The program
186 * will decide if it the external encoders or the motor encoders are
187 * taken in account (depending on flags, but not yet)
189 void rs_update(void * rs);
191 void rs_set_flags(struct robot_system * rs, uint8_t flags);
194 #endif /* #ifndef _ROBOT_SYSTEM */