--- /dev/null
+/*
+ * Copyright Droids Corporation (2009)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * 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_scan.c,v 1.1 2009-05-27 20:04:07 zer0 Exp $
+ *
+ * Olivier MATZ <zer0@droids-corp.org>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <aversive/pgmspace.h>
+#include <aversive/wait.h>
+#include <aversive/error.h>
+#include <time.h>
+
+#include <ax12.h>
+#include <uart.h>
+#include <pwm_ng.h>
+#include <time.h>
+#include <spi.h>
+
+#include <pid.h>
+#include <quadramp.h>
+#include <control_system_manager.h>
+#include <blocking_detection_manager.h>
+
+#include <rdline.h>
+#include <parse.h>
+#include <parse_string.h>
+#include <parse_num.h>
+
+#include <adc.h>
+
+#include <math.h>
+
+#include "main.h"
+#include "cmdline.h"
+#include "../common/i2c_commands.h"
+#include "i2c_protocol.h"
+#include "actuator.h"
+
+#include <vect_base.h>
+#include <lines.h>
+#include <polygon.h>
+
+#include "img_processing.h"
+#include "scanner.h"
+
+
+
+/**********************************************************/
+/* sample ADC */
+/*
+extern uint16_t sample_i;
+extern float scan_offset_a;
+extern float scan_offset_b;
+*/
+extern struct scan_params scan_params;
+
+//extern uint16_t sample_tab[MAX_SAMPLE];
+/* this structure is filled when cmd_sample is parsed successfully */
+struct cmd_sample_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+ uint16_t offset_b;
+ float offset_a;
+ uint16_t dump_speed;
+ uint8_t filter;
+};
+
+extern int32_t pos_start_scan;
+/* function called when cmd_sample is parsed successfully */
+
+#define MAX_OBJECTS 10
+Object_bb sac_obj[MAX_OBJECTS];
+static void cmd_sample_parsed(void * parsed_result, void * data)
+{
+ struct cmd_sample_result * res = parsed_result;
+ uint16_t i;
+
+ printf_P(PSTR("cmd sample called\r\n"));
+ printf_P(PSTR("arg %s %d\r\n"), res->arg1, res->offset_b);
+
+ quadramp_set_1st_order_vars(&sensorboard.scanner.qr, res->dump_speed, res->dump_speed); /* set speed */
+
+
+ scan_params.offset_b = (((float)res->offset_b)*M_PI/180.);
+ scan_params.offset_a = (((float)res->offset_a)*M_PI/180.);
+ scan_params.filter = res->filter;
+
+ if (!strcmp_P(res->arg1, PSTR("start"))) {
+ scan_params.sample_i = MAX_SAMPLE;
+ scan_params.pos_start_scan = encoders_spi_get_value_scanner(SCANNER_ENC);
+ //printf_P(PSTR("start scan at pos %ld\r\n"), scan_params.pos_start_scan);
+
+ memset(scan_params.sample_tab, 0xff, MAX_SAMPLE*sizeof(uint8_t));
+
+
+ cs_set_consign(&sensorboard.scanner.cs, scan_params.pos_start_scan+SCANNER_STEP_TOUR*200L);
+ //printf_P(PSTR("scan dst %ld\r\n"), scan_params.pos_start_scan+SCANNER_STEP_TOUR*200L);
+
+ scan_params.last_col_n = 0;
+ scan_params.last_row_n = 0;
+ scan_params.last_sample = 0;
+
+ }
+ else if (!strcmp_P(res->arg1, PSTR("dump"))) {
+ printf_P(PSTR("start object detection\r\n"));
+ for (i=0;i<MAX_OBJECTS;i++){
+ sac_obj[i].x_min = 0;
+ sac_obj[i].x_max = 0;
+ sac_obj[i].y_min = 0;
+ sac_obj[i].y_max = 0;
+ }
+
+ //parcour_img(sample_tab, PIX_PER_SCAN, MAX_SAMPLE/PIX_PER_SCAN, sac_obj, MAX_OBJECTS);
+ /*
+ process_img(scan_params.sample_tab, PIX_PER_SCAN, MAX_SAMPLE/PIX_PER_SCAN,
+ 4, 1,
+ 0, 15, 15,
+ 1);
+ */
+
+ for (i=0;i<MAX_OBJECTS;i++){
+ printf_P(PSTR("obj: %d %d %d %d\r\n"),
+ sac_obj[i].x_min,
+ sac_obj[i].y_min,
+ sac_obj[i].x_max,
+ sac_obj[i].y_max);
+ }
+
+ printf_P(PSTR("start dumping %ld\r\n"), PIX_PER_SCAN);
+
+ for (i=0;i<MAX_SAMPLE;i++)
+ printf_P(PSTR("%d\r\n"),scan_params.sample_tab[i]);
+
+ printf_P(PSTR("end dumping (pos: %ld)\r\n"),
+ encoders_spi_get_value_scanner((void *)SCANNER_ENC));
+ }
+
+}
+
+prog_char str_sample_arg0[] = "sample";
+parse_pgm_token_string_t cmd_sample_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_sample_result, arg0, str_sample_arg0);
+prog_char str_sample_arg1[] = "start#dump";
+parse_pgm_token_string_t cmd_sample_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_sample_result, arg1, str_sample_arg1);
+parse_pgm_token_num_t cmd_sample_arg2 = TOKEN_NUM_INITIALIZER(struct cmd_sample_result, offset_b, UINT16);
+parse_pgm_token_num_t cmd_sample_arg3 = TOKEN_NUM_INITIALIZER(struct cmd_sample_result, offset_a, FLOAT);
+parse_pgm_token_num_t cmd_sample_arg4 = TOKEN_NUM_INITIALIZER(struct cmd_sample_result, dump_speed, UINT16);
+parse_pgm_token_num_t cmd_sample_arg5 = TOKEN_NUM_INITIALIZER(struct cmd_sample_result, filter, UINT8);
+
+prog_char help_sample[] = "Sample func off_a_mot, off_a_angl, dump_speed";
+parse_pgm_inst_t cmd_sample = {
+ .f = cmd_sample_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_sample,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_sample_arg0,
+ (prog_void *)&cmd_sample_arg1,
+ (prog_void *)&cmd_sample_arg2,
+ (prog_void *)&cmd_sample_arg3,
+ (prog_void *)&cmd_sample_arg4,
+ (prog_void *)&cmd_sample_arg5,
+ NULL,
+ },
+};
+
+
+
+
+/**********************************************************/
+/* sadc tests */
+
+/* this structure is filled when cmd_sadc is parsed successfully */
+struct cmd_sadc_result {
+ fixed_string_t arg0;
+};
+
+/* function called when cmd_sadc is parsed successfully */
+static void cmd_sadc_parsed(void *parsed_result, void *data)
+{
+
+ printf_P(PSTR("Scan ADC values:\r\n"));
+ do {
+ printf_P(PSTR("%.4d "), adc_get_value( ADC_REF_AVCC | MUX_ADC13 ));
+ printf_P(PSTR("\r\n"));
+ wait_ms(100);
+ } while (!cmdline_keypressed());
+}
+
+prog_char str_sadc_arg0[] = "sadc";
+parse_pgm_token_string_t cmd_sadc_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_sadc_result, arg0, str_sadc_arg0);
+
+prog_char help_sadc[] = "Show sadc values";
+parse_pgm_inst_t cmd_sadc = {
+ .f = cmd_sadc_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_sadc,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_sadc_arg0,
+ NULL,
+ },
+};
+
+
+
+
+/**********************************************************/
+/* set scanner params */
+
+/* this structure is filled when cmd_scan_params is parsed successfully */
+struct cmd_scan_params_result {
+ fixed_string_t arg0;
+ int speed;
+ uint8_t debug;
+};
+
+/* function called when cmd_scan_params is parsed successfully */
+static void cmd_scan_params_parsed(void * parsed_result, void * data)
+{
+ struct cmd_scan_params_result * res = parsed_result;
+
+ scan_params.speed = res->speed;
+ scan_params.debug = res->debug;
+
+}
+
+prog_char str_scan_params_arg0[] = "scan_params";
+parse_pgm_token_string_t cmd_scan_params_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_scan_params_result, arg0, str_scan_params_arg0);
+parse_pgm_token_num_t cmd_scan_params_arg1 = TOKEN_NUM_INITIALIZER(struct cmd_scan_params_result, speed, INT16);
+parse_pgm_token_num_t cmd_scan_params_arg2 = TOKEN_NUM_INITIALIZER(struct cmd_scan_params_result, debug, UINT8);
+
+prog_char help_scan_params[] = "Set scanner params (speed, debug)";
+parse_pgm_inst_t cmd_scan_params = {
+ .f = cmd_scan_params_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_sample,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_scan_params_arg0,
+ (prog_void *)&cmd_scan_params_arg1,
+ (prog_void *)&cmd_scan_params_arg2,
+ NULL,
+ },
+};
+
+
+
+/**********************************************************/
+/* set scanner calibration */
+
+/* this structure is filled when cmd_scan_calibre is parsed successfully */
+struct cmd_scan_calibre_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+};
+
+/* function called when cmd_scan_calibre is parsed successfully */
+static void cmd_scan_calibre_parsed(void * parsed_result, void * data)
+{
+ struct cmd_scan_calibre_result * res = parsed_result;
+
+ printf_P(PSTR("Starting scanner autocalibration\r\n"));
+
+
+ if (!strcmp_P(res->arg1, PSTR("mirror"))) {
+ scanner_calibre_mirror();
+ }
+ else{
+ scanner_calibre_laser();
+ }
+}
+
+prog_char str_scan_calibre_arg0[] = "scan_calibre";
+
+prog_char str_scan_calibre_what_arg1[] = "mirror#laser";
+parse_pgm_token_string_t cmd_scan_calibre_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_scan_calibre_result, arg0, str_scan_calibre_arg0);
+parse_pgm_token_string_t cmd_scan_calibre_arg1 = TOKEN_STRING_INITIALIZER(struct cmd_scan_calibre_result, arg1, str_scan_calibre_what_arg1);
+
+
+prog_char help_scan_calibre[] = "Scanner auto calibration (mirror|laser)";
+parse_pgm_inst_t cmd_scan_calibre = {
+ .f = cmd_scan_calibre_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_scan_calibre,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_scan_calibre_arg0,
+ (prog_void *)&cmd_scan_calibre_arg1,
+ NULL,
+ },
+};
+
+
+
+/**********************************************************/
+/* start scan */
+
+/* this structure is filled when cmd_scan_do is parsed successfully */
+struct cmd_scan_do_result {
+ fixed_string_t arg0;
+};
+
+/* function called when cmd_scan_do is parsed successfully */
+static void cmd_scan_do_parsed(void * parsed_result, void * data)
+{
+ printf_P(PSTR("Starting scan\r\n"));
+ scanner_scan_autonomous();
+}
+
+prog_char str_scan_do_arg0[] = "scan_do";
+parse_pgm_token_string_t cmd_scan_do_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_scan_do_result, arg0, str_scan_do_arg0);
+
+prog_char help_scan_do[] = "Scan zone";
+parse_pgm_inst_t cmd_scan_do = {
+ .f = cmd_scan_do_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_scan_do,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_scan_do_arg0,
+ NULL,
+ },
+};
+
+
+
+
+/**********************************************************/
+/* set scanner img params */
+
+/* this structure is filled when cmd_scan_img is parsed successfully */
+struct cmd_scan_img_result {
+ fixed_string_t arg0;
+ uint8_t algo;
+ uint8_t h;
+ int16_t x;
+ int16_t y;
+
+};
+
+/* function called when cmd_scan_img is parsed successfully */
+static void cmd_scan_img_parsed(void * parsed_result, void * data)
+{
+ struct cmd_scan_img_result * res = parsed_result;
+
+ scan_params.algo = res->algo;
+ if (res->algo == I2C_SCANNER_ALGO_COLUMN_DROPZONE) {
+ scan_params.drop_zone.working_zone = res->h;
+ scan_params.drop_zone.center_x = res->x;
+ scan_params.drop_zone.center_y = res->y;
+ } else if (res->algo == I2C_SCANNER_ALGO_CHECK_TEMPLE) {
+ scan_params.check_temple.level = res->h;
+ scan_params.check_temple.temple_x = res->x;
+ scan_params.check_temple.temple_y = res->y;
+ } else if (res->algo == I2C_SCANNER_ALGO_TEMPLE_DROPZONE) {
+ scan_params.drop_zone.working_zone = res->h;
+ scan_params.drop_zone.center_x = res->x;
+ scan_params.drop_zone.center_y = res->y;
+ }
+
+
+
+}
+
+prog_char str_scan_img_arg0[] = "scan_img";
+parse_pgm_token_string_t cmd_scan_img_arg0 = TOKEN_STRING_INITIALIZER(struct cmd_scan_img_result, arg0, str_scan_img_arg0);
+parse_pgm_token_num_t cmd_scan_img_arg1 = TOKEN_NUM_INITIALIZER(struct cmd_scan_img_result, algo, UINT8);
+parse_pgm_token_num_t cmd_scan_img_arg2 = TOKEN_NUM_INITIALIZER(struct cmd_scan_img_result, h, UINT8);
+parse_pgm_token_num_t cmd_scan_img_arg3 = TOKEN_NUM_INITIALIZER(struct cmd_scan_img_result, x, INT16);
+parse_pgm_token_num_t cmd_scan_img_arg4 = TOKEN_NUM_INITIALIZER(struct cmd_scan_img_result, y, INT16);
+
+
+prog_char help_scan_img[] = "Set scanner img processing params (algo, H, x, y)";
+parse_pgm_inst_t cmd_scan_img = {
+ .f = cmd_scan_img_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_scan_img,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_scan_img_arg0,
+ (prog_void *)&cmd_scan_img_arg1,
+ (prog_void *)&cmd_scan_img_arg2,
+ (prog_void *)&cmd_scan_img_arg3,
+ (prog_void *)&cmd_scan_img_arg4,
+ NULL,
+ },
+};
+
+