Commit from zer0 (2009-03-01 15:43 CET)
================

Add some commands (sensors, cs).
Set the gains + coefs approximatively

  aversive_projects  microb2009/mainboard/strat_base.c          1.2
  aversive_projects  microb2009/mainboard/sensor.h              1.3
  aversive_projects  microb2009/mainboard/sensor.c              1.3
  aversive_projects  microb2009/mainboard/main.h                1.3
  aversive_projects  microb2009/mainboard/main.c                1.3
  aversive_projects  microb2009/mainboard/cs.h                  1.2
  aversive_projects  microb2009/mainboard/cs.c                  1.2
  aversive_projects  microb2009/mainboard/commands_mainboard.c  1.3
  aversive_projects  microb2009/mainboard/commands_gen.c        1.3
  aversive_projects  microb2009/mainboard/commands_cs.c         1.3
  aversive_projects  microb2009/mainboard/commands.c            1.3


===================================================
aversive_projects/microb2009/mainboard/strat_base.c  (1.1 -> 1.2)
===================================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: strat_base.c,v 1.1 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: strat_base.c,v 1.2 2009-03-01 14:43:16 zer0 Exp $
  *
  */
 
@@ -143,11 +143,11 @@
        strat_preinit();
 
        /* if start sw not plugged */
-       if (sensor_start_switch()) {
+       if (sensor_get(S_START_SWITCH)) {
                printf_P(PSTR("No start switch, press a key or plug it\r\n"));
 
                /* while start sw not plugged */
-               while (sensor_start_switch()) {
+               while (sensor_get(S_START_SWITCH)) {
                        if (cmdline_keypressed()) {
                                for (i=3; i>0; i--) {
                                        printf_P(PSTR("%d\r\n"), i);
@@ -159,10 +159,10 @@
        }
        
        /* if start sw plugged */
-       if (!sensor_start_switch()) {
+       if (!sensor_get(S_START_SWITCH)) {
                printf_P(PSTR("Ready, unplug start switch to start\r\n"));
                /* while start sw plugged */
-               while (!sensor_start_switch());
+               while (!sensor_get(S_START_SWITCH));
        }
 
        strat_init();


===============================================
aversive_projects/microb2009/mainboard/sensor.h  (1.2 -> 1.3)
===============================================

@@ -16,14 +16,43 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: sensor.h,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: sensor.h,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  */
 
-#define SENSOR_ADC_COUNT 6
+/* synchronize with sensor.c */
+#define ADC_CSENSE1   0
+#define ADC_CSENSE2   1
+#define ADC_CSENSE3   2
+#define ADC_CSENSE4   3
+#define ADC_BATTERY1  4
+#define ADC_BATTERY2  5
+#define ADC_MAX       6
+
+/* synchronize with sensor.c */
+#define S_START_SWITCH 0
+#define S_CAP2         1
+#define S_CAP3         2
+#define S_CAP4         3
+#define S_CAP5         4
+#define S_CAP6         5
+#define S_CAP7         6
+#define S_CAP8         7
+#define S_RESERVED1    8
+#define S_RESERVED2    9
+#define S_RESERVED3   10
+#define S_RESERVED4   11
+#define S_RESERVED5   12
+#define S_RESERVED6   13
+#define S_RESERVED7   14
+#define S_RESERVED8   15
+#define SENSOR_MAX    16
 
 void sensor_init(void);
-int16_t sensor_read_adc(uint8_t i);
 
-/* XXX */
-#define sensor_start_switch() 0
+/* get filtered values for adc */
+int16_t sensor_get_adc(uint8_t i);
+
+/* get filtered values of boolean sensors */
+uint16_t sensor_get_all(void);
+uint8_t sensor_get(uint8_t i);


===============================================
aversive_projects/microb2009/mainboard/sensor.c  (1.2 -> 1.3)
===============================================

@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: sensor.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: sensor.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  */
 
@@ -45,6 +45,8 @@
 #include "main.h"
 #include "sensor.h"
 
+/************ ADC */
+
 struct adc_infos {
        uint16_t config;
        int16_t value;
@@ -76,41 +78,31 @@
 
 #define ADC_CONF(x) ( ADC_REF_AVCC | ADC_MODE_INT | MUX_ADC##x )
 
-/* define which ADC to poll, update SENSOR_ADC_COUNT in sensor.h */
-static struct adc_infos adc_infos[SENSOR_ADC_COUNT] = { 
-#define ADC_CSENSE1   0
-       { .config = ADC_CONF(0), .filter = rii_medium },
-#define ADC_CSENSE2   1
-       { .config = ADC_CONF(1), .filter = rii_medium },
-#define ADC_CSENSE3   2
-       { .config = ADC_CONF(2), .filter = rii_medium },
-#define ADC_CSENSE4   3
-       { .config = ADC_CONF(3), .filter = rii_medium },
-#define ADC_BATTERY   4
-       { .config = ADC_CONF(8), .filter = rii_strong },
-#define ADC_CAP6      5
-       { .config = ADC_CONF(12) },
+/* define which ADC to poll, see in sensor.h */
+static struct adc_infos adc_infos[ADC_MAX] = { 
+       [ADC_CSENSE1] = { .config = ADC_CONF(0), .filter = rii_medium },
+       [ADC_CSENSE2] = { .config = ADC_CONF(1), .filter = rii_medium },
+       [ADC_CSENSE3] = { .config = ADC_CONF(2), .filter = rii_medium },
+       [ADC_CSENSE4] = { .config = ADC_CONF(3), .filter = rii_medium },
+       [ADC_BATTERY1] = { .config = ADC_CONF(8), .filter = rii_strong },
+       [ADC_BATTERY2] = { .config = ADC_CONF(9), .filter = rii_strong },
+
+       /* add adc on "cap" pins if needed */
+/*     [ADC_CAP1] = { .config = ADC_CONF(10) }, */
+/*     [ADC_CAP2] = { .config = ADC_CONF(11) }, */
+/*     [ADC_CAP3] = { .config = ADC_CONF(12) }, */
+/*     [ADC_CAP4] = { .config = ADC_CONF(13) }, */
 };
 
 static void adc_event(int16_t result);
 
-/* called every 10 ms */
+/* called every 10 ms, see init below */
 static void do_adc(void *dummy) 
 {
        /* launch first conversion */
        adc_launch(adc_infos[0].config);
 }
 
-void sensor_init(void)
-{
-       adc_init();
-       adc_register_event(adc_event);
-       /* CS EVENT */
-       scheduler_add_periodical_event_priority(do_adc, NULL, 
-                                               10000L / SCHEDULER_UNIT, 
-                                               ADC_PRIO);
-}
-
 static void adc_event(int16_t result)
 {
        static uint8_t i = 0;
@@ -123,12 +115,13 @@
                adc_infos[i].value = result;
 
        i ++;
-       i %= SENSOR_ADC_COUNT;
-       if (i != 0)
+       if (i >= ADC_MAX)
+               i = 0;
+       else
                adc_launch(adc_infos[i].config);
 }
 
-int16_t sensor_read_adc(uint8_t i)
+int16_t sensor_get_adc(uint8_t i)
 {
        int16_t tmp;
        uint8_t flags;
@@ -138,3 +131,123 @@
        IRQ_UNLOCK(flags);
        return tmp;
 }
+
+/************ boolean sensors */
+
+
+struct sensor_filter {
+       uint8_t filter;
+       uint8_t prev;
+       uint8_t thres_off;
+       uint8_t thres_on;
+       uint8_t cpt;
+};
+
+static struct sensor_filter sensor_filter[SENSOR_MAX] = {
+       [S_START_SWITCH] = { 1, 0, 0, 1, 0 }, /* 0 */
+       [S_CAP2] = { 1, 0, 0, 1, 0 }, /* 1 */
+       [S_CAP3] = { 1, 0, 0, 1, 0 }, /* 2 */
+       [S_CAP4] = { 1, 0, 0, 1, 0 }, /* 3 */
+       [S_CAP5] = { 1, 0, 0, 1, 0 }, /* 4 */
+       [S_CAP6] = { 1, 0, 0, 1, 0 }, /* 5 */
+       [S_CAP7] = { 1, 0, 0, 1, 0 }, /* 6 */
+       [S_CAP8] = { 1, 0, 0, 1, 0 }, /* 7 */
+       [S_RESERVED1] = { 10, 0, 3, 7, 0 }, /* 8 */
+       [S_RESERVED2] = { 10, 0, 3, 7, 0 }, /* 9 */
+       [S_RESERVED3] = { 1, 0, 0, 1, 0 }, /* 10 */
+       [S_RESERVED4] = { 1, 0, 0, 1, 0 }, /* 11 */
+       [S_RESERVED5] = { 1, 0, 0, 1, 0 }, /* 12 */
+       [S_RESERVED6] = { 1, 0, 0, 1, 0 }, /* 13 */
+       [S_RESERVED7] = { 1, 0, 0, 1, 0 }, /* 14 */
+       [S_RESERVED8] = { 1, 0, 0, 1, 0 }, /* 15 */
+};
+
+/* value of filtered sensors */
+static uint16_t sensor_filtered = 0;
+
+/* sensor mapping : 
+ * 0-3:  PORTK 2->5 (cap1 -> cap4) (adc10 -> adc13)
+ * 4-5:  PORTL 0->1 (cap5 -> cap6)
+ * 6-7:  PORTE 3->4 (cap7 -> cap8)
+ * 8-15: reserved
+ */
+
+uint16_t sensor_get_all(void)
+{
+       uint16_t tmp;
+       uint8_t flags;
+       IRQ_LOCK(flags);
+       tmp = sensor_filtered;
+       IRQ_UNLOCK(flags);
+       return tmp;
+}
+
+uint8_t sensor_get(uint8_t i)
+{
+       uint16_t tmp = sensor_get_all();
+       return (tmp & _BV(i));
+}
+
+/* get the physical value of pins */
+static uint16_t sensor_read(void)
+{
+       uint16_t tmp = 0;
+       tmp |= (uint16_t)((PINK & (_BV(2)|_BV(3)|_BV(4)|_BV(5))) >> 2) << 0;
+       tmp |= (uint16_t)((PINL & (_BV(0)|_BV(1))) >> 0) << 4;
+       tmp |= (uint16_t)((PINE & (_BV(3)|_BV(4))) >> 3) << 6;
+       /* add reserved sensors here */
+       return tmp;
+}
+
+/* called every 10 ms, see init below */
+static void do_boolean_sensors(void *dummy)
+{
+       uint8_t i;
+       uint8_t flags;
+       uint16_t sensor = sensor_read();
+       uint16_t tmp = 0;
+
+       for (i=0; i<SENSOR_MAX; i++) {
+               if ((1 << i) & sensor) {
+                       if (sensor_filter[i].cpt < sensor_filter[i].filter)
+                               sensor_filter[i].cpt++;
+                       if (sensor_filter[i].cpt >= sensor_filter[i].thres_on)
+                               sensor_filter[i].prev = 1;
+               }
+               else {
+                       if (sensor_filter[i].cpt > 0)
+                               sensor_filter[i].cpt--;
+                       if (sensor_filter[i].cpt <= sensor_filter[i].thres_off)
+                               sensor_filter[i].prev = 0;
+               }
+               
+               if (sensor_filter[i].prev) {
+                       tmp |= (1UL << i);
+               }
+       }
+       IRQ_LOCK(flags);
+       sensor_filtered = tmp;
+       IRQ_UNLOCK(flags);
+}
+
+
+
+/************ global sensor init */
+
+/* called every 10 ms, see init below */
+static void do_sensors(void *dummy)
+{
+       do_adc(NULL);
+       do_boolean_sensors(NULL);
+}
+
+void sensor_init(void)
+{
+       adc_init();
+       adc_register_event(adc_event);
+       /* CS EVENT */
+       scheduler_add_periodical_event_priority(do_sensors, NULL, 
+                                               10000L / SCHEDULER_UNIT, 
+                                               ADC_PRIO);
+}
+


=============================================
aversive_projects/microb2009/mainboard/main.h  (1.2 -> 1.3)
=============================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: main.h,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: main.h,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  */
 
@@ -29,11 +29,11 @@
 #define BRAKE_ON()      do { PORTJ |= 0xF0; } while(0)
 #define BRAKE_OFF()     do { PORTJ &= 0x0F; } while(0)
 
-/* it is 90 don't forget it :) */
+/* only 90 seconds, don't forget it :) */
 #define MATCH_TIME 90
 
 /* decrease track to decrease angle */
-#define EXT_TRACK_CM 30.0
+#define EXT_TRACK_CM 30.125
 #define VIRTUAL_TRACK_CM EXT_TRACK_CM 
 
 /* it is a 2048 imps -> 8192 because we see 1/4 period
@@ -46,18 +46,12 @@
 #define IMP_COEF 10.
 #define DIST_IMP_CM (((IMP_ENCODERS*4)/WHEEL_PERIM_CM)*IMP_COEF)
 
-/* XXX */
 #define LEFT_ENCODER        ((void *)1)
 #define RIGHT_ENCODER       ((void *)2)
 
-/* XXX */
 #define LEFT_PWM            ((void *)&gen.pwm3_1B)
 #define RIGHT_PWM           ((void *)&gen.pwm4_1C)
 
-/* XXX */
-#define MAINBOARD_MOT_PWM     (&gen.pwm4_1C)
-#define MAINBOARD_ENC         ((void *)3)
-
 /** ERROR NUMS */
 #define E_USER_STRAT           194
 #define E_USER_I2C_PROTO       195
@@ -120,8 +114,6 @@
        /* control systems */
         struct cs_block angle;
         struct cs_block distance;
-        struct cs_block example1;
-        struct cs_block example2;
 
        /* x,y positionning */
        struct robot_system rs;


=============================================
aversive_projects/microb2009/mainboard/main.c  (1.2 -> 1.3)
=============================================

@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: main.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: main.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  */
 
@@ -65,14 +65,6 @@
  * BOOTRST : 0 (reset on bootloader)
  */
 
-/* 
- * TODO:
- *   circuit VN: il faut le tester et comprendre comment ca marche
- *   max232: y a t il eu des modifs ?
- *   diode zener sur le Uv : 5.6K et 1K
- *   condos sur les LMD
- */
-
 struct genboard gen;
 struct mainboard mainboard;
 
@@ -80,12 +72,16 @@
 
 void bootloader(void)
 {
+       /* XXX update bootloader to enable the brake */
+       /* XXX don't wait at boot */
+       /* XXX exit when waiting for addr */
 #define BOOTLOADER_ADDR 0x3f000
        if (pgm_read_byte_far(BOOTLOADER_ADDR) == 0xff) {
                printf_P(PSTR("Bootloader is not present\r\n"));
                return;
        }
        cli();
+       BRAKE_ON();
        /* ... very specific :( */
        TIMSK0 = 0;
        TIMSK1 = 0;
@@ -148,7 +144,7 @@
        memset(&gen, 0, sizeof(gen));
        memset(&mainboard, 0, sizeof(mainboard));
        mainboard.flags = DO_ENCODERS | DO_CS | DO_RS |
-               DO_POS | DO_POWER; // DO_BD
+               DO_POS; // | DO_POWER; // DO_BD
        
        /* UART */
        uart_init();
@@ -227,6 +223,7 @@
 
        sei();
 
+       printf_P(PSTR("\r\n"));
        printf_P(PSTR("Dass das Gluck deinen Haus setzt.\r\n"));
        cmdline_interact();
 


===========================================
aversive_projects/microb2009/mainboard/cs.h  (1.1 -> 1.2)
===========================================

@@ -16,8 +16,10 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: cs.h,v 1.1 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: cs.h,v 1.2 2009-03-01 14:43:16 zer0 Exp $
  *
  */
 
 void microb_cs_init(void);
+void dump_cs(const char *name, struct cs *cs);
+void dump_pid(const char *name, struct pid_filter *pid);


===========================================
aversive_projects/microb2009/mainboard/cs.c  (1.1 -> 1.2)
===========================================

@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: cs.c,v 1.1 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: cs.c,v 1.2 2009-03-01 14:43:16 zer0 Exp $
  *
  */
 
@@ -78,10 +78,6 @@
                        cs_manage(&mainboard.angle.cs);
                if (mainboard.distance.on)
                        cs_manage(&mainboard.distance.cs);
-               if (mainboard.example1.on)
-                       cs_manage(&mainboard.example1.cs);
-               if (mainboard.example2.on)
-                       cs_manage(&mainboard.example2.cs);
        }
        if ((cpt & 1) && (mainboard.flags & DO_POS)) {
                position_manage(&mainboard.pos); /* about 1.5ms (worst case) */
@@ -118,6 +114,25 @@
        cpt++;
 }
 
+void dump_cs(const char *name, struct cs *cs)
+{
+       printf_P(PSTR("%s cons=% .5ld fcons=% .5ld err=% .5ld"
+                     "in=% .5ld out=% .5ld\r\n"), 
+                name, cs_get_consign(cs), cs_get_filtered_consign(cs),
+                cs_get_error(cs), cs_get_filtered_feedback(cs),
+                cs_get_out(cs));
+}
+
+void dump_pid(const char *name, struct pid_filter *pid)
+{
+       printf_P(PSTR("%s P=% .8ld I=% .8ld D=% .8ld out=% .8ld\r\n"),
+                name,
+                pid_get_value_in(pid) * pid_get_gain_P(pid),
+                pid_get_value_I(pid) * pid_get_gain_I(pid),
+                pid_get_value_D(pid) * pid_get_gain_D(pid),
+                pid_get_value_out(pid));
+}
+
 void microb_cs_init(void)
 {
        /* ROBOT_SYSTEM */
@@ -126,9 +141,9 @@
        rs_set_right_pwm(&mainboard.rs,  pwm_set_and_save, RIGHT_PWM);
        /* increase gain to decrease dist, increase left and it will turn more 
left */
        rs_set_left_ext_encoder(&mainboard.rs, encoders_spi_get_value, 
-                               LEFT_ENCODER, IMP_COEF);
+                               LEFT_ENCODER, IMP_COEF * 1.0435);
        rs_set_right_ext_encoder(&mainboard.rs, encoders_spi_get_value, 
-                                RIGHT_ENCODER, IMP_COEF);
+                                RIGHT_ENCODER, IMP_COEF * 1.0025);
        /* rs will use external encoders */
        rs_set_flags(&mainboard.rs, RS_USE_EXT);
 
@@ -143,16 +158,16 @@
        trajectory_set_cs(&mainboard.traj, &mainboard.distance.cs,
                          &mainboard.angle.cs);
        trajectory_set_robot_params(&mainboard.traj, &mainboard.rs, 
&mainboard.pos);
-       trajectory_set_speed(&mainboard.traj, 3000, 3000); /* d, a */
+       trajectory_set_speed(&mainboard.traj, 400, 400); /* d, a */
        /* distance window, angle window, angle start */
        trajectory_set_windows(&mainboard.traj, 35.0, 5.0, 30.0);
 
        /* ---- CS angle */
        /* PID */
        pid_init(&mainboard.angle.pid);
-       pid_set_gains(&mainboard.angle.pid, 20, 1, 800);
-       pid_set_maximums(&mainboard.angle.pid, 0, 30000, 0);
-       pid_set_out_shift(&mainboard.angle.pid, 6);
+       pid_set_gains(&mainboard.angle.pid, 500, 10, 7000);
+       pid_set_maximums(&mainboard.angle.pid, 0, 20000, 0);
+       pid_set_out_shift(&mainboard.angle.pid, 10);
        pid_set_derivate_filter(&mainboard.angle.pid, 4);
 
        /* QUADRAMP */
@@ -171,9 +186,9 @@
        /* ---- CS distance */
        /* PID */
        pid_init(&mainboard.distance.pid);
-       pid_set_gains(&mainboard.distance.pid, 20, 1, 300);
-       pid_set_maximums(&mainboard.distance.pid, 0, 30000, 0);
-       pid_set_out_shift(&mainboard.distance.pid, 6);
+       pid_set_gains(&mainboard.distance.pid, 500, 10, 7000);
+       pid_set_maximums(&mainboard.distance.pid, 0, 2000, 0);
+       pid_set_out_shift(&mainboard.distance.pid, 10);
        pid_set_derivate_filter(&mainboard.distance.pid, 6);
 
        /* QUADRAMP */
@@ -189,26 +204,9 @@
        cs_set_process_out(&mainboard.distance.cs, rs_get_distance, 
&mainboard.rs);
        cs_set_consign(&mainboard.distance.cs, 0);
 
-       /* ---- other CS */
-       /* PID */
-       pid_init(&mainboard.example1.pid);
-       pid_set_gains(&mainboard.example1.pid, 20, 0, 0);
-       pid_set_maximums(&mainboard.example1.pid, 0, 30000, 4095);
-       pid_set_out_shift(&mainboard.example1.pid, 6);
-       pid_set_derivate_filter(&mainboard.example1.pid, 6);
+       mainboard.angle.on = 1;
+       mainboard.distance.on = 1;
 
-       /* QUADRAMP */
-       quadramp_init(&mainboard.example1.qr);
-       quadramp_set_1st_order_vars(&mainboard.example1.qr, 400, 400); /* set 
speed */
-       quadramp_set_2nd_order_vars(&mainboard.example1.qr, 5, 5); /* set accel 
*/
-
-       /* CS */
-       cs_init(&mainboard.example1.cs);
-       cs_set_consign_filter(&mainboard.example1.cs, quadramp_do_filter, 
&mainboard.example1.qr);
-       cs_set_correct_filter(&mainboard.example1.cs, pid_do_filter, 
&mainboard.example1.pid);
-       cs_set_process_in(&mainboard.example1.cs, pwm_ng_set, 
MAINBOARD_MOT_PWM);
-       cs_set_process_out(&mainboard.example1.cs, encoders_spi_get_value, 
MAINBOARD_ENC);
-       cs_set_consign(&mainboard.example1.cs, 0);
 
        scheduler_add_periodical_event_priority(do_cs, NULL, 
                                                5000L / SCHEDULER_UNIT, 


===========================================================
aversive_projects/microb2009/mainboard/commands_mainboard.c  (1.2 -> 1.3)
===========================================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: commands_mainboard.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: commands_mainboard.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  *  Olivier MATZ <z...@droids-corp.org> 
  */
@@ -69,6 +69,32 @@
 
        struct cmd_event_result * res = parsed_result;
        
+       if (!strcmp_P(res->arg1, PSTR("all"))) {
+               bit = DO_ENCODERS | DO_CS | DO_RS | DO_POS |
+                       DO_BD | DO_TIMER | DO_POWER;
+               if (!strcmp_P(res->arg2, PSTR("on")))
+                       mainboard.flags |= bit;
+               else if (!strcmp_P(res->arg2, PSTR("off")))
+                       mainboard.flags &= bit;
+               else { /* show */
+                       printf_P(PSTR("encoders is %s\r\n"), 
+                                (DO_ENCODERS & mainboard.flags) ? "on":"off");
+                       printf_P(PSTR("cs is %s\r\n"), 
+                                (DO_CS & mainboard.flags) ? "on":"off");
+                       printf_P(PSTR("rs is %s\r\n"), 
+                                (DO_RS & mainboard.flags) ? "on":"off");
+                       printf_P(PSTR("pos is %s\r\n"), 
+                                (DO_POS & mainboard.flags) ? "on":"off");
+                       printf_P(PSTR("bd is %s\r\n"), 
+                                (DO_BD & mainboard.flags) ? "on":"off");
+                       printf_P(PSTR("timer is %s\r\n"), 
+                                (DO_TIMER & mainboard.flags) ? "on":"off");
+                       printf_P(PSTR("power is %s\r\n"), 
+                                (DO_POWER & mainboard.flags) ? "on":"off");
+               }
+               return;
+       }
+
        if (!strcmp_P(res->arg1, PSTR("encoders")))
                bit = DO_ENCODERS;
        else if (!strcmp_P(res->arg1, PSTR("cs"))) {
@@ -103,7 +129,7 @@
 
 prog_char str_event_arg0[] = "event";
 parse_pgm_token_string_t cmd_event_arg0 = TOKEN_STRING_INITIALIZER(struct 
cmd_event_result, arg0, str_event_arg0);
-prog_char str_event_arg1[] = "encoders#cs#rs#pos#bd#timer#power";
+prog_char str_event_arg1[] = "all#encoders#cs#rs#pos#bd#timer#power";
 parse_pgm_token_string_t cmd_event_arg1 = TOKEN_STRING_INITIALIZER(struct 
cmd_event_result, arg1, str_event_arg1);
 prog_char str_event_arg2[] = "on#off#show";
 parse_pgm_token_string_t cmd_event_arg2 = TOKEN_STRING_INITIALIZER(struct 
cmd_event_result, arg2, str_event_arg2);
@@ -793,104 +819,52 @@
        },
 };
 
+
 /**********************************************************/
-/* Sensor */
+/* Rs tests */
 
-/* this structure is filled when cmd_sensor is parsed successfully */
-struct cmd_sensor_result {
+/* this structure is filled when cmd_rs is parsed successfully */
+struct cmd_rs_result {
        fixed_string_t arg0;
        fixed_string_t arg1;
 };
 
-/* function called when cmd_sensor is parsed successfully */
-static void cmd_sensor_parsed(void *parsed_result, void *data)
+/* function called when cmd_rs is parsed successfully */
+static void cmd_rs_parsed(void *parsed_result, void *data)
 {
-#ifdef notyet
-       struct cmd_sensor_result *res = parsed_result;
-       uint8_t i;
-
-       if (!strcmp_P(res->arg1, PSTR("show"))) {
-               printf_P(PSTR("Sensors state:\r\n"
-                             "  %8.8lx\r\n"
-                             "  IR disp=%d\r\n"), mainboard.sensor, 
IR_DISP_SENSOR());
-       }
-       else if (!strcmp_P(res->arg1, PSTR("all_loop"))) { /* show_loop */
-               while(uart0_recv_nowait() == -1) {
-                       for (i=0 ; i<32; i++) {
-                               if (mainboard.sensor & (1UL<<i))
-                                       printf_P(PSTR("|%.2d"), i);
-                               else 
-                                       printf_P(PSTR("   "));
-                       }
-                       if (IR_DISP_SENSOR()) {
-                               printf_P(PSTR("IR|"));
-                       }
-                       else {
-                               printf_P(PSTR("  |"));
-                       }
-                       printf_P(PSTR("\r\n"));
-                       wait_ms(100);
-               }
-       }
-       else if (!strcmp_P(res->arg1, PSTR("ir_loop"))) { /* show_loop */
-               while(uart0_recv_nowait() == -1) {
-                       if (IR1())
-                               printf_P(PSTR("LEFT|"));
-                       else
-                               printf_P(PSTR("    |"));
-                       if (IR2())
-                               printf_P(PSTR("MID-L|"));
-                       else
-                               printf_P(PSTR("     |"));
-                       if (IR3())
-                               printf_P(PSTR("MID|"));
-                       else
-                               printf_P(PSTR("   |"));
-                       if (IR4())
-                               printf_P(PSTR("MID-R|"));
-                       else
-                               printf_P(PSTR("     |"));
-                       if (IR5())
-                               printf_P(PSTR("RIGHT| |"));
-                       else
-                               printf_P(PSTR("     | |"));
-
-                       if (sensor_obstacle())
-                               printf_P(PSTR("OBSTACLE|"));
-                       else
-                               printf_P(PSTR("        |"));
-
-                       if (strat_obstacle())
-                               printf_P(PSTR("OBSTACLE IN AREA (%d,%d)|"), 
-                                        mainboard.opponent_x, 
mainboard.opponent_y);
-                       else
-                               printf_P(PSTR("                |"));
-                       printf_P(PSTR("\r\n"));
-                       wait_ms(100);
-               }
-       }
-#endif
+       //      struct cmd_rs_result *res = parsed_result;
+       do {
+               printf_P(PSTR("angle cons=% .6ld in=% .6ld out=% .6ld / "), 
+                        cs_get_consign(&mainboard.angle.cs),
+                        cs_get_filtered_feedback(&mainboard.angle.cs),
+                        cs_get_out(&mainboard.angle.cs));
+               printf_P(PSTR("distance cons=% .6ld in=% .6ld out=% .6ld / "), 
+                        cs_get_consign(&mainboard.distance.cs),
+                        cs_get_filtered_feedback(&mainboard.distance.cs),
+                        cs_get_out(&mainboard.distance.cs));
+               printf_P(PSTR("l=% .4ld r=% .4ld\r\n"), mainboard.pwm_l,
+                        mainboard.pwm_r);
+               wait_ms(100);
+       } while(!cmdline_keypressed());
 }
 
-prog_char str_sensor_arg0[] = "sensor";
-parse_pgm_token_string_t cmd_sensor_arg0 = TOKEN_STRING_INITIALIZER(struct 
cmd_sensor_result, arg0, str_sensor_arg0);
-prog_char str_sensor_arg1[] = "show#all_loop#ir_loop";
-parse_pgm_token_string_t cmd_sensor_arg1 = TOKEN_STRING_INITIALIZER(struct 
cmd_sensor_result, arg1, str_sensor_arg1);
-
-prog_char help_sensor[] = "Show sensors status";
-parse_pgm_inst_t cmd_sensor = {
-       .f = cmd_sensor_parsed,  /* function to call */
+prog_char str_rs_arg0[] = "rs";
+parse_pgm_token_string_t cmd_rs_arg0 = TOKEN_STRING_INITIALIZER(struct 
cmd_rs_result, arg0, str_rs_arg0);
+prog_char str_rs_arg1[] = "show";
+parse_pgm_token_string_t cmd_rs_arg1 = TOKEN_STRING_INITIALIZER(struct 
cmd_rs_result, arg1, str_rs_arg1);
+
+prog_char help_rs[] = "Show rs (robot system) values";
+parse_pgm_inst_t cmd_rs = {
+       .f = cmd_rs_parsed,  /* function to call */
        .data = NULL,      /* 2nd arg of func */
-       .help_str = help_sensor,
+       .help_str = help_rs,
        .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_sensor_arg0,
-               (prog_void *)&cmd_sensor_arg1,
+               (prog_void *)&cmd_rs_arg0, 
+               (prog_void *)&cmd_rs_arg1, 
                NULL,
        },
 };
 
-
-
 /**********************************************************/
 /* Test */
 


=====================================================
aversive_projects/microb2009/mainboard/commands_gen.c  (1.2 -> 1.3)
=====================================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: commands_gen.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: commands_gen.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  *  Olivier MATZ <z...@droids-corp.org> 
  */
@@ -220,43 +220,6 @@
 };
 
 /**********************************************************/
-/* Brakes tests */
-
-/* this structure is filled when cmd_brake is parsed successfully */
-struct cmd_brake_result {
-       fixed_string_t arg0;
-       fixed_string_t arg1;
-};
-
-/* function called when cmd_brake is parsed successfully */
-static void cmd_brake_parsed(void *parsed_result, void *data)
-{
-       struct cmd_brake_result *res = parsed_result;
-       
-       if (!strcmp_P(res->arg1, PSTR("on")))
-               BRAKE_ON();
-       else if (!strcmp_P(res->arg1, PSTR("off")))
-               BRAKE_OFF();
-}
-
-prog_char str_brake_arg0[] = "brake";
-parse_pgm_token_string_t cmd_brake_arg0 = TOKEN_STRING_INITIALIZER(struct 
cmd_brake_result, arg0, str_brake_arg0);
-prog_char str_brake_arg1[] = "on#off";
-parse_pgm_token_string_t cmd_brake_arg1 = TOKEN_STRING_INITIALIZER(struct 
cmd_brake_result, arg1, str_brake_arg1);
-
-prog_char help_brake[] = "Enable/disable brake";
-parse_pgm_inst_t cmd_brake = {
-       .f = cmd_brake_parsed,  /* function to call */
-       .data = NULL,      /* 2nd arg of func */
-       .help_str = help_brake,
-       .tokens = {        /* token list, NULL terminated */
-               (prog_void *)&cmd_brake_arg0, 
-               (prog_void *)&cmd_brake_arg1, 
-               NULL,
-       },
-};
-
-/**********************************************************/
 /* Adcs tests */
 
 /* this structure is filled when cmd_adc is parsed successfully */
@@ -276,8 +239,8 @@
        
        do {
                printf_P(PSTR("ADC values: "));
-               for (i=0; i<SENSOR_ADC_COUNT; i++) {
-                       printf_P(PSTR("%.4d "), sensor_read_adc(i));
+               for (i=0; i<ADC_MAX; i++) {
+                       printf_P(PSTR("%.4d "), sensor_get_adc(i));
                }
                printf_P(PSTR("\r\n"));
                wait_ms(100);
@@ -303,6 +266,52 @@
 
 
 /**********************************************************/
+/* Sensors tests */
+
+/* this structure is filled when cmd_sensor is parsed successfully */
+struct cmd_sensor_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+};
+
+/* function called when cmd_sensor is parsed successfully */
+static void cmd_sensor_parsed(void *parsed_result, void *data)
+{
+       struct cmd_sensor_result *res = parsed_result;
+       uint8_t i, loop = 0;
+
+       if (!strcmp_P(res->arg1, PSTR("loop_show")))
+               loop = 1;
+       
+       do {
+               printf_P(PSTR("SENSOR values: "));
+               for (i=0; i<SENSOR_MAX; i++) {
+                       printf_P(PSTR("%d "), sensor_get(i));
+               }
+               printf_P(PSTR("\r\n"));
+               wait_ms(100);
+       } while (loop && !cmdline_keypressed());
+}
+
+prog_char str_sensor_arg0[] = "sensor";
+parse_pgm_token_string_t cmd_sensor_arg0 = TOKEN_STRING_INITIALIZER(struct 
cmd_sensor_result, arg0, str_sensor_arg0);
+prog_char str_sensor_arg1[] = "show#loop_show";
+parse_pgm_token_string_t cmd_sensor_arg1 = TOKEN_STRING_INITIALIZER(struct 
cmd_sensor_result, arg1, str_sensor_arg1);
+
+prog_char help_sensor[] = "Show sensor values";
+parse_pgm_inst_t cmd_sensor = {
+       .f = cmd_sensor_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_sensor,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_sensor_arg0, 
+               (prog_void *)&cmd_sensor_arg1, 
+               NULL,
+       },
+};
+
+
+/**********************************************************/
 /* Log */
 
 /* this structure is filled when cmd_log is parsed successfully */


====================================================
aversive_projects/microb2009/mainboard/commands_cs.c  (1.2 -> 1.3)
====================================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: commands_cs.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: commands_cs.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  *  Olivier MATZ <z...@droids-corp.org> 
  */
@@ -47,6 +47,7 @@
 #include <parse_num.h>
 
 #include "main.h"
+#include "cs.h"
 #include "cmdline.h"
 
 struct csb_list {
@@ -56,13 +57,9 @@
 
 prog_char csb_angle_str[] = "angle";
 prog_char csb_distance_str[] = "distance";
-prog_char csb_example1_str[] = "example1";
-prog_char csb_example2_str[] = "example2";
 struct csb_list csb_list[] = {
        { .name = csb_angle_str, .csb = &mainboard.angle },
        { .name = csb_distance_str, .csb = &mainboard.distance },
-       { .name = csb_example1_str, .csb = &mainboard.example1 },
-       { .name = csb_example2_str, .csb = &mainboard.example2 },
 };
 
 struct cmd_cs_result {
@@ -71,7 +68,7 @@
 };
 
 /* token to be used for all cs-related commands */
-prog_char str_csb_name[] = "angle#distance#example1#example2";
+prog_char str_csb_name[] = "angle#distance";
 parse_pgm_token_string_t cmd_csb_name_tok = TOKEN_STRING_INITIALIZER(struct 
cmd_cs_result, csname, str_csb_name);
 
 struct cs_block *cs_from_name(const char *name)
@@ -111,7 +108,7 @@
        if (!show) 
                pid_set_gains(&csb->pid, res->p, res->i, res->d);
 
-       printf_P(PSTR("%s %s %d %d %d\r\n"), 
+       printf_P(PSTR("%s %s %d %d %d\r\n"),
                 res->cs.cmdname,
                 res->cs.csname,
                 pid_get_gain_P(&csb->pid),
@@ -529,13 +526,13 @@
        struct cmd_cs_status_result *res = parsed_result;
        struct cs_block *csb;
        uint8_t loop = 0;
+       uint8_t print_pid = 0, print_cs = 0;
        
        csb = cs_from_name(res->cs.csname);
        if (csb == NULL) {
                printf_P(PSTR("null csb\r\n"));
                return;
        }
-
        if (strcmp_P(res->arg, PSTR("on")) == 0) {
                csb->on = 1;
                printf_P(PSTR("%s is on\r\n"), res->cs.csname);
@@ -546,25 +543,34 @@
                printf_P(PSTR("%s is off\r\n"), res->cs.csname);
                return;
        }
-       else if (strcmp_P(res->arg, PSTR("loop_show")) == 0)
+       else if (strcmp_P(res->arg, PSTR("show")) == 0) {
+               print_cs = 1;
+       }
+       else if (strcmp_P(res->arg, PSTR("loop_show")) == 0) {
+               loop = 1;
+               print_cs = 1;
+       }
+       else if (strcmp_P(res->arg, PSTR("pid_show")) == 0) {
+               print_pid = 1;
+       }
+       else if (strcmp_P(res->arg, PSTR("pid_loop_show")) == 0) {
+               print_pid = 1;
                loop = 1;
+       }
 
        printf_P(PSTR("%s cs is %s\r\n"), res->cs.csname, csb->on ? "on":"off");
        do {
-               printf_P(PSTR("%s cons=%ld fil_cons=%ld err=%ld feed=%ld 
out=%ld\r\n"), 
-                        res->cs.csname,
-                        cs_get_consign(&csb->cs),
-                        cs_get_filtered_consign(&csb->cs),
-                        cs_get_error(&csb->cs),
-                        cs_get_filtered_feedback(&csb->cs),
-                        cs_get_out(&csb->cs));
+               if (print_cs)
+                       dump_cs(res->cs.csname, &csb->cs);
+               if (print_pid)
+                       dump_pid(res->cs.csname, &csb->pid);
                wait_ms(100);
        } while(loop && !cmdline_keypressed());
 }
 
 prog_char str_cs_status_arg0[] = "cs_status";
 parse_pgm_token_string_t cmd_cs_status_arg0 = TOKEN_STRING_INITIALIZER(struct 
cmd_cs_status_result, cs.cmdname, str_cs_status_arg0);
-prog_char str_cs_status_arg[] = "show#loop_show#on#off";
+prog_char str_cs_status_arg[] = "pid_show#pid_loop_show#show#loop_show#on#off";
 parse_pgm_token_string_t cmd_cs_status_arg = TOKEN_STRING_INITIALIZER(struct 
cmd_cs_status_result, arg, str_cs_status_arg);
 
 prog_char help_cs_status[] = "Show cs status";


=================================================
aversive_projects/microb2009/mainboard/commands.c  (1.2 -> 1.3)
=================================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: commands.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ *  Revision : $Id: commands.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
  *
  *  Olivier MATZ <z...@droids-corp.org> 
  */
@@ -29,8 +29,8 @@
 extern parse_pgm_inst_t cmd_bootloader;
 extern parse_pgm_inst_t cmd_encoders;
 extern parse_pgm_inst_t cmd_pwm;
-extern parse_pgm_inst_t cmd_brake;
 extern parse_pgm_inst_t cmd_adc;
+extern parse_pgm_inst_t cmd_sensor;
 extern parse_pgm_inst_t cmd_log;
 extern parse_pgm_inst_t cmd_log_show;
 extern parse_pgm_inst_t cmd_log_type;
@@ -67,7 +67,7 @@
 extern parse_pgm_inst_t cmd_start;
 extern parse_pgm_inst_t cmd_interact;
 extern parse_pgm_inst_t cmd_color;
-extern parse_pgm_inst_t cmd_sensor;
+extern parse_pgm_inst_t cmd_rs;
 extern parse_pgm_inst_t cmd_test;
 
 /* commands_traj.c */
@@ -95,8 +95,8 @@
        (parse_pgm_inst_t *)&cmd_bootloader,
        (parse_pgm_inst_t *)&cmd_encoders,
        (parse_pgm_inst_t *)&cmd_pwm,
-       (parse_pgm_inst_t *)&cmd_brake,
        (parse_pgm_inst_t *)&cmd_adc,
+       (parse_pgm_inst_t *)&cmd_sensor,
        (parse_pgm_inst_t *)&cmd_log,
        (parse_pgm_inst_t *)&cmd_log_show,
        (parse_pgm_inst_t *)&cmd_log_type,
@@ -132,7 +132,7 @@
        (parse_pgm_inst_t *)&cmd_start,
        (parse_pgm_inst_t *)&cmd_interact,
        (parse_pgm_inst_t *)&cmd_color,
-       (parse_pgm_inst_t *)&cmd_sensor,
+       (parse_pgm_inst_t *)&cmd_rs,
        (parse_pgm_inst_t *)&cmd_test,
 
        /* commands_traj.c */


Commit from zer0 on branch b_zer0 (2009-03-01 15:44 CET)
=================================

Fix bug introduced by previous commit...

  aversive  modules/devices/control_system/filters/pid/pid.c  1.5.4.9


=========================================================
aversive/modules/devices/control_system/filters/pid/pid.c  (1.5.4.8 -> 1.5.4.9)
=========================================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: pid.c,v 1.5.4.8 2009-02-27 21:32:59 zer0 Exp $
+ *  Revision : $Id: pid.c,v 1.5.4.9 2009-03-01 14:44:08 zer0 Exp $
  *
  */
 
@@ -197,7 +197,7 @@
        */
        
        prev_index = p->index + 1;
-       if (prev_index > p->derivate_nb_samples)
+       if (prev_index >= p->derivate_nb_samples)
                prev_index = 0;
 
        /* saturate input... it influences integral an derivate */


Commit from zer0 (2009-03-01 15:44 CET)
================

s/extension/generic/

  aversive_projects  microb2009/common/i2c_commands.h  1.3


==================================================
aversive_projects/microb2009/common/i2c_commands.h  (1.2 -> 1.3)
==================================================

@@ -15,7 +15,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- *  Revision : $Id: i2c_commands.h,v 1.2 2009-02-20 21:10:01 zer0 Exp $
+ *  Revision : $Id: i2c_commands.h,v 1.3 2009-03-01 14:44:36 zer0 Exp $
  *
  */
 
@@ -49,7 +49,7 @@
 
 #define I2C_GENERIC_COLOR_RED   0
 #define I2C_GENERIC_COLOR_GREEN 1
-struct i2c_cmd_mechboard_color {
+struct i2c_cmd_generic_color {
        struct i2c_cmd_hdr hdr;
        uint8_t color;
 };

_______________________________________________
Avr-list mailing list
Avr-list@droids-corp.org
CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive
WIKI : http://wiki.droids-corp.org/index.php/Aversive
DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/
BUGZILLA : http://bugzilla.droids-corp.org
COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog

Répondre à