This program supports the Image processing micon car production kit (M-S348).

Dependencies:   GR-PEACH_video mbed

Committer:
TetsuyaKonno
Date:
Tue Oct 30 09:06:30 2018 +0000
Revision:
0:00b6f7454ada
New program file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TetsuyaKonno 0:00b6f7454ada 1 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 2 //Supported MCU: RZ/A1H
TetsuyaKonno 0:00b6f7454ada 3 //File Contents: kit18 GR-peach ( Trace program )
TetsuyaKonno 0:00b6f7454ada 4 //Version number: Ver.1.00
TetsuyaKonno 0:00b6f7454ada 5 //Date: 2018.10.30
TetsuyaKonno 0:00b6f7454ada 6 //Copyright: Renesas Electronics Corporation
TetsuyaKonno 0:00b6f7454ada 7 // Hitachi Document Solutions Co., Ltd.
TetsuyaKonno 0:00b6f7454ada 8 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 9
TetsuyaKonno 0:00b6f7454ada 10 //This program supports the following kit:
TetsuyaKonno 0:00b6f7454ada 11 //* M-S348 Image processing micon car production kit
TetsuyaKonno 0:00b6f7454ada 12
TetsuyaKonno 0:00b6f7454ada 13 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 14 //Include
TetsuyaKonno 0:00b6f7454ada 15 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 16 #include "mbed.h"
TetsuyaKonno 0:00b6f7454ada 17 #include "iodefine.h"
TetsuyaKonno 0:00b6f7454ada 18 #include "DisplayBace.h"
TetsuyaKonno 0:00b6f7454ada 19 #include "image_process.h"
TetsuyaKonno 0:00b6f7454ada 20
TetsuyaKonno 0:00b6f7454ada 21 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 22 //Define
TetsuyaKonno 0:00b6f7454ada 23 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 24 //Motor PWM cycle
TetsuyaKonno 0:00b6f7454ada 25 #define MOTOR_PWM_CYCLE 33332 /* Motor PWM period */
TetsuyaKonno 0:00b6f7454ada 26 /* 1ms P0φ/1 = 0.03us */
TetsuyaKonno 0:00b6f7454ada 27 //Servo PWM cycle
TetsuyaKonno 0:00b6f7454ada 28 #define SERVO_PWM_CYCLE 33332 /* SERVO PWM period */
TetsuyaKonno 0:00b6f7454ada 29 /* 16ms P0φ/16 = 0.48us */
TetsuyaKonno 0:00b6f7454ada 30 #define SERVO_CENTER 3124 /* 1.5ms / 0.48us - 1 = 3124*/
TetsuyaKonno 0:00b6f7454ada 31 #define HANDLE_STEP 18 /* 1 degree value */
TetsuyaKonno 0:00b6f7454ada 32
TetsuyaKonno 0:00b6f7454ada 33 #define THRESHOLD 128 /* Binarization function only */
TetsuyaKonno 0:00b6f7454ada 34
TetsuyaKonno 0:00b6f7454ada 35 //LED Color on GR-PEACH
TetsuyaKonno 0:00b6f7454ada 36 #define LED_OFF 0x00
TetsuyaKonno 0:00b6f7454ada 37 #define LED_RED 0x01
TetsuyaKonno 0:00b6f7454ada 38 #define LED_GREEN 0x02
TetsuyaKonno 0:00b6f7454ada 39 #define LED_YELLOW 0x03
TetsuyaKonno 0:00b6f7454ada 40 #define LED_BLUE 0x04
TetsuyaKonno 0:00b6f7454ada 41 #define LED_PURPLE 0x05
TetsuyaKonno 0:00b6f7454ada 42 #define LED_SKYBLUE 0x06
TetsuyaKonno 0:00b6f7454ada 43 #define LED_WHITE 0x07
TetsuyaKonno 0:00b6f7454ada 44
TetsuyaKonno 0:00b6f7454ada 45 //led_m_set function only
TetsuyaKonno 0:00b6f7454ada 46 #define RUN 0x00
TetsuyaKonno 0:00b6f7454ada 47 #define STOP 0x01
TetsuyaKonno 0:00b6f7454ada 48 #define ERROR 0x02
TetsuyaKonno 0:00b6f7454ada 49 #define DEBUG 0x03
TetsuyaKonno 0:00b6f7454ada 50 #define CRANK 0x04
TetsuyaKonno 0:00b6f7454ada 51 #define LCHANGE 0x05
TetsuyaKonno 0:00b6f7454ada 52
TetsuyaKonno 0:00b6f7454ada 53 //ImageData_Serial_out3 function only
TetsuyaKonno 0:00b6f7454ada 54 #define COLOR 0x01
TetsuyaKonno 0:00b6f7454ada 55 #define GREY_SCALE 0x02
TetsuyaKonno 0:00b6f7454ada 56 #define BINARY 0x03
TetsuyaKonno 0:00b6f7454ada 57
TetsuyaKonno 0:00b6f7454ada 58 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 59 //Define(NTSC-Video)
TetsuyaKonno 0:00b6f7454ada 60 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 61 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0)
TetsuyaKonno 0:00b6f7454ada 62 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD)
TetsuyaKonno 0:00b6f7454ada 63 #define DATA_SIZE_PER_PIC (2u)
TetsuyaKonno 0:00b6f7454ada 64
TetsuyaKonno 0:00b6f7454ada 65 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
TetsuyaKonno 0:00b6f7454ada 66 in accordance with the frame buffer burst transfer mode. */
TetsuyaKonno 0:00b6f7454ada 67 #define PIXEL_HW (160u) /* QVGA */
TetsuyaKonno 0:00b6f7454ada 68 #define PIXEL_VW (120u) /* QVGA */
TetsuyaKonno 0:00b6f7454ada 69 #define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u)
TetsuyaKonno 0:00b6f7454ada 70 #define VIDEO_BUFFER_HEIGHT (PIXEL_VW)
TetsuyaKonno 0:00b6f7454ada 71
TetsuyaKonno 0:00b6f7454ada 72 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 73 //Constructor
TetsuyaKonno 0:00b6f7454ada 74 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 75 /* Create DisplayBase object */
TetsuyaKonno 0:00b6f7454ada 76 DisplayBase Display;
TetsuyaKonno 0:00b6f7454ada 77
TetsuyaKonno 0:00b6f7454ada 78 Ticker interrput;
TetsuyaKonno 0:00b6f7454ada 79 Serial pc(USBTX, USBRX);
TetsuyaKonno 0:00b6f7454ada 80
TetsuyaKonno 0:00b6f7454ada 81 DigitalOut LED_R(P6_13); /* LED1 on the GR-PEACH board */
TetsuyaKonno 0:00b6f7454ada 82 DigitalOut LED_G(P6_14); /* LED2 on the GR-PEACH board */
TetsuyaKonno 0:00b6f7454ada 83 DigitalOut LED_B(P6_15); /* LED3 on the GR-PEACH board */
TetsuyaKonno 0:00b6f7454ada 84 DigitalOut USER_LED(P6_12); /* USER_LED on the GR-PEACH board */
TetsuyaKonno 0:00b6f7454ada 85 DigitalIn user_botton(P6_0); /* SW1 on the GR-PEACH board */
TetsuyaKonno 0:00b6f7454ada 86
TetsuyaKonno 0:00b6f7454ada 87 BusIn dipsw( P7_15, P8_1, P2_9, P2_10 ); /* SW1 on Shield board */
TetsuyaKonno 0:00b6f7454ada 88
TetsuyaKonno 0:00b6f7454ada 89 DigitalOut Left_motor_signal(P4_6); /* Used by motor function */
TetsuyaKonno 0:00b6f7454ada 90 DigitalOut Right_motor_signal(P4_7); /* Used by motor function */
TetsuyaKonno 0:00b6f7454ada 91 DigitalIn push_sw(P2_13); /* SW1 on the Motor Drive board */
TetsuyaKonno 0:00b6f7454ada 92 DigitalOut LED_3(P2_14); /* LED3 on the Motor Drive board */
TetsuyaKonno 0:00b6f7454ada 93 DigitalOut LED_2(P2_15); /* LED2 on the Motor Drive board */
TetsuyaKonno 0:00b6f7454ada 94
TetsuyaKonno 0:00b6f7454ada 95 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 96 //Prototype(NTSC-video)
TetsuyaKonno 0:00b6f7454ada 97 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 98 void init_Camera( void );
TetsuyaKonno 0:00b6f7454ada 99 void ChangeFrameBuffer( void );
TetsuyaKonno 0:00b6f7454ada 100 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type);
TetsuyaKonno 0:00b6f7454ada 101 static void WaitVfield(const int32_t wait_count);
TetsuyaKonno 0:00b6f7454ada 102 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type);
TetsuyaKonno 0:00b6f7454ada 103 static void WaitVsync(const int32_t wait_count);
TetsuyaKonno 0:00b6f7454ada 104
TetsuyaKonno 0:00b6f7454ada 105 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 106 //Prototype
TetsuyaKonno 0:00b6f7454ada 107 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 108 //Peripheral functions
TetsuyaKonno 0:00b6f7454ada 109 void init_MTU2_PWM_Motor( void ); /* Initialize PWM functions */
TetsuyaKonno 0:00b6f7454ada 110 void init_MTU2_PWM_Servo( void ); /* Initialize PWM functions */
TetsuyaKonno 0:00b6f7454ada 111
TetsuyaKonno 0:00b6f7454ada 112 //Interrupt function
TetsuyaKonno 0:00b6f7454ada 113 void intTimer( void ); /* 1ms period */
TetsuyaKonno 0:00b6f7454ada 114
TetsuyaKonno 0:00b6f7454ada 115 //GR-peach board
TetsuyaKonno 0:00b6f7454ada 116 void led_rgb(int led);
TetsuyaKonno 0:00b6f7454ada 117 void led_m_user( int led );
TetsuyaKonno 0:00b6f7454ada 118 unsigned char user_button_get( void );
TetsuyaKonno 0:00b6f7454ada 119 void led_m_set( int set );
TetsuyaKonno 0:00b6f7454ada 120 void led_m_process( void ); /* Only function for interrupt */
TetsuyaKonno 0:00b6f7454ada 121
TetsuyaKonno 0:00b6f7454ada 122 //Motor drive board
TetsuyaKonno 0:00b6f7454ada 123 void led_out(int led);
TetsuyaKonno 0:00b6f7454ada 124 unsigned char pushsw_get( void );
TetsuyaKonno 0:00b6f7454ada 125 void motor( int accele_l, int accele_r );
TetsuyaKonno 0:00b6f7454ada 126 void motor2( int accele_l, int accele_r );
TetsuyaKonno 0:00b6f7454ada 127 void handle( int angle );
TetsuyaKonno 0:00b6f7454ada 128 int diff( int pwm );
TetsuyaKonno 0:00b6f7454ada 129
TetsuyaKonno 0:00b6f7454ada 130 //Shield board
TetsuyaKonno 0:00b6f7454ada 131 unsigned char dipsw_get( void );
TetsuyaKonno 0:00b6f7454ada 132
TetsuyaKonno 0:00b6f7454ada 133 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 134 //Prototype( Digital sensor process )
TetsuyaKonno 0:00b6f7454ada 135 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 136 int init_sensor( unsigned char *BuffAddrIn, int HW, int VW, int Cx, int *SENPx, int Y );
TetsuyaKonno 0:00b6f7454ada 137 unsigned char sensor_process( unsigned char *BuffAddrIn, int HW, int VW, int *SENPx, int Y ); /* Only function for interrupt */
TetsuyaKonno 0:00b6f7454ada 138 unsigned char sensor_inp( void );
TetsuyaKonno 0:00b6f7454ada 139 unsigned char center_inp( void );
TetsuyaKonno 0:00b6f7454ada 140
TetsuyaKonno 0:00b6f7454ada 141 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 142 //Prototype( Mark detect functions )
TetsuyaKonno 0:00b6f7454ada 143 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 144 int RightCrankCheck( int percentage );
TetsuyaKonno 0:00b6f7454ada 145 int RightLaneChangeCheck( int percentage );
TetsuyaKonno 0:00b6f7454ada 146
TetsuyaKonno 0:00b6f7454ada 147 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 148 //Prototype( Debug functions )
TetsuyaKonno 0:00b6f7454ada 149 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 150 void ImageData_Serial_Out1( unsigned char *ImageData, int HW, int VW );
TetsuyaKonno 0:00b6f7454ada 151 void ImageData_Serial_Out2( unsigned char *ImageData, int HW, int VW );
TetsuyaKonno 0:00b6f7454ada 152 void ImageData_Serial_Out3( unsigned char *ImageData, int HW, int VW, int color_pattern );
TetsuyaKonno 0:00b6f7454ada 153
TetsuyaKonno 0:00b6f7454ada 154 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 155 //Global variable (NTSC-video)
TetsuyaKonno 0:00b6f7454ada 156 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 157 static uint8_t FrameBuffer_Video_A[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!;
TetsuyaKonno 0:00b6f7454ada 158 static uint8_t FrameBuffer_Video_B[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!;
TetsuyaKonno 0:00b6f7454ada 159 uint8_t * write_buff_addr = FrameBuffer_Video_A;
TetsuyaKonno 0:00b6f7454ada 160 uint8_t * save_buff_addr = FrameBuffer_Video_B;
TetsuyaKonno 0:00b6f7454ada 161 static volatile int32_t vsync_count;
TetsuyaKonno 0:00b6f7454ada 162 static volatile int32_t vfield_count;
TetsuyaKonno 0:00b6f7454ada 163 static volatile int32_t vfield_count2 = 1;
TetsuyaKonno 0:00b6f7454ada 164 static volatile int32_t vfield_count2_buff;
TetsuyaKonno 0:00b6f7454ada 165
TetsuyaKonno 0:00b6f7454ada 166 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 167 //Global variable for Image process
TetsuyaKonno 0:00b6f7454ada 168 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 169 unsigned char ImageData_A[ ( ( PIXEL_HW * 2) * PIXEL_VW ) ];
TetsuyaKonno 0:00b6f7454ada 170 unsigned char ImageData_B[ ( PIXEL_HW * PIXEL_VW ) ];
TetsuyaKonno 0:00b6f7454ada 171 unsigned char ImageComp_B[ ( PIXEL_HW * PIXEL_VW ) ];
TetsuyaKonno 0:00b6f7454ada 172 unsigned char ImageBinary[ ( PIXEL_HW * PIXEL_VW ) ];
TetsuyaKonno 0:00b6f7454ada 173
TetsuyaKonno 0:00b6f7454ada 174 double Rate = 0.125; /* Reduction ratio */
TetsuyaKonno 0:00b6f7454ada 175
TetsuyaKonno 0:00b6f7454ada 176 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 177 //Global variable for Digital sensor function
TetsuyaKonno 0:00b6f7454ada 178 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 179 int SenError;
TetsuyaKonno 0:00b6f7454ada 180 int Sen1Px[5];
TetsuyaKonno 0:00b6f7454ada 181 unsigned char SenVal1;
TetsuyaKonno 0:00b6f7454ada 182
TetsuyaKonno 0:00b6f7454ada 183 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 184 //Global variable for Mark detection function
TetsuyaKonno 0:00b6f7454ada 185 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 186 ImagePartPattern RightCrank = {0,0,0,0,{0}, //percent, Point X, Point Y, Standard_Deviation, Deviation
TetsuyaKonno 0:00b6f7454ada 187 {0,0,0,0,0,0,0, //Binary image
TetsuyaKonno 0:00b6f7454ada 188 0,0,1,1,1,1,1, //Binary image
TetsuyaKonno 0:00b6f7454ada 189 0,0,1,1,1,0,0, //Binary image
TetsuyaKonno 0:00b6f7454ada 190 0,0,1,1,1,0,0},//Binary image
TetsuyaKonno 0:00b6f7454ada 191 7, 4}; //Binary Width pixel, Binary Height pixel
TetsuyaKonno 0:00b6f7454ada 192
TetsuyaKonno 0:00b6f7454ada 193 ImagePartPattern RightLaneChange = {0,0,0,0,{0},//percent, Point X, Point Y, Standard_Deviation, Deviation
TetsuyaKonno 0:00b6f7454ada 194 {0,0,0,1,1,0,0,0,0,0,0,0,0,0, //Binary image
TetsuyaKonno 0:00b6f7454ada 195 0,0,0,1,1,0,0,0,0,0,0,0,0,0, //Binary image
TetsuyaKonno 0:00b6f7454ada 196 0,0,0,1,1,0,0,0,0,0,0,0,0,0},//Binary image
TetsuyaKonno 0:00b6f7454ada 197 14, 3}; //Binary Width pixel, Binary Height pixel
TetsuyaKonno 0:00b6f7454ada 198
TetsuyaKonno 0:00b6f7454ada 199 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 200 //Global variable for Trace program
TetsuyaKonno 0:00b6f7454ada 201 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 202 volatile unsigned long cnt0; /* Used by timer function */
TetsuyaKonno 0:00b6f7454ada 203 volatile unsigned long cnt1; /* Used within main */
TetsuyaKonno 0:00b6f7454ada 204 volatile int pattern; /* Pattern numbers */
TetsuyaKonno 0:00b6f7454ada 205
TetsuyaKonno 0:00b6f7454ada 206 volatile int led_pattern; /* led_m_process function only */
TetsuyaKonno 0:00b6f7454ada 207 volatile int initFlag; /* Initialize flag */
TetsuyaKonno 0:00b6f7454ada 208 volatile int threshold_buff; /* Binarization function only */
TetsuyaKonno 0:00b6f7454ada 209 volatile int handle_buff; /* diff function only */
TetsuyaKonno 0:00b6f7454ada 210
TetsuyaKonno 0:00b6f7454ada 211 const int revolution_difference[] = { /* diff function only */
TetsuyaKonno 0:00b6f7454ada 212 100, 98, 97, 95, 93,
TetsuyaKonno 0:00b6f7454ada 213 92, 90, 88, 87, 85,
TetsuyaKonno 0:00b6f7454ada 214 84, 82, 81, 79, 78,
TetsuyaKonno 0:00b6f7454ada 215 76, 75, 73, 72, 71,
TetsuyaKonno 0:00b6f7454ada 216 69, 68, 66, 65, 64,
TetsuyaKonno 0:00b6f7454ada 217 62, 61, 59, 58, 57,
TetsuyaKonno 0:00b6f7454ada 218 55, 54, 52, 51, 50,
TetsuyaKonno 0:00b6f7454ada 219 48, 47, 45, 44, 42,
TetsuyaKonno 0:00b6f7454ada 220 41, 39, 38, 36, 35,
TetsuyaKonno 0:00b6f7454ada 221 33 };
TetsuyaKonno 0:00b6f7454ada 222
TetsuyaKonno 0:00b6f7454ada 223 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 224 // Main function
TetsuyaKonno 0:00b6f7454ada 225 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 226 int main( void )
TetsuyaKonno 0:00b6f7454ada 227 {
TetsuyaKonno 0:00b6f7454ada 228 volatile int Number; /* Serial Debug Mode only */
TetsuyaKonno 0:00b6f7454ada 229
TetsuyaKonno 0:00b6f7454ada 230 initFlag = 1; /* Initialization start */
TetsuyaKonno 0:00b6f7454ada 231
TetsuyaKonno 0:00b6f7454ada 232 /* Camera start */
TetsuyaKonno 0:00b6f7454ada 233 init_Camera();
TetsuyaKonno 0:00b6f7454ada 234 /* wait to stabilize NTSC signal (about 170ms) */
TetsuyaKonno 0:00b6f7454ada 235 wait(0.2);
TetsuyaKonno 0:00b6f7454ada 236
TetsuyaKonno 0:00b6f7454ada 237 /* Initialize MCU functions */
TetsuyaKonno 0:00b6f7454ada 238 init_MTU2_PWM_Motor();
TetsuyaKonno 0:00b6f7454ada 239 init_MTU2_PWM_Servo();
TetsuyaKonno 0:00b6f7454ada 240 interrput.attach(&intTimer, 0.001);
TetsuyaKonno 0:00b6f7454ada 241 pc.baud(230400);
TetsuyaKonno 0:00b6f7454ada 242
TetsuyaKonno 0:00b6f7454ada 243 /* Initialize Micon Car state */
TetsuyaKonno 0:00b6f7454ada 244 handle( 0 );
TetsuyaKonno 0:00b6f7454ada 245 motor( 0, 0 );
TetsuyaKonno 0:00b6f7454ada 246 led_out( 0x0 );
TetsuyaKonno 0:00b6f7454ada 247 led_m_set( STOP );
TetsuyaKonno 0:00b6f7454ada 248
TetsuyaKonno 0:00b6f7454ada 249 threshold_buff = THRESHOLD;
TetsuyaKonno 0:00b6f7454ada 250
TetsuyaKonno 0:00b6f7454ada 251 wait(0.5);
TetsuyaKonno 0:00b6f7454ada 252
TetsuyaKonno 0:00b6f7454ada 253 /* Initialize Digital sensor */
TetsuyaKonno 0:00b6f7454ada 254 SenError = init_sensor( ImageBinary, (PIXEL_HW * Rate), (PIXEL_VW * Rate), (PIXEL_HW * Rate) / 2, Sen1Px, 12 );
TetsuyaKonno 0:00b6f7454ada 255 if( SenError !=0 ) {
TetsuyaKonno 0:00b6f7454ada 256 led_m_set( ERROR );
TetsuyaKonno 0:00b6f7454ada 257 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 258 while( cnt1 < 3000 ){
TetsuyaKonno 0:00b6f7454ada 259 if( cnt1 % 200 < 100 ) {
TetsuyaKonno 0:00b6f7454ada 260 led_out( 0x3 );
TetsuyaKonno 0:00b6f7454ada 261 } else {
TetsuyaKonno 0:00b6f7454ada 262 led_out( 0x0 );
TetsuyaKonno 0:00b6f7454ada 263 }
TetsuyaKonno 0:00b6f7454ada 264 }
TetsuyaKonno 0:00b6f7454ada 265 }
TetsuyaKonno 0:00b6f7454ada 266
TetsuyaKonno 0:00b6f7454ada 267 /* Initialize Pattern Matching */
TetsuyaKonno 0:00b6f7454ada 268 RightCrank.sdevi = Standard_Deviation( RightCrank.binary, RightCrank.devi, RightCrank.w, RightCrank.h );
TetsuyaKonno 0:00b6f7454ada 269 RightLaneChange.sdevi = Standard_Deviation( RightLaneChange.binary, RightLaneChange.devi, RightLaneChange.w, RightLaneChange.h );
TetsuyaKonno 0:00b6f7454ada 270
TetsuyaKonno 0:00b6f7454ada 271 initFlag = 0; /* Initialization end */
TetsuyaKonno 0:00b6f7454ada 272
TetsuyaKonno 0:00b6f7454ada 273 /* Debug Program */
TetsuyaKonno 0:00b6f7454ada 274 if( user_button_get() ) {
TetsuyaKonno 0:00b6f7454ada 275 led_m_set( DEBUG );
TetsuyaKonno 0:00b6f7454ada 276 wait(0.1);//ON Time
TetsuyaKonno 0:00b6f7454ada 277 while( user_button_get() );
TetsuyaKonno 0:00b6f7454ada 278 wait(0.5);//OFF Time
TetsuyaKonno 0:00b6f7454ada 279 while( 1 ){
TetsuyaKonno 0:00b6f7454ada 280 pc.printf( "Serial Debug Mode Ver1.0 (2018.10.30)\n\r" );
TetsuyaKonno 0:00b6f7454ada 281 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 282 pc.printf( "0:TeraTram Real-time display 20* 15pixel (Binary)\n\r" );
TetsuyaKonno 0:00b6f7454ada 283 pc.printf( "1:Excel(csv) 160*120pixel\n\r" );
TetsuyaKonno 0:00b6f7454ada 284 pc.printf( "2:Excel(csv) 20* 15pixel\n\r" );
TetsuyaKonno 0:00b6f7454ada 285 pc.printf( "3:Excel(csv) 160*120pixel -> csv_jpg_convert.bat (color)\n\r" );
TetsuyaKonno 0:00b6f7454ada 286 pc.printf( "4:Excel(csv) 160*120pixel -> csv_jpg_convert.bat (grey scale)\n\r" );
TetsuyaKonno 0:00b6f7454ada 287 pc.printf( "5:Excel(csv) 20* 15pixel -> csv_jpg_convert.bat (binary)\n\r" );
TetsuyaKonno 0:00b6f7454ada 288 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 289 pc.printf( "Please Number\n\r" );
TetsuyaKonno 0:00b6f7454ada 290 pc.printf( "No = " );
TetsuyaKonno 0:00b6f7454ada 291 pc.scanf( "%d", &Number );
TetsuyaKonno 0:00b6f7454ada 292 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 293 pc.printf( "Please push the SW ( on the Motor drive board )\n\r" );
TetsuyaKonno 0:00b6f7454ada 294 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 295 while( !pushsw_get() );
TetsuyaKonno 0:00b6f7454ada 296
TetsuyaKonno 0:00b6f7454ada 297 switch( Number ) {
TetsuyaKonno 0:00b6f7454ada 298 case 0:
TetsuyaKonno 0:00b6f7454ada 299 /* for TeraTerm(Real-time display) */
TetsuyaKonno 0:00b6f7454ada 300 while( 1 ) {
TetsuyaKonno 0:00b6f7454ada 301 ImageData_Serial_Out2( ImageBinary, (PIXEL_HW * Rate), (PIXEL_VW * Rate) );
TetsuyaKonno 0:00b6f7454ada 302 }
TetsuyaKonno 0:00b6f7454ada 303 break;
TetsuyaKonno 0:00b6f7454ada 304 case 1:
TetsuyaKonno 0:00b6f7454ada 305 /* for the Excel(csv) 160*120pixel */
TetsuyaKonno 0:00b6f7454ada 306 ImageData_Serial_Out1( ImageData_B, PIXEL_HW, PIXEL_VW );
TetsuyaKonno 0:00b6f7454ada 307 break;
TetsuyaKonno 0:00b6f7454ada 308 case 2:
TetsuyaKonno 0:00b6f7454ada 309 /* for the Excel(csv) 20* 15pixel */
TetsuyaKonno 0:00b6f7454ada 310 ImageData_Serial_Out1( ImageComp_B, (PIXEL_HW * Rate), (PIXEL_VW * Rate) );
TetsuyaKonno 0:00b6f7454ada 311 break;
TetsuyaKonno 0:00b6f7454ada 312 case 3:
TetsuyaKonno 0:00b6f7454ada 313 /* for the Excel(csv) -> csv_jpg_convert.bat */
TetsuyaKonno 0:00b6f7454ada 314 ChangeFrameBuffer();
TetsuyaKonno 0:00b6f7454ada 315 ImageData_Serial_Out3( save_buff_addr, PIXEL_HW, PIXEL_VW, COLOR );
TetsuyaKonno 0:00b6f7454ada 316 break;
TetsuyaKonno 0:00b6f7454ada 317 case 4:
TetsuyaKonno 0:00b6f7454ada 318 /* for the Excel(csv) -> csv_jpg_convert.bat */
TetsuyaKonno 0:00b6f7454ada 319 ImageData_Serial_Out3( ImageData_B, PIXEL_HW, PIXEL_VW, GREY_SCALE );
TetsuyaKonno 0:00b6f7454ada 320 break;
TetsuyaKonno 0:00b6f7454ada 321 case 5:
TetsuyaKonno 0:00b6f7454ada 322 /* for the Excel(csv) -> csv_jpg_convert.bat */
TetsuyaKonno 0:00b6f7454ada 323 ImageData_Serial_Out3( ImageBinary, (PIXEL_HW * Rate), (PIXEL_VW * Rate), BINARY );
TetsuyaKonno 0:00b6f7454ada 324 break;
TetsuyaKonno 0:00b6f7454ada 325 default:
TetsuyaKonno 0:00b6f7454ada 326 break;
TetsuyaKonno 0:00b6f7454ada 327 }
TetsuyaKonno 0:00b6f7454ada 328 led_m_set( STOP );
TetsuyaKonno 0:00b6f7454ada 329 while(1);
TetsuyaKonno 0:00b6f7454ada 330 }
TetsuyaKonno 0:00b6f7454ada 331 }
TetsuyaKonno 0:00b6f7454ada 332
TetsuyaKonno 0:00b6f7454ada 333 /* Trace program */
TetsuyaKonno 0:00b6f7454ada 334 led_m_set( RUN );
TetsuyaKonno 0:00b6f7454ada 335
TetsuyaKonno 0:00b6f7454ada 336 while( 1 ) {
TetsuyaKonno 0:00b6f7454ada 337
TetsuyaKonno 0:00b6f7454ada 338 switch( pattern ) {
TetsuyaKonno 0:00b6f7454ada 339 /*****************************************************************
TetsuyaKonno 0:00b6f7454ada 340 About patern
TetsuyaKonno 0:00b6f7454ada 341 0:wait for switch input
TetsuyaKonno 0:00b6f7454ada 342 1:check if start bar is open
TetsuyaKonno 0:00b6f7454ada 343 11:normal trace
TetsuyaKonno 0:00b6f7454ada 344 12:Left side
TetsuyaKonno 0:00b6f7454ada 345 13:right side
TetsuyaKonno 0:00b6f7454ada 346 *****************************************************************/
TetsuyaKonno 0:00b6f7454ada 347 case 0:
TetsuyaKonno 0:00b6f7454ada 348 /* wait for switch input */
TetsuyaKonno 0:00b6f7454ada 349 if( pushsw_get() ) {
TetsuyaKonno 0:00b6f7454ada 350 led_out( 0x0 );
TetsuyaKonno 0:00b6f7454ada 351 led_m_set( RUN );
TetsuyaKonno 0:00b6f7454ada 352 pattern = 11;
TetsuyaKonno 0:00b6f7454ada 353 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 354 break;
TetsuyaKonno 0:00b6f7454ada 355 }
TetsuyaKonno 0:00b6f7454ada 356 if( cnt1 < 100 ) {
TetsuyaKonno 0:00b6f7454ada 357 led_out( 0x1 );
TetsuyaKonno 0:00b6f7454ada 358 } else if( cnt1 < 200 ) {
TetsuyaKonno 0:00b6f7454ada 359 led_out( 0x2 );
TetsuyaKonno 0:00b6f7454ada 360 } else {
TetsuyaKonno 0:00b6f7454ada 361 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 362 }
TetsuyaKonno 0:00b6f7454ada 363 break;
TetsuyaKonno 0:00b6f7454ada 364
TetsuyaKonno 0:00b6f7454ada 365 case 11:
TetsuyaKonno 0:00b6f7454ada 366 /* normal trace */
TetsuyaKonno 0:00b6f7454ada 367 if( RightCrankCheck( 85 ) ) { /* Right Crank Check */
TetsuyaKonno 0:00b6f7454ada 368 pattern = 31;
TetsuyaKonno 0:00b6f7454ada 369 break;
TetsuyaKonno 0:00b6f7454ada 370 }
TetsuyaKonno 0:00b6f7454ada 371 if( RightLaneChangeCheck( 85 ) ) { /* Right Lane Change Check */
TetsuyaKonno 0:00b6f7454ada 372 pattern = 51;
TetsuyaKonno 0:00b6f7454ada 373 break;
TetsuyaKonno 0:00b6f7454ada 374 }
TetsuyaKonno 0:00b6f7454ada 375 switch( (sensor_inp()&0x0f) ) {
TetsuyaKonno 0:00b6f7454ada 376 case 0x00:
TetsuyaKonno 0:00b6f7454ada 377 handle( 0 );
TetsuyaKonno 0:00b6f7454ada 378 motor( 100, 100 );
TetsuyaKonno 0:00b6f7454ada 379 break;
TetsuyaKonno 0:00b6f7454ada 380 case 0x02:
TetsuyaKonno 0:00b6f7454ada 381 handle( 3 );
TetsuyaKonno 0:00b6f7454ada 382 motor( 100, diff(100) );
TetsuyaKonno 0:00b6f7454ada 383 break;
TetsuyaKonno 0:00b6f7454ada 384 case 0x03:
TetsuyaKonno 0:00b6f7454ada 385 handle( 12 );
TetsuyaKonno 0:00b6f7454ada 386 motor( 100, diff(100) );
TetsuyaKonno 0:00b6f7454ada 387 break;
TetsuyaKonno 0:00b6f7454ada 388 case 0x01:
TetsuyaKonno 0:00b6f7454ada 389 handle( 20 );
TetsuyaKonno 0:00b6f7454ada 390 motor( 100, diff(100) );
TetsuyaKonno 0:00b6f7454ada 391 pattern = 12;
TetsuyaKonno 0:00b6f7454ada 392 break;
TetsuyaKonno 0:00b6f7454ada 393 case 0x04:
TetsuyaKonno 0:00b6f7454ada 394 handle( -3 );
TetsuyaKonno 0:00b6f7454ada 395 motor( diff(100), 100 );
TetsuyaKonno 0:00b6f7454ada 396 break;
TetsuyaKonno 0:00b6f7454ada 397 case 0x0c:
TetsuyaKonno 0:00b6f7454ada 398 handle( -12 );
TetsuyaKonno 0:00b6f7454ada 399 motor( diff(100), 100 );
TetsuyaKonno 0:00b6f7454ada 400 break;
TetsuyaKonno 0:00b6f7454ada 401 case 0x08:
TetsuyaKonno 0:00b6f7454ada 402 handle( -20 );
TetsuyaKonno 0:00b6f7454ada 403 motor( diff(100), 100 );
TetsuyaKonno 0:00b6f7454ada 404 pattern = 13;
TetsuyaKonno 0:00b6f7454ada 405 break;
TetsuyaKonno 0:00b6f7454ada 406 default:
TetsuyaKonno 0:00b6f7454ada 407 break;
TetsuyaKonno 0:00b6f7454ada 408 }
TetsuyaKonno 0:00b6f7454ada 409 break;
TetsuyaKonno 0:00b6f7454ada 410
TetsuyaKonno 0:00b6f7454ada 411 case 12:
TetsuyaKonno 0:00b6f7454ada 412 /* Left side */
TetsuyaKonno 0:00b6f7454ada 413 if( (sensor_inp()&0x02) == 0x02 ) {
TetsuyaKonno 0:00b6f7454ada 414 pattern = 11;
TetsuyaKonno 0:00b6f7454ada 415 break;
TetsuyaKonno 0:00b6f7454ada 416 }
TetsuyaKonno 0:00b6f7454ada 417 switch( (sensor_inp()&0x0f) ) {
TetsuyaKonno 0:00b6f7454ada 418 case 0x01:
TetsuyaKonno 0:00b6f7454ada 419 handle( 20 );
TetsuyaKonno 0:00b6f7454ada 420 motor( 100, diff(100) );
TetsuyaKonno 0:00b6f7454ada 421 break;
TetsuyaKonno 0:00b6f7454ada 422 case 0x00:
TetsuyaKonno 0:00b6f7454ada 423 case 0x08:
TetsuyaKonno 0:00b6f7454ada 424 case 0x0c:
TetsuyaKonno 0:00b6f7454ada 425 handle( 22 );
TetsuyaKonno 0:00b6f7454ada 426 motor( 100, diff(100) );
TetsuyaKonno 0:00b6f7454ada 427 break;
TetsuyaKonno 0:00b6f7454ada 428 default:
TetsuyaKonno 0:00b6f7454ada 429 break;
TetsuyaKonno 0:00b6f7454ada 430 }
TetsuyaKonno 0:00b6f7454ada 431 break;
TetsuyaKonno 0:00b6f7454ada 432
TetsuyaKonno 0:00b6f7454ada 433 case 13:
TetsuyaKonno 0:00b6f7454ada 434 /* right side */
TetsuyaKonno 0:00b6f7454ada 435 if( (sensor_inp()&0x04) == 0x04 ) {
TetsuyaKonno 0:00b6f7454ada 436 pattern = 11;
TetsuyaKonno 0:00b6f7454ada 437 }
TetsuyaKonno 0:00b6f7454ada 438 switch( (sensor_inp()&0x0f) ) {
TetsuyaKonno 0:00b6f7454ada 439 case 0x08:
TetsuyaKonno 0:00b6f7454ada 440 handle( -20 );
TetsuyaKonno 0:00b6f7454ada 441 motor( diff(100), 100 );
TetsuyaKonno 0:00b6f7454ada 442 break;
TetsuyaKonno 0:00b6f7454ada 443 case 0x00:
TetsuyaKonno 0:00b6f7454ada 444 case 0x01:
TetsuyaKonno 0:00b6f7454ada 445 case 0x03:
TetsuyaKonno 0:00b6f7454ada 446 handle( -22 );
TetsuyaKonno 0:00b6f7454ada 447 motor( diff(100), 100 );
TetsuyaKonno 0:00b6f7454ada 448 break;
TetsuyaKonno 0:00b6f7454ada 449 default:
TetsuyaKonno 0:00b6f7454ada 450 break;
TetsuyaKonno 0:00b6f7454ada 451 }
TetsuyaKonno 0:00b6f7454ada 452 break;
TetsuyaKonno 0:00b6f7454ada 453
TetsuyaKonno 0:00b6f7454ada 454 case 31:
TetsuyaKonno 0:00b6f7454ada 455 /* Right crank processing at 1st process */
TetsuyaKonno 0:00b6f7454ada 456 led_m_set( CRANK );
TetsuyaKonno 0:00b6f7454ada 457 led_out( 0x1 );
TetsuyaKonno 0:00b6f7454ada 458 handle( 0 );
TetsuyaKonno 0:00b6f7454ada 459 motor2( 0 ,0 );
TetsuyaKonno 0:00b6f7454ada 460 pattern = 32;
TetsuyaKonno 0:00b6f7454ada 461 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 462 break;
TetsuyaKonno 0:00b6f7454ada 463
TetsuyaKonno 0:00b6f7454ada 464 case 32:
TetsuyaKonno 0:00b6f7454ada 465 /* Right crank processing at 2nd process */
TetsuyaKonno 0:00b6f7454ada 466 if( cnt1 > 300 ) {
TetsuyaKonno 0:00b6f7454ada 467 pattern = 33;
TetsuyaKonno 0:00b6f7454ada 468 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 469 }
TetsuyaKonno 0:00b6f7454ada 470 break;
TetsuyaKonno 0:00b6f7454ada 471
TetsuyaKonno 0:00b6f7454ada 472 case 33:
TetsuyaKonno 0:00b6f7454ada 473 /* Right crank processing at 3rd process */
TetsuyaKonno 0:00b6f7454ada 474 if( ( center_inp() == 0 ) && ( (sensor_inp()&0x0f) == 0x00 ) ) {
TetsuyaKonno 0:00b6f7454ada 475 handle( 41 );
TetsuyaKonno 0:00b6f7454ada 476 motor2( 50 ,10 );
TetsuyaKonno 0:00b6f7454ada 477 pattern = 34;
TetsuyaKonno 0:00b6f7454ada 478 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 479 break;
TetsuyaKonno 0:00b6f7454ada 480 }
TetsuyaKonno 0:00b6f7454ada 481 switch( (sensor_inp()&0x0f) ) {
TetsuyaKonno 0:00b6f7454ada 482 case 0x00:
TetsuyaKonno 0:00b6f7454ada 483 /* Center -> straight */
TetsuyaKonno 0:00b6f7454ada 484 handle( 0 );
TetsuyaKonno 0:00b6f7454ada 485 motor2( 30 ,30 );
TetsuyaKonno 0:00b6f7454ada 486 break;
TetsuyaKonno 0:00b6f7454ada 487 case 0x02:
TetsuyaKonno 0:00b6f7454ada 488 /* Left of center -> turn to right */
TetsuyaKonno 0:00b6f7454ada 489 handle( 5 );
TetsuyaKonno 0:00b6f7454ada 490 motor2( 30 ,diff(30) );
TetsuyaKonno 0:00b6f7454ada 491 break;
TetsuyaKonno 0:00b6f7454ada 492 case 0x04:
TetsuyaKonno 0:00b6f7454ada 493 /* Right of center -> turn to left */
TetsuyaKonno 0:00b6f7454ada 494 handle( -5 );
TetsuyaKonno 0:00b6f7454ada 495 motor2( diff(30) ,30 );
TetsuyaKonno 0:00b6f7454ada 496 break;
TetsuyaKonno 0:00b6f7454ada 497 default:
TetsuyaKonno 0:00b6f7454ada 498 break;
TetsuyaKonno 0:00b6f7454ada 499 }
TetsuyaKonno 0:00b6f7454ada 500 break;
TetsuyaKonno 0:00b6f7454ada 501
TetsuyaKonno 0:00b6f7454ada 502 case 34:
TetsuyaKonno 0:00b6f7454ada 503 /* Right crank clearing processing - wait until stable */
TetsuyaKonno 0:00b6f7454ada 504 if( cnt1 > 800 ) {
TetsuyaKonno 0:00b6f7454ada 505 pattern = 35;
TetsuyaKonno 0:00b6f7454ada 506 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 507 }
TetsuyaKonno 0:00b6f7454ada 508 break;
TetsuyaKonno 0:00b6f7454ada 509
TetsuyaKonno 0:00b6f7454ada 510 case 35:
TetsuyaKonno 0:00b6f7454ada 511 /* Right crank clearing processing - check end of turn */
TetsuyaKonno 0:00b6f7454ada 512 if( (sensor_inp()&0x02) == 0x02 ) {
TetsuyaKonno 0:00b6f7454ada 513 led_out( 0x0 );
TetsuyaKonno 0:00b6f7454ada 514 led_m_set( RUN );
TetsuyaKonno 0:00b6f7454ada 515 pattern = 11;
TetsuyaKonno 0:00b6f7454ada 516 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 517 }
TetsuyaKonno 0:00b6f7454ada 518 break;
TetsuyaKonno 0:00b6f7454ada 519
TetsuyaKonno 0:00b6f7454ada 520 case 51:
TetsuyaKonno 0:00b6f7454ada 521 /* Right lane change processing at 1st process */
TetsuyaKonno 0:00b6f7454ada 522 led_m_set( LCHANGE );
TetsuyaKonno 0:00b6f7454ada 523 led_out( 0x01 );
TetsuyaKonno 0:00b6f7454ada 524 handle( 0 );
TetsuyaKonno 0:00b6f7454ada 525 motor2( 0 ,0 );
TetsuyaKonno 0:00b6f7454ada 526 pattern = 52;
TetsuyaKonno 0:00b6f7454ada 527 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 528 break;
TetsuyaKonno 0:00b6f7454ada 529
TetsuyaKonno 0:00b6f7454ada 530 case 52:
TetsuyaKonno 0:00b6f7454ada 531 /* Right lane change processing at 2nd process */
TetsuyaKonno 0:00b6f7454ada 532 if( cnt1 > 300 ) {
TetsuyaKonno 0:00b6f7454ada 533 pattern = 53;
TetsuyaKonno 0:00b6f7454ada 534 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 535 break;
TetsuyaKonno 0:00b6f7454ada 536 }
TetsuyaKonno 0:00b6f7454ada 537 break;
TetsuyaKonno 0:00b6f7454ada 538
TetsuyaKonno 0:00b6f7454ada 539 case 53:
TetsuyaKonno 0:00b6f7454ada 540 /* Right lane change processing at 3rd process */
TetsuyaKonno 0:00b6f7454ada 541 if( ( center_inp() == 0 ) && ( (sensor_inp()&0x0f) == 0x00 ) ) {
TetsuyaKonno 0:00b6f7454ada 542 handle( 20 );
TetsuyaKonno 0:00b6f7454ada 543 motor2( 30 ,diff(30) );
TetsuyaKonno 0:00b6f7454ada 544 pattern = 54;
TetsuyaKonno 0:00b6f7454ada 545 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 546 break;
TetsuyaKonno 0:00b6f7454ada 547 }
TetsuyaKonno 0:00b6f7454ada 548 switch( (sensor_inp()&0x0f) ) {
TetsuyaKonno 0:00b6f7454ada 549 case 0x00:
TetsuyaKonno 0:00b6f7454ada 550 /* Center -> straight */
TetsuyaKonno 0:00b6f7454ada 551 handle( 0 );
TetsuyaKonno 0:00b6f7454ada 552 motor2( 30 ,30 );
TetsuyaKonno 0:00b6f7454ada 553 break;
TetsuyaKonno 0:00b6f7454ada 554 case 0x02:
TetsuyaKonno 0:00b6f7454ada 555 /* Left of center -> turn to right */
TetsuyaKonno 0:00b6f7454ada 556 handle( 5 );
TetsuyaKonno 0:00b6f7454ada 557 motor2( 30 ,diff(30) );
TetsuyaKonno 0:00b6f7454ada 558 break;
TetsuyaKonno 0:00b6f7454ada 559 case 0x04:
TetsuyaKonno 0:00b6f7454ada 560 /* Right of center -> turn to left */
TetsuyaKonno 0:00b6f7454ada 561 handle( -5 );
TetsuyaKonno 0:00b6f7454ada 562 motor2( diff(30) ,30 );
TetsuyaKonno 0:00b6f7454ada 563 break;
TetsuyaKonno 0:00b6f7454ada 564 default:
TetsuyaKonno 0:00b6f7454ada 565 break;
TetsuyaKonno 0:00b6f7454ada 566 }
TetsuyaKonno 0:00b6f7454ada 567 break;
TetsuyaKonno 0:00b6f7454ada 568
TetsuyaKonno 0:00b6f7454ada 569 case 54:
TetsuyaKonno 0:00b6f7454ada 570 /* Right lane change clearing processing - wait until stable */
TetsuyaKonno 0:00b6f7454ada 571 if( cnt1 > 800 ){
TetsuyaKonno 0:00b6f7454ada 572 pattern = 55;
TetsuyaKonno 0:00b6f7454ada 573 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 574 }
TetsuyaKonno 0:00b6f7454ada 575 break;
TetsuyaKonno 0:00b6f7454ada 576
TetsuyaKonno 0:00b6f7454ada 577 case 55:
TetsuyaKonno 0:00b6f7454ada 578 /* Right lane change end check */
TetsuyaKonno 0:00b6f7454ada 579 if( (sensor_inp()&0x04) == 0x04 ) {
TetsuyaKonno 0:00b6f7454ada 580 led_m_set( RUN );
TetsuyaKonno 0:00b6f7454ada 581 led_out( 0x0 );
TetsuyaKonno 0:00b6f7454ada 582 pattern = 11;
TetsuyaKonno 0:00b6f7454ada 583 cnt1 = 0;
TetsuyaKonno 0:00b6f7454ada 584 }
TetsuyaKonno 0:00b6f7454ada 585 break;
TetsuyaKonno 0:00b6f7454ada 586
TetsuyaKonno 0:00b6f7454ada 587 default:
TetsuyaKonno 0:00b6f7454ada 588 break;
TetsuyaKonno 0:00b6f7454ada 589 }
TetsuyaKonno 0:00b6f7454ada 590 }
TetsuyaKonno 0:00b6f7454ada 591 }
TetsuyaKonno 0:00b6f7454ada 592
TetsuyaKonno 0:00b6f7454ada 593 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 594 // Initialize functions
TetsuyaKonno 0:00b6f7454ada 595 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 596 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 597 //Initialize MTU2 PWM functions
TetsuyaKonno 0:00b6f7454ada 598 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 599 //MTU2_3, MTU2_4
TetsuyaKonno 0:00b6f7454ada 600 //Reset-Synchronized PWM mode
TetsuyaKonno 0:00b6f7454ada 601 //TIOC4A(P4_4) :Left-motor
TetsuyaKonno 0:00b6f7454ada 602 //TIOC4B(P4_5) :Right-motor
TetsuyaKonno 0:00b6f7454ada 603 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 604 void init_MTU2_PWM_Motor( void )
TetsuyaKonno 0:00b6f7454ada 605 {
TetsuyaKonno 0:00b6f7454ada 606 /* Port setting for S/W I/O Control */
TetsuyaKonno 0:00b6f7454ada 607 /* alternative mode */
TetsuyaKonno 0:00b6f7454ada 608
TetsuyaKonno 0:00b6f7454ada 609 /* MTU2_4 (P4_4)(P4_5) */
TetsuyaKonno 0:00b6f7454ada 610 GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/
TetsuyaKonno 0:00b6f7454ada 611 GPIOPFCAE4 &= 0xffcf; /* The alternative function of a pin */
TetsuyaKonno 0:00b6f7454ada 612 GPIOPFCE4 |= 0x0030; /* The alternative function of a pin */
TetsuyaKonno 0:00b6f7454ada 613 GPIOPFC4 &= 0xffcf; /* The alternative function of a pin */
TetsuyaKonno 0:00b6f7454ada 614 /* 2nd altemative function/output */
TetsuyaKonno 0:00b6f7454ada 615 GPIOP4 &= 0xffcf; /* */
TetsuyaKonno 0:00b6f7454ada 616 GPIOPM4 &= 0xffcf; /* p4_4,P4_5:output */
TetsuyaKonno 0:00b6f7454ada 617 GPIOPMC4 |= 0x0030; /* P4_4,P4_5:double */
TetsuyaKonno 0:00b6f7454ada 618
TetsuyaKonno 0:00b6f7454ada 619 /* Module stop 33(MTU2) canceling */
TetsuyaKonno 0:00b6f7454ada 620 CPGSTBCR3 &= 0xf7;
TetsuyaKonno 0:00b6f7454ada 621
TetsuyaKonno 0:00b6f7454ada 622 /* MTU2_3 and MTU2_4 (Motor PWM) */
TetsuyaKonno 0:00b6f7454ada 623 MTU2TCR_3 = 0x20; /* TCNT Clear(TGRA), P0φ/1 */
TetsuyaKonno 0:00b6f7454ada 624 MTU2TOCR1 = 0x04; /* */
TetsuyaKonno 0:00b6f7454ada 625 MTU2TOCR2 = 0x40; /* N L>H P H>L */
TetsuyaKonno 0:00b6f7454ada 626 MTU2TMDR_3 = 0x38; /* Buff:ON Reset-Synchronized PWM mode */
TetsuyaKonno 0:00b6f7454ada 627 MTU2TMDR_4 = 0x30; /* Buff:ON */
TetsuyaKonno 0:00b6f7454ada 628 MTU2TOER = 0xc6; /* TIOC3B,4A,4B enabled output */
TetsuyaKonno 0:00b6f7454ada 629 MTU2TCNT_3 = MTU2TCNT_4 = 0; /* TCNT3,TCNT4 Set 0 */
TetsuyaKonno 0:00b6f7454ada 630 MTU2TGRA_3 = MTU2TGRC_3 = MOTOR_PWM_CYCLE;
TetsuyaKonno 0:00b6f7454ada 631 /* PWM-Cycle(1ms) */
TetsuyaKonno 0:00b6f7454ada 632 MTU2TGRA_4 = MTU2TGRC_4 = 0; /* Left-motor(P4_4) */
TetsuyaKonno 0:00b6f7454ada 633 MTU2TGRB_4 = MTU2TGRD_4 = 0; /* Right-motor(P4_5) */
TetsuyaKonno 0:00b6f7454ada 634 MTU2TSTR |= 0x40; /* TCNT_4 Start */
TetsuyaKonno 0:00b6f7454ada 635 }
TetsuyaKonno 0:00b6f7454ada 636
TetsuyaKonno 0:00b6f7454ada 637 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 638 //Initialize MTU2 PWM functions
TetsuyaKonno 0:00b6f7454ada 639 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 640 //MTU2_0
TetsuyaKonno 0:00b6f7454ada 641 //PWM mode 1
TetsuyaKonno 0:00b6f7454ada 642 //TIOC0A(P4_0) :Servo-motor
TetsuyaKonno 0:00b6f7454ada 643 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 644 void init_MTU2_PWM_Servo( void )
TetsuyaKonno 0:00b6f7454ada 645 {
TetsuyaKonno 0:00b6f7454ada 646 /* Port setting for S/W I/O Control */
TetsuyaKonno 0:00b6f7454ada 647 /* alternative mode */
TetsuyaKonno 0:00b6f7454ada 648
TetsuyaKonno 0:00b6f7454ada 649 /* MTU2_0 (P4_0) */
TetsuyaKonno 0:00b6f7454ada 650 GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/
TetsuyaKonno 0:00b6f7454ada 651 GPIOPFCAE4 &= 0xfffe; /* The alternative function of a pin */
TetsuyaKonno 0:00b6f7454ada 652 GPIOPFCE4 &= 0xfffe; /* The alternative function of a pin */
TetsuyaKonno 0:00b6f7454ada 653 GPIOPFC4 |= 0x0001; /* The alternative function of a pin */
TetsuyaKonno 0:00b6f7454ada 654 /* 2nd alternative function/output */
TetsuyaKonno 0:00b6f7454ada 655 GPIOP4 &= 0xfffe; /* */
TetsuyaKonno 0:00b6f7454ada 656 GPIOPM4 &= 0xfffe; /* p4_0:output */
TetsuyaKonno 0:00b6f7454ada 657 GPIOPMC4 |= 0x0001; /* P4_0:double */
TetsuyaKonno 0:00b6f7454ada 658
TetsuyaKonno 0:00b6f7454ada 659 /* Module stop 33(MTU2) canceling */
TetsuyaKonno 0:00b6f7454ada 660 CPGSTBCR3 &= 0xf7;
TetsuyaKonno 0:00b6f7454ada 661
TetsuyaKonno 0:00b6f7454ada 662 /* MTU2_0 (Motor PWM) */
TetsuyaKonno 0:00b6f7454ada 663 MTU2TCR_0 = 0x22; /* TCNT Clear(TGRA), P0φ/16 */
TetsuyaKonno 0:00b6f7454ada 664 MTU2TIORH_0 = 0x52; /* TGRA L>H, TGRB H>L */
TetsuyaKonno 0:00b6f7454ada 665 MTU2TMDR_0 = 0x32; /* TGRC and TGRD = Buff-mode*/
TetsuyaKonno 0:00b6f7454ada 666 /* PWM-mode1 */
TetsuyaKonno 0:00b6f7454ada 667 MTU2TCNT_0 = 0; /* TCNT0 Set 0 */
TetsuyaKonno 0:00b6f7454ada 668 MTU2TGRA_0 = MTU2TGRC_0 = SERVO_PWM_CYCLE;
TetsuyaKonno 0:00b6f7454ada 669 /* PWM-Cycle(16ms) */
TetsuyaKonno 0:00b6f7454ada 670 MTU2TGRB_0 = MTU2TGRD_0 = 0; /* Servo-motor(P4_0) */
TetsuyaKonno 0:00b6f7454ada 671 MTU2TSTR |= 0x01; /* TCNT_0 Start */
TetsuyaKonno 0:00b6f7454ada 672 }
TetsuyaKonno 0:00b6f7454ada 673
TetsuyaKonno 0:00b6f7454ada 674 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 675 //Initialize Camera function
TetsuyaKonno 0:00b6f7454ada 676 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 677 void init_Camera( void )
TetsuyaKonno 0:00b6f7454ada 678 {
TetsuyaKonno 0:00b6f7454ada 679 /* NTSC-Video */
TetsuyaKonno 0:00b6f7454ada 680 DisplayBase::graphics_error_t error;
TetsuyaKonno 0:00b6f7454ada 681
TetsuyaKonno 0:00b6f7454ada 682 /* Graphics initialization process */
TetsuyaKonno 0:00b6f7454ada 683 error = Display.Graphics_init(NULL);
TetsuyaKonno 0:00b6f7454ada 684 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 685 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 686 while (1);
TetsuyaKonno 0:00b6f7454ada 687 }
TetsuyaKonno 0:00b6f7454ada 688
TetsuyaKonno 0:00b6f7454ada 689 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
TetsuyaKonno 0:00b6f7454ada 690 if( error != DisplayBase::GRAPHICS_OK ) {
TetsuyaKonno 0:00b6f7454ada 691 while(1);
TetsuyaKonno 0:00b6f7454ada 692 }
TetsuyaKonno 0:00b6f7454ada 693
TetsuyaKonno 0:00b6f7454ada 694 /* Interrupt callback function setting (Vsync signal input to scaler 0) */
TetsuyaKonno 0:00b6f7454ada 695 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VI_VSYNC, 0, IntCallbackFunc_Vsync);
TetsuyaKonno 0:00b6f7454ada 696 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 697 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 698 while (1);
TetsuyaKonno 0:00b6f7454ada 699 }
TetsuyaKonno 0:00b6f7454ada 700
TetsuyaKonno 0:00b6f7454ada 701 /* Video capture setting (progressive form fixed) */
TetsuyaKonno 0:00b6f7454ada 702 error = Display.Video_Write_Setting(
TetsuyaKonno 0:00b6f7454ada 703 VIDEO_INPUT_CH,
TetsuyaKonno 0:00b6f7454ada 704 DisplayBase::COL_SYS_NTSC_358,
TetsuyaKonno 0:00b6f7454ada 705 write_buff_addr,
TetsuyaKonno 0:00b6f7454ada 706 VIDEO_BUFFER_STRIDE,
TetsuyaKonno 0:00b6f7454ada 707 DisplayBase::VIDEO_FORMAT_YCBCR422,
TetsuyaKonno 0:00b6f7454ada 708 DisplayBase::WR_RD_WRSWA_32_16BIT,
TetsuyaKonno 0:00b6f7454ada 709 PIXEL_VW,
TetsuyaKonno 0:00b6f7454ada 710 PIXEL_HW
TetsuyaKonno 0:00b6f7454ada 711 );
TetsuyaKonno 0:00b6f7454ada 712 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 713 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 714 while (1);
TetsuyaKonno 0:00b6f7454ada 715 }
TetsuyaKonno 0:00b6f7454ada 716
TetsuyaKonno 0:00b6f7454ada 717 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
TetsuyaKonno 0:00b6f7454ada 718 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield);
TetsuyaKonno 0:00b6f7454ada 719 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 720 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 721 while (1);
TetsuyaKonno 0:00b6f7454ada 722 }
TetsuyaKonno 0:00b6f7454ada 723
TetsuyaKonno 0:00b6f7454ada 724 /* Video write process start */
TetsuyaKonno 0:00b6f7454ada 725 error = Display.Video_Start (VIDEO_INPUT_CH);
TetsuyaKonno 0:00b6f7454ada 726 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 727 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 728 while (1);
TetsuyaKonno 0:00b6f7454ada 729 }
TetsuyaKonno 0:00b6f7454ada 730
TetsuyaKonno 0:00b6f7454ada 731 /* Video write process stop */
TetsuyaKonno 0:00b6f7454ada 732 error = Display.Video_Stop (VIDEO_INPUT_CH);
TetsuyaKonno 0:00b6f7454ada 733 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 734 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 735 while (1);
TetsuyaKonno 0:00b6f7454ada 736 }
TetsuyaKonno 0:00b6f7454ada 737
TetsuyaKonno 0:00b6f7454ada 738 /* Video write process start */
TetsuyaKonno 0:00b6f7454ada 739 error = Display.Video_Start (VIDEO_INPUT_CH);
TetsuyaKonno 0:00b6f7454ada 740 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 741 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 742 while (1);
TetsuyaKonno 0:00b6f7454ada 743 }
TetsuyaKonno 0:00b6f7454ada 744
TetsuyaKonno 0:00b6f7454ada 745 /* Wait vsync to update resister */
TetsuyaKonno 0:00b6f7454ada 746 WaitVsync(1);
TetsuyaKonno 0:00b6f7454ada 747
TetsuyaKonno 0:00b6f7454ada 748 /* Wait 2 Vfield(Top or bottom field) */
TetsuyaKonno 0:00b6f7454ada 749 WaitVfield(2);
TetsuyaKonno 0:00b6f7454ada 750 }
TetsuyaKonno 0:00b6f7454ada 751
TetsuyaKonno 0:00b6f7454ada 752 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 753 //ChangeFrameBuffer function
TetsuyaKonno 0:00b6f7454ada 754 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 755 void ChangeFrameBuffer( void )
TetsuyaKonno 0:00b6f7454ada 756 {
TetsuyaKonno 0:00b6f7454ada 757 /* NTSC-Video */
TetsuyaKonno 0:00b6f7454ada 758 DisplayBase::graphics_error_t error;
TetsuyaKonno 0:00b6f7454ada 759
TetsuyaKonno 0:00b6f7454ada 760 /* Change write buffer */
TetsuyaKonno 0:00b6f7454ada 761 if (write_buff_addr == FrameBuffer_Video_A) {
TetsuyaKonno 0:00b6f7454ada 762 write_buff_addr = FrameBuffer_Video_B;
TetsuyaKonno 0:00b6f7454ada 763 save_buff_addr = FrameBuffer_Video_A;
TetsuyaKonno 0:00b6f7454ada 764 } else {
TetsuyaKonno 0:00b6f7454ada 765 write_buff_addr = FrameBuffer_Video_A;
TetsuyaKonno 0:00b6f7454ada 766 save_buff_addr = FrameBuffer_Video_B;
TetsuyaKonno 0:00b6f7454ada 767 }
TetsuyaKonno 0:00b6f7454ada 768 error = Display.Video_Write_Change(
TetsuyaKonno 0:00b6f7454ada 769 VIDEO_INPUT_CH,
TetsuyaKonno 0:00b6f7454ada 770 write_buff_addr,
TetsuyaKonno 0:00b6f7454ada 771 VIDEO_BUFFER_STRIDE);
TetsuyaKonno 0:00b6f7454ada 772 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:00b6f7454ada 773 pc.printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:00b6f7454ada 774 while (1);
TetsuyaKonno 0:00b6f7454ada 775 }
TetsuyaKonno 0:00b6f7454ada 776 }
TetsuyaKonno 0:00b6f7454ada 777
TetsuyaKonno 0:00b6f7454ada 778 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 779 // @brief Interrupt callback function
TetsuyaKonno 0:00b6f7454ada 780 // @param[in] int_type : VDC5 interrupt type
TetsuyaKonno 0:00b6f7454ada 781 // @retval None
TetsuyaKonno 0:00b6f7454ada 782 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 783 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type)
TetsuyaKonno 0:00b6f7454ada 784 {
TetsuyaKonno 0:00b6f7454ada 785 if (vfield_count > 0) {
TetsuyaKonno 0:00b6f7454ada 786 vfield_count--;
TetsuyaKonno 0:00b6f7454ada 787 }
TetsuyaKonno 0:00b6f7454ada 788 /* top or bottom (Change) */
TetsuyaKonno 0:00b6f7454ada 789 if( vfield_count2 == 0 ) vfield_count2 = 1;
TetsuyaKonno 0:00b6f7454ada 790 else vfield_count2 = 0;
TetsuyaKonno 0:00b6f7454ada 791 led_m_user( vfield_count2 );
TetsuyaKonno 0:00b6f7454ada 792 }
TetsuyaKonno 0:00b6f7454ada 793
TetsuyaKonno 0:00b6f7454ada 794 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 795 // @brief Wait for the specified number of times Vsync occurs
TetsuyaKonno 0:00b6f7454ada 796 // @param[in] wait_count : Wait count
TetsuyaKonno 0:00b6f7454ada 797 // @retval None
TetsuyaKonno 0:00b6f7454ada 798 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 799 static void WaitVfield(const int32_t wait_count)
TetsuyaKonno 0:00b6f7454ada 800 {
TetsuyaKonno 0:00b6f7454ada 801 vfield_count = wait_count;
TetsuyaKonno 0:00b6f7454ada 802 while (vfield_count > 0) {
TetsuyaKonno 0:00b6f7454ada 803 /* Do nothing */
TetsuyaKonno 0:00b6f7454ada 804 }
TetsuyaKonno 0:00b6f7454ada 805 }
TetsuyaKonno 0:00b6f7454ada 806
TetsuyaKonno 0:00b6f7454ada 807 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 808 // @brief Interrupt callback function for Vsync interruption
TetsuyaKonno 0:00b6f7454ada 809 // @param[in] int_type : VDC5 interrupt type
TetsuyaKonno 0:00b6f7454ada 810 // @retval None
TetsuyaKonno 0:00b6f7454ada 811 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 812 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type)
TetsuyaKonno 0:00b6f7454ada 813 {
TetsuyaKonno 0:00b6f7454ada 814 if (vsync_count > 0) {
TetsuyaKonno 0:00b6f7454ada 815 vsync_count--;
TetsuyaKonno 0:00b6f7454ada 816 }
TetsuyaKonno 0:00b6f7454ada 817 }
TetsuyaKonno 0:00b6f7454ada 818
TetsuyaKonno 0:00b6f7454ada 819 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 820 // @brief Wait for the specified number of times Vsync occurs
TetsuyaKonno 0:00b6f7454ada 821 // @param[in] wait_count : Wait count
TetsuyaKonno 0:00b6f7454ada 822 // @retval None
TetsuyaKonno 0:00b6f7454ada 823 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 824 static void WaitVsync(const int32_t wait_count)
TetsuyaKonno 0:00b6f7454ada 825 {
TetsuyaKonno 0:00b6f7454ada 826 vsync_count = wait_count;
TetsuyaKonno 0:00b6f7454ada 827 while (vsync_count > 0) {
TetsuyaKonno 0:00b6f7454ada 828 /* Do nothing */
TetsuyaKonno 0:00b6f7454ada 829 }
TetsuyaKonno 0:00b6f7454ada 830 }
TetsuyaKonno 0:00b6f7454ada 831
TetsuyaKonno 0:00b6f7454ada 832 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 833 // Interrupt function( intTimer )
TetsuyaKonno 0:00b6f7454ada 834 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 835 void intTimer( void )
TetsuyaKonno 0:00b6f7454ada 836 {
TetsuyaKonno 0:00b6f7454ada 837 static int counter = 0; /* Only variable for image process */
TetsuyaKonno 0:00b6f7454ada 838
TetsuyaKonno 0:00b6f7454ada 839 cnt0++;
TetsuyaKonno 0:00b6f7454ada 840 cnt1++;
TetsuyaKonno 0:00b6f7454ada 841
TetsuyaKonno 0:00b6f7454ada 842 /* field check */
TetsuyaKonno 0:00b6f7454ada 843 if( vfield_count2 != vfield_count2_buff ) {
TetsuyaKonno 0:00b6f7454ada 844 vfield_count2_buff = vfield_count2;
TetsuyaKonno 0:00b6f7454ada 845 counter = 0;
TetsuyaKonno 0:00b6f7454ada 846 }
TetsuyaKonno 0:00b6f7454ada 847
TetsuyaKonno 0:00b6f7454ada 848 /* Top field / bottom field */
TetsuyaKonno 0:00b6f7454ada 849 switch( counter++ ) {
TetsuyaKonno 0:00b6f7454ada 850 case 0:
TetsuyaKonno 0:00b6f7454ada 851 ImageCopy( write_buff_addr, PIXEL_HW, PIXEL_VW, ImageData_A, vfield_count2 );
TetsuyaKonno 0:00b6f7454ada 852 break;
TetsuyaKonno 0:00b6f7454ada 853 case 1:
TetsuyaKonno 0:00b6f7454ada 854 ImageCopy( write_buff_addr, PIXEL_HW, PIXEL_VW, ImageData_A, vfield_count2 );
TetsuyaKonno 0:00b6f7454ada 855 break;
TetsuyaKonno 0:00b6f7454ada 856 case 2:
TetsuyaKonno 0:00b6f7454ada 857 Extraction_Brightness( ImageData_A, PIXEL_HW, PIXEL_VW, ImageData_B, vfield_count2 );
TetsuyaKonno 0:00b6f7454ada 858 break;
TetsuyaKonno 0:00b6f7454ada 859 case 3:
TetsuyaKonno 0:00b6f7454ada 860 Extraction_Brightness( ImageData_A, PIXEL_HW, PIXEL_VW, ImageData_B, vfield_count2 );
TetsuyaKonno 0:00b6f7454ada 861 break;
TetsuyaKonno 0:00b6f7454ada 862 case 4:
TetsuyaKonno 0:00b6f7454ada 863 ImageReduction( ImageData_B, PIXEL_HW, PIXEL_VW, ImageComp_B, Rate );
TetsuyaKonno 0:00b6f7454ada 864 break;
TetsuyaKonno 0:00b6f7454ada 865 case 5:
TetsuyaKonno 0:00b6f7454ada 866 ImageReduction( ImageData_B, PIXEL_HW, PIXEL_VW, ImageComp_B, Rate );
TetsuyaKonno 0:00b6f7454ada 867 break;
TetsuyaKonno 0:00b6f7454ada 868 case 6:
TetsuyaKonno 0:00b6f7454ada 869 Binarization( ImageComp_B, (PIXEL_HW * Rate), (PIXEL_VW * Rate), ImageBinary, threshold_buff );
TetsuyaKonno 0:00b6f7454ada 870 if( !initFlag ) SenVal1 = sensor_process( ImageBinary, (PIXEL_HW * Rate), (PIXEL_VW * Rate), Sen1Px, 12 );
TetsuyaKonno 0:00b6f7454ada 871 break;
TetsuyaKonno 0:00b6f7454ada 872 case 7:
TetsuyaKonno 0:00b6f7454ada 873 if( !initFlag ) PatternMatching_process( ImageBinary, (PIXEL_HW * Rate), (PIXEL_VW * Rate), &RightCrank, 2, 10, 2, 8 );
TetsuyaKonno 0:00b6f7454ada 874 break;
TetsuyaKonno 0:00b6f7454ada 875 case 8:
TetsuyaKonno 0:00b6f7454ada 876 if( !initFlag ) PatternMatching_process( ImageBinary, (PIXEL_HW * Rate), (PIXEL_VW * Rate), &RightLaneChange, 4, 6, 1, 3 );
TetsuyaKonno 0:00b6f7454ada 877 break;
TetsuyaKonno 0:00b6f7454ada 878 default:
TetsuyaKonno 0:00b6f7454ada 879 break;
TetsuyaKonno 0:00b6f7454ada 880 }
TetsuyaKonno 0:00b6f7454ada 881
TetsuyaKonno 0:00b6f7454ada 882 /* LED(rgb) on the GR-peach board */
TetsuyaKonno 0:00b6f7454ada 883 led_m_process();
TetsuyaKonno 0:00b6f7454ada 884 }
TetsuyaKonno 0:00b6f7454ada 885
TetsuyaKonno 0:00b6f7454ada 886 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 887 // functions ( on GR-PEACH board )
TetsuyaKonno 0:00b6f7454ada 888 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 889 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 890 //led_rgb Function
TetsuyaKonno 0:00b6f7454ada 891 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 892 void led_rgb(int led)
TetsuyaKonno 0:00b6f7454ada 893 {
TetsuyaKonno 0:00b6f7454ada 894 LED_R = led & 0x1;
TetsuyaKonno 0:00b6f7454ada 895 LED_G = (led >> 1 ) & 0x1;
TetsuyaKonno 0:00b6f7454ada 896 LED_B = (led >> 2 ) & 0x1;
TetsuyaKonno 0:00b6f7454ada 897 }
TetsuyaKonno 0:00b6f7454ada 898
TetsuyaKonno 0:00b6f7454ada 899 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 900 //user_button_get Function
TetsuyaKonno 0:00b6f7454ada 901 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 902 unsigned char user_button_get( void )
TetsuyaKonno 0:00b6f7454ada 903 {
TetsuyaKonno 0:00b6f7454ada 904 return (~user_botton) & 0x1; /* Read ports with switches */
TetsuyaKonno 0:00b6f7454ada 905 }
TetsuyaKonno 0:00b6f7454ada 906
TetsuyaKonno 0:00b6f7454ada 907 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 908 //led_m_user Function
TetsuyaKonno 0:00b6f7454ada 909 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 910 void led_m_user( int led )
TetsuyaKonno 0:00b6f7454ada 911 {
TetsuyaKonno 0:00b6f7454ada 912 USER_LED = led & 0x01;
TetsuyaKonno 0:00b6f7454ada 913 }
TetsuyaKonno 0:00b6f7454ada 914
TetsuyaKonno 0:00b6f7454ada 915 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 916 //led_m_set Function
TetsuyaKonno 0:00b6f7454ada 917 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 918 void led_m_set( int set )
TetsuyaKonno 0:00b6f7454ada 919 {
TetsuyaKonno 0:00b6f7454ada 920 led_pattern = set;
TetsuyaKonno 0:00b6f7454ada 921 }
TetsuyaKonno 0:00b6f7454ada 922
TetsuyaKonno 0:00b6f7454ada 923 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 924 //led_m_process Function for only interrupt
TetsuyaKonno 0:00b6f7454ada 925 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 926 void led_m_process( void )
TetsuyaKonno 0:00b6f7454ada 927 {
TetsuyaKonno 0:00b6f7454ada 928 int led_color;
TetsuyaKonno 0:00b6f7454ada 929 int onTime;
TetsuyaKonno 0:00b6f7454ada 930 int offTime;
TetsuyaKonno 0:00b6f7454ada 931 static unsigned long cnt_led_m;
TetsuyaKonno 0:00b6f7454ada 932
TetsuyaKonno 0:00b6f7454ada 933 switch( led_pattern ) {
TetsuyaKonno 0:00b6f7454ada 934 case RUN:
TetsuyaKonno 0:00b6f7454ada 935 led_color = LED_GREEN;
TetsuyaKonno 0:00b6f7454ada 936 onTime = 500;
TetsuyaKonno 0:00b6f7454ada 937 offTime = 500;
TetsuyaKonno 0:00b6f7454ada 938 break;
TetsuyaKonno 0:00b6f7454ada 939 case STOP:
TetsuyaKonno 0:00b6f7454ada 940 led_color = LED_RED;
TetsuyaKonno 0:00b6f7454ada 941 onTime = 500;
TetsuyaKonno 0:00b6f7454ada 942 offTime = 0;
TetsuyaKonno 0:00b6f7454ada 943 break;
TetsuyaKonno 0:00b6f7454ada 944 case ERROR:
TetsuyaKonno 0:00b6f7454ada 945 led_color = LED_RED;
TetsuyaKonno 0:00b6f7454ada 946 onTime = 100;
TetsuyaKonno 0:00b6f7454ada 947 offTime = 100;
TetsuyaKonno 0:00b6f7454ada 948 break;
TetsuyaKonno 0:00b6f7454ada 949 case DEBUG:
TetsuyaKonno 0:00b6f7454ada 950 led_color = LED_BLUE;
TetsuyaKonno 0:00b6f7454ada 951 onTime = 50;
TetsuyaKonno 0:00b6f7454ada 952 offTime = 50;
TetsuyaKonno 0:00b6f7454ada 953 break;
TetsuyaKonno 0:00b6f7454ada 954 case CRANK:
TetsuyaKonno 0:00b6f7454ada 955 led_color = LED_YELLOW;
TetsuyaKonno 0:00b6f7454ada 956 onTime = 500;
TetsuyaKonno 0:00b6f7454ada 957 offTime = 500;
TetsuyaKonno 0:00b6f7454ada 958 break;
TetsuyaKonno 0:00b6f7454ada 959 case LCHANGE:
TetsuyaKonno 0:00b6f7454ada 960 led_color = LED_BLUE;
TetsuyaKonno 0:00b6f7454ada 961 onTime = 500;
TetsuyaKonno 0:00b6f7454ada 962 offTime = 500;
TetsuyaKonno 0:00b6f7454ada 963 break;
TetsuyaKonno 0:00b6f7454ada 964 default:
TetsuyaKonno 0:00b6f7454ada 965 led_color = LED_OFF;
TetsuyaKonno 0:00b6f7454ada 966 onTime = 500;
TetsuyaKonno 0:00b6f7454ada 967 offTime = 500;
TetsuyaKonno 0:00b6f7454ada 968 break;
TetsuyaKonno 0:00b6f7454ada 969 }
TetsuyaKonno 0:00b6f7454ada 970
TetsuyaKonno 0:00b6f7454ada 971 cnt_led_m++;
TetsuyaKonno 0:00b6f7454ada 972
TetsuyaKonno 0:00b6f7454ada 973 /* Display */
TetsuyaKonno 0:00b6f7454ada 974 if( cnt_led_m < onTime ) led_rgb( led_color );
TetsuyaKonno 0:00b6f7454ada 975 else if( cnt_led_m < ( onTime + offTime ) ) led_rgb( LED_OFF );
TetsuyaKonno 0:00b6f7454ada 976 else cnt_led_m = 0;
TetsuyaKonno 0:00b6f7454ada 977 }
TetsuyaKonno 0:00b6f7454ada 978
TetsuyaKonno 0:00b6f7454ada 979 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 980 // functions ( on Motor drive board )
TetsuyaKonno 0:00b6f7454ada 981 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 982 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 983 //led_out Function
TetsuyaKonno 0:00b6f7454ada 984 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 985 void led_out(int led)
TetsuyaKonno 0:00b6f7454ada 986 {
TetsuyaKonno 0:00b6f7454ada 987 led = ~led;
TetsuyaKonno 0:00b6f7454ada 988 LED_3 = led & 0x1;
TetsuyaKonno 0:00b6f7454ada 989 LED_2 = ( led >> 1 ) & 0x1;
TetsuyaKonno 0:00b6f7454ada 990 }
TetsuyaKonno 0:00b6f7454ada 991
TetsuyaKonno 0:00b6f7454ada 992 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 993 //pushsw_get Function
TetsuyaKonno 0:00b6f7454ada 994 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 995 unsigned char pushsw_get( void )
TetsuyaKonno 0:00b6f7454ada 996 {
TetsuyaKonno 0:00b6f7454ada 997 return (~push_sw) & 0x1; /* Read ports with switches */
TetsuyaKonno 0:00b6f7454ada 998 }
TetsuyaKonno 0:00b6f7454ada 999
TetsuyaKonno 0:00b6f7454ada 1000 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1001 //motor speed control(PWM)
TetsuyaKonno 0:00b6f7454ada 1002 //Arguments: motor:-100 to 100
TetsuyaKonno 0:00b6f7454ada 1003 //Here, 0 is stop, 100 is forward, -100 is reverse
TetsuyaKonno 0:00b6f7454ada 1004 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1005 void motor( int accele_l, int accele_r )
TetsuyaKonno 0:00b6f7454ada 1006 {
TetsuyaKonno 0:00b6f7454ada 1007 int sw_data;
TetsuyaKonno 0:00b6f7454ada 1008
TetsuyaKonno 0:00b6f7454ada 1009 sw_data = dipsw_get() + 5;
TetsuyaKonno 0:00b6f7454ada 1010 accele_l = ( accele_l * sw_data ) / 20;
TetsuyaKonno 0:00b6f7454ada 1011 accele_r = ( accele_r * sw_data ) / 20;
TetsuyaKonno 0:00b6f7454ada 1012
TetsuyaKonno 0:00b6f7454ada 1013 /* Left Motor Control */
TetsuyaKonno 0:00b6f7454ada 1014 if( accele_l >= 0 ) {
TetsuyaKonno 0:00b6f7454ada 1015 /* forward */
TetsuyaKonno 0:00b6f7454ada 1016 Left_motor_signal = 0;
TetsuyaKonno 0:00b6f7454ada 1017 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_l / 100;
TetsuyaKonno 0:00b6f7454ada 1018 } else {
TetsuyaKonno 0:00b6f7454ada 1019 /* reverse */
TetsuyaKonno 0:00b6f7454ada 1020 Left_motor_signal = 1;
TetsuyaKonno 0:00b6f7454ada 1021 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_l ) / 100;
TetsuyaKonno 0:00b6f7454ada 1022 }
TetsuyaKonno 0:00b6f7454ada 1023
TetsuyaKonno 0:00b6f7454ada 1024 /* Right Motor Control */
TetsuyaKonno 0:00b6f7454ada 1025 if( accele_r >= 0 ) {
TetsuyaKonno 0:00b6f7454ada 1026 /* forward */
TetsuyaKonno 0:00b6f7454ada 1027 Right_motor_signal = 0;
TetsuyaKonno 0:00b6f7454ada 1028 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_r / 100;
TetsuyaKonno 0:00b6f7454ada 1029 } else {
TetsuyaKonno 0:00b6f7454ada 1030 /* reverse */
TetsuyaKonno 0:00b6f7454ada 1031 Right_motor_signal = 1;
TetsuyaKonno 0:00b6f7454ada 1032 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_r ) / 100;
TetsuyaKonno 0:00b6f7454ada 1033 }
TetsuyaKonno 0:00b6f7454ada 1034 }
TetsuyaKonno 0:00b6f7454ada 1035
TetsuyaKonno 0:00b6f7454ada 1036 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1037 //motor speed control(PWM)
TetsuyaKonno 0:00b6f7454ada 1038 //Arguments: motor:-100 to 100
TetsuyaKonno 0:00b6f7454ada 1039 //Here, 0 is stop, 100 is forward, -100 is reverse
TetsuyaKonno 0:00b6f7454ada 1040 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1041 void motor2( int accele_l, int accele_r )
TetsuyaKonno 0:00b6f7454ada 1042 {
TetsuyaKonno 0:00b6f7454ada 1043 /* Left Motor Control */
TetsuyaKonno 0:00b6f7454ada 1044 if( accele_l >= 0 ) {
TetsuyaKonno 0:00b6f7454ada 1045 /* forward */
TetsuyaKonno 0:00b6f7454ada 1046 Left_motor_signal = 0;
TetsuyaKonno 0:00b6f7454ada 1047 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_l / 100;
TetsuyaKonno 0:00b6f7454ada 1048 } else {
TetsuyaKonno 0:00b6f7454ada 1049 /* reverse */
TetsuyaKonno 0:00b6f7454ada 1050 Left_motor_signal = 1;
TetsuyaKonno 0:00b6f7454ada 1051 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_l ) / 100;
TetsuyaKonno 0:00b6f7454ada 1052 }
TetsuyaKonno 0:00b6f7454ada 1053
TetsuyaKonno 0:00b6f7454ada 1054 /* Right Motor Control */
TetsuyaKonno 0:00b6f7454ada 1055 if( accele_r >= 0 ) {
TetsuyaKonno 0:00b6f7454ada 1056 /* forward */
TetsuyaKonno 0:00b6f7454ada 1057 Right_motor_signal = 0;
TetsuyaKonno 0:00b6f7454ada 1058 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_r / 100;
TetsuyaKonno 0:00b6f7454ada 1059 } else {
TetsuyaKonno 0:00b6f7454ada 1060 /* reverse */
TetsuyaKonno 0:00b6f7454ada 1061 Right_motor_signal = 1;
TetsuyaKonno 0:00b6f7454ada 1062 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_r ) / 100;
TetsuyaKonno 0:00b6f7454ada 1063 }
TetsuyaKonno 0:00b6f7454ada 1064 }
TetsuyaKonno 0:00b6f7454ada 1065
TetsuyaKonno 0:00b6f7454ada 1066 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1067 //handle Function
TetsuyaKonno 0:00b6f7454ada 1068 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1069 void handle( int angle )
TetsuyaKonno 0:00b6f7454ada 1070 {
TetsuyaKonno 0:00b6f7454ada 1071 handle_buff = angle;
TetsuyaKonno 0:00b6f7454ada 1072 /* When the servo move from left to right in reverse, replace "-" with "+" */
TetsuyaKonno 0:00b6f7454ada 1073 MTU2TGRD_0 = SERVO_CENTER - angle * HANDLE_STEP;
TetsuyaKonno 0:00b6f7454ada 1074 }
TetsuyaKonno 0:00b6f7454ada 1075
TetsuyaKonno 0:00b6f7454ada 1076 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1077 //diff Function
TetsuyaKonno 0:00b6f7454ada 1078 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1079 int diff( int pwm )
TetsuyaKonno 0:00b6f7454ada 1080 {
TetsuyaKonno 0:00b6f7454ada 1081 int i, ret;
TetsuyaKonno 0:00b6f7454ada 1082
TetsuyaKonno 0:00b6f7454ada 1083 i = handle_buff;
TetsuyaKonno 0:00b6f7454ada 1084 if( i < 0 ) i = -i;
TetsuyaKonno 0:00b6f7454ada 1085 if( i > 45 ) i = 45;
TetsuyaKonno 0:00b6f7454ada 1086 ret = revolution_difference[i] * pwm / 100;
TetsuyaKonno 0:00b6f7454ada 1087
TetsuyaKonno 0:00b6f7454ada 1088 return ret;
TetsuyaKonno 0:00b6f7454ada 1089 }
TetsuyaKonno 0:00b6f7454ada 1090
TetsuyaKonno 0:00b6f7454ada 1091 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 1092 // functions ( on Shield board )
TetsuyaKonno 0:00b6f7454ada 1093 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 1094 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1095 //Dipsw get Function
TetsuyaKonno 0:00b6f7454ada 1096 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1097 unsigned char dipsw_get( void )
TetsuyaKonno 0:00b6f7454ada 1098 {
TetsuyaKonno 0:00b6f7454ada 1099 return( dipsw.read() & 0x0f );
TetsuyaKonno 0:00b6f7454ada 1100 }
TetsuyaKonno 0:00b6f7454ada 1101
TetsuyaKonno 0:00b6f7454ada 1102 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 1103 // digital sensor functions
TetsuyaKonno 0:00b6f7454ada 1104 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 1105 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1106 // init sensor Function
TetsuyaKonno 0:00b6f7454ada 1107 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1108 int init_sensor( unsigned char *BuffAddrIn, int HW, int VW, int Cx, int *SENPx, int Y )
TetsuyaKonno 0:00b6f7454ada 1109 {
TetsuyaKonno 0:00b6f7454ada 1110 int X;
TetsuyaKonno 0:00b6f7454ada 1111 int L1x, R1x;
TetsuyaKonno 0:00b6f7454ada 1112 int i, error_cnt;
TetsuyaKonno 0:00b6f7454ada 1113
TetsuyaKonno 0:00b6f7454ada 1114 //Left side
TetsuyaKonno 0:00b6f7454ada 1115 for( X = Cx; X > 1; X-- ){
TetsuyaKonno 0:00b6f7454ada 1116 if( BuffAddrIn[ ( Y * HW ) + ( X - 0 ) ] == 0 && BuffAddrIn[ ( Y * HW ) + ( X - 1 ) ] == 0 ) {
TetsuyaKonno 0:00b6f7454ada 1117 L1x = X;
TetsuyaKonno 0:00b6f7454ada 1118 break;
TetsuyaKonno 0:00b6f7454ada 1119 }
TetsuyaKonno 0:00b6f7454ada 1120 }
TetsuyaKonno 0:00b6f7454ada 1121 //Right side
TetsuyaKonno 0:00b6f7454ada 1122 for( X = Cx; X < ( HW - 1 ); X++ ){
TetsuyaKonno 0:00b6f7454ada 1123 if( BuffAddrIn[ ( Y * HW ) + ( X + 0 ) ] == 0 && BuffAddrIn[ ( Y * HW ) + ( X + 1 ) ] == 0 ) {
TetsuyaKonno 0:00b6f7454ada 1124 R1x = X;
TetsuyaKonno 0:00b6f7454ada 1125 break;
TetsuyaKonno 0:00b6f7454ada 1126 }
TetsuyaKonno 0:00b6f7454ada 1127 }
TetsuyaKonno 0:00b6f7454ada 1128
TetsuyaKonno 0:00b6f7454ada 1129 SENPx[ 4 ] = L1x + ( ( R1x - L1x ) / 2 ); // Center
TetsuyaKonno 0:00b6f7454ada 1130 SENPx[ 2 ] = L1x; // L1
TetsuyaKonno 0:00b6f7454ada 1131 SENPx[ 1 ] = R1x; // R1
TetsuyaKonno 0:00b6f7454ada 1132 SENPx[ 3 ] = SENPx[ 2 ] - ( SENPx[ 4 ] - SENPx[ 2 ] ); //L2
TetsuyaKonno 0:00b6f7454ada 1133 SENPx[ 0 ] = SENPx[ 1 ] + ( SENPx[ 1 ] - SENPx[ 4 ] ); //R2
TetsuyaKonno 0:00b6f7454ada 1134
TetsuyaKonno 0:00b6f7454ada 1135 /* error check */
TetsuyaKonno 0:00b6f7454ada 1136 error_cnt = 0;
TetsuyaKonno 0:00b6f7454ada 1137 for( i = 0; i < 4; i++ ){
TetsuyaKonno 0:00b6f7454ada 1138 if( SENPx[4] == SENPx[i] ) error_cnt += 1;
TetsuyaKonno 0:00b6f7454ada 1139 }
TetsuyaKonno 0:00b6f7454ada 1140
TetsuyaKonno 0:00b6f7454ada 1141 //#define DEBUG_MODE
TetsuyaKonno 0:00b6f7454ada 1142 #ifdef DEBUG_MODE
TetsuyaKonno 0:00b6f7454ada 1143 pc.printf( "L2=%2d, L1=%2d, Cx=%2d, R1=%2d, R2=%2d\n\r", SENPx[ 3 ], SENPx[ 2 ], SENPx[ 4 ], SENPx[ 1 ], SENPx[ 0 ] );
TetsuyaKonno 0:00b6f7454ada 1144 if( error_cnt != 0 ) pc.printf( "init_sensor function Error %1d\n\r", error_cnt );
TetsuyaKonno 0:00b6f7454ada 1145 else pc.printf( "init_sensor function complete\n\r" );
TetsuyaKonno 0:00b6f7454ada 1146 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1147 #endif
TetsuyaKonno 0:00b6f7454ada 1148
TetsuyaKonno 0:00b6f7454ada 1149 return error_cnt;
TetsuyaKonno 0:00b6f7454ada 1150 }
TetsuyaKonno 0:00b6f7454ada 1151
TetsuyaKonno 0:00b6f7454ada 1152 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1153 //sensor_process Function(Interrupt function)
TetsuyaKonno 0:00b6f7454ada 1154 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1155 unsigned char sensor_process( unsigned char *BuffAddrIn, int HW, int VW, int *SENPx, int Y )
TetsuyaKonno 0:00b6f7454ada 1156 {
TetsuyaKonno 0:00b6f7454ada 1157 int sensor;
TetsuyaKonno 0:00b6f7454ada 1158 int data;
TetsuyaKonno 0:00b6f7454ada 1159
TetsuyaKonno 0:00b6f7454ada 1160 sensor = 0x00;
TetsuyaKonno 0:00b6f7454ada 1161 if( VW < Y ) {
TetsuyaKonno 0:00b6f7454ada 1162 pc.printf( "sensor process function error\n\r" );
TetsuyaKonno 0:00b6f7454ada 1163 return sensor;
TetsuyaKonno 0:00b6f7454ada 1164 }
TetsuyaKonno 0:00b6f7454ada 1165
TetsuyaKonno 0:00b6f7454ada 1166 data = BuffAddrIn[ ( Y * HW ) + SENPx[ 4 ] ] & 0x01;
TetsuyaKonno 0:00b6f7454ada 1167 sensor |= ( data << 4 ) & 0x10;
TetsuyaKonno 0:00b6f7454ada 1168 data = BuffAddrIn[ ( Y * HW ) + SENPx[ 3 ] ] & 0x01;
TetsuyaKonno 0:00b6f7454ada 1169 sensor |= ( data << 3 ) & 0x08;
TetsuyaKonno 0:00b6f7454ada 1170 data = BuffAddrIn[ ( Y * HW ) + SENPx[ 2 ] ] & 0x01;
TetsuyaKonno 0:00b6f7454ada 1171 sensor |= ( data << 2 ) & 0x04;
TetsuyaKonno 0:00b6f7454ada 1172 data = BuffAddrIn[ ( Y * HW ) + SENPx[ 1 ] ] & 0x01;
TetsuyaKonno 0:00b6f7454ada 1173 sensor |= ( data << 1 ) & 0x02;
TetsuyaKonno 0:00b6f7454ada 1174 sensor |= BuffAddrIn[ ( Y * HW ) + SENPx[ 0 ] ] & 0x01;
TetsuyaKonno 0:00b6f7454ada 1175
TetsuyaKonno 0:00b6f7454ada 1176 sensor &= 0x1f;
TetsuyaKonno 0:00b6f7454ada 1177
TetsuyaKonno 0:00b6f7454ada 1178 return sensor;
TetsuyaKonno 0:00b6f7454ada 1179 }
TetsuyaKonno 0:00b6f7454ada 1180
TetsuyaKonno 0:00b6f7454ada 1181 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1182 //sensor Function
TetsuyaKonno 0:00b6f7454ada 1183 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1184 unsigned char sensor_inp( void )
TetsuyaKonno 0:00b6f7454ada 1185 {
TetsuyaKonno 0:00b6f7454ada 1186 return SenVal1 & 0x0f;
TetsuyaKonno 0:00b6f7454ada 1187 }
TetsuyaKonno 0:00b6f7454ada 1188
TetsuyaKonno 0:00b6f7454ada 1189 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1190 //sensor Function
TetsuyaKonno 0:00b6f7454ada 1191 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1192 unsigned char center_inp( void )
TetsuyaKonno 0:00b6f7454ada 1193 {
TetsuyaKonno 0:00b6f7454ada 1194 return ( SenVal1 >> 4 ) & 0x01;
TetsuyaKonno 0:00b6f7454ada 1195 }
TetsuyaKonno 0:00b6f7454ada 1196
TetsuyaKonno 0:00b6f7454ada 1197 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1198 // RightCrank Check
TetsuyaKonno 0:00b6f7454ada 1199 // Return values: 0: no triangle mark, 1: Triangle mark
TetsuyaKonno 0:00b6f7454ada 1200 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1201 int RightCrankCheck( int percentage )
TetsuyaKonno 0:00b6f7454ada 1202 {
TetsuyaKonno 0:00b6f7454ada 1203 int ret;
TetsuyaKonno 0:00b6f7454ada 1204
TetsuyaKonno 0:00b6f7454ada 1205 ret = 0;
TetsuyaKonno 0:00b6f7454ada 1206 if( RightCrank.p >= percentage ) {
TetsuyaKonno 0:00b6f7454ada 1207 ret = 1;
TetsuyaKonno 0:00b6f7454ada 1208 }
TetsuyaKonno 0:00b6f7454ada 1209
TetsuyaKonno 0:00b6f7454ada 1210 return ret;
TetsuyaKonno 0:00b6f7454ada 1211 }
TetsuyaKonno 0:00b6f7454ada 1212
TetsuyaKonno 0:00b6f7454ada 1213 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1214 // RightLaneChange Check
TetsuyaKonno 0:00b6f7454ada 1215 // Return values: 0: no triangle mark, 1: Triangle mark
TetsuyaKonno 0:00b6f7454ada 1216 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1217 int RightLaneChangeCheck( int percentage )
TetsuyaKonno 0:00b6f7454ada 1218 {
TetsuyaKonno 0:00b6f7454ada 1219 int ret;
TetsuyaKonno 0:00b6f7454ada 1220
TetsuyaKonno 0:00b6f7454ada 1221 ret = 0;
TetsuyaKonno 0:00b6f7454ada 1222 if( RightLaneChange.p >= percentage ) {
TetsuyaKonno 0:00b6f7454ada 1223 ret = 1;
TetsuyaKonno 0:00b6f7454ada 1224 }
TetsuyaKonno 0:00b6f7454ada 1225
TetsuyaKonno 0:00b6f7454ada 1226 return ret;
TetsuyaKonno 0:00b6f7454ada 1227 }
TetsuyaKonno 0:00b6f7454ada 1228
TetsuyaKonno 0:00b6f7454ada 1229 //******************************************************************//
TetsuyaKonno 0:00b6f7454ada 1230 // Debug functions
TetsuyaKonno 0:00b6f7454ada 1231 //*******************************************************************/
TetsuyaKonno 0:00b6f7454ada 1232 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1233 //Image Data Output( for the Excel )
TetsuyaKonno 0:00b6f7454ada 1234 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1235 void ImageData_Serial_Out1( unsigned char *ImageData, int HW, int VW )
TetsuyaKonno 0:00b6f7454ada 1236 {
TetsuyaKonno 0:00b6f7454ada 1237 int Xp, Yp, inc;
TetsuyaKonno 0:00b6f7454ada 1238
TetsuyaKonno 0:00b6f7454ada 1239 for( Yp = 0, inc = 0; Yp < VW; Yp++ ) {
TetsuyaKonno 0:00b6f7454ada 1240 for( Xp = 0; Xp < HW; Xp++, inc++ ) {
TetsuyaKonno 0:00b6f7454ada 1241 pc.printf( "%d,", ImageData[ inc ] );
TetsuyaKonno 0:00b6f7454ada 1242 }
TetsuyaKonno 0:00b6f7454ada 1243 pc.printf("\n\r");
TetsuyaKonno 0:00b6f7454ada 1244 }
TetsuyaKonno 0:00b6f7454ada 1245 }
TetsuyaKonno 0:00b6f7454ada 1246
TetsuyaKonno 0:00b6f7454ada 1247 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1248 //Image Data Output2( for TeraTerm )
TetsuyaKonno 0:00b6f7454ada 1249 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1250 void ImageData_Serial_Out2( unsigned char *ImageData, int HW, int VW )
TetsuyaKonno 0:00b6f7454ada 1251 {
TetsuyaKonno 0:00b6f7454ada 1252 int Xp, Yp;
TetsuyaKonno 0:00b6f7454ada 1253 int i;
TetsuyaKonno 0:00b6f7454ada 1254
TetsuyaKonno 0:00b6f7454ada 1255 for( Yp = 0; Yp < VW; Yp++ ) {
TetsuyaKonno 0:00b6f7454ada 1256 for( Xp = 0; Xp < HW; Xp++ ) {
TetsuyaKonno 0:00b6f7454ada 1257 pc.printf( "%d ", ImageData[Xp + (Yp * HW)] );
TetsuyaKonno 0:00b6f7454ada 1258 }
TetsuyaKonno 0:00b6f7454ada 1259 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1260 }
TetsuyaKonno 0:00b6f7454ada 1261
TetsuyaKonno 0:00b6f7454ada 1262 //Add display
TetsuyaKonno 0:00b6f7454ada 1263 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1264 pc.printf( "sensor_inp = 0x%02x\n\r", sensor_inp() );
TetsuyaKonno 0:00b6f7454ada 1265 pc.printf( "center_inp = 0x%02x\n\r", center_inp() );
TetsuyaKonno 0:00b6f7454ada 1266 pc.printf( "RightCrank = %01d, = %3d%%, X = %2d, Y = %2d\n\r", RightCrankCheck(80), RightCrank.p, RightCrank.x, RightCrank.y );
TetsuyaKonno 0:00b6f7454ada 1267 pc.printf( "RightLaneChange = %01d, = %3d%%, X = %2d, Y = %2d\n\r", RightLaneChangeCheck(80), RightLaneChange.p, RightLaneChange.x, RightLaneChange.y );
TetsuyaKonno 0:00b6f7454ada 1268 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1269 VW += 6;
TetsuyaKonno 0:00b6f7454ada 1270
TetsuyaKonno 0:00b6f7454ada 1271 pc.printf( "Threshold Check ( please user button on GR-peach board )\n\r" );
TetsuyaKonno 0:00b6f7454ada 1272 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1273 VW += 2;
TetsuyaKonno 0:00b6f7454ada 1274
TetsuyaKonno 0:00b6f7454ada 1275 if( user_button_get() ){
TetsuyaKonno 0:00b6f7454ada 1276 pc.printf( "Please Threshold\n\r" );
TetsuyaKonno 0:00b6f7454ada 1277 pc.printf( " = " );
TetsuyaKonno 0:00b6f7454ada 1278 pc.scanf( "%d", &i );
TetsuyaKonno 0:00b6f7454ada 1279 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1280 threshold_buff = i;
TetsuyaKonno 0:00b6f7454ada 1281 VW += 2;
TetsuyaKonno 0:00b6f7454ada 1282 }
TetsuyaKonno 0:00b6f7454ada 1283
TetsuyaKonno 0:00b6f7454ada 1284 pc.printf( "\033[%dA" , VW );
TetsuyaKonno 0:00b6f7454ada 1285 }
TetsuyaKonno 0:00b6f7454ada 1286
TetsuyaKonno 0:00b6f7454ada 1287 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1288 //Image Data Output3( for TeraTerm )
TetsuyaKonno 0:00b6f7454ada 1289 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1290 void ImageData_Serial_Out3( unsigned char *ImageData, int HW, int VW, int color_pattern )
TetsuyaKonno 0:00b6f7454ada 1291 {
TetsuyaKonno 0:00b6f7454ada 1292 int X, Y;
TetsuyaKonno 0:00b6f7454ada 1293 int Px, Py;
TetsuyaKonno 0:00b6f7454ada 1294 int HW_T;//HW Twice
TetsuyaKonno 0:00b6f7454ada 1295 int value;
TetsuyaKonno 0:00b6f7454ada 1296
TetsuyaKonno 0:00b6f7454ada 1297 HW_T = HW + HW;
TetsuyaKonno 0:00b6f7454ada 1298
TetsuyaKonno 0:00b6f7454ada 1299 /* Camera module test process 2 */
TetsuyaKonno 0:00b6f7454ada 1300 pc.printf( "//,X-Size,Y-Size" );
TetsuyaKonno 0:00b6f7454ada 1301 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1302 pc.printf( "#SIZE,%3d,%3d", HW, VW );
TetsuyaKonno 0:00b6f7454ada 1303 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1304 pc.printf( "//,X-Point,Y-Point" );
TetsuyaKonno 0:00b6f7454ada 1305 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1306
TetsuyaKonno 0:00b6f7454ada 1307 switch( color_pattern ) {
TetsuyaKonno 0:00b6f7454ada 1308 case COLOR:
TetsuyaKonno 0:00b6f7454ada 1309 //YCBCR_422 Color
TetsuyaKonno 0:00b6f7454ada 1310 for( Py = 0, Y = 0; Py < VW; Py+=1, Y++ ){
TetsuyaKonno 0:00b6f7454ada 1311 for( Px = 0, X = 0; Px < HW_T; Px+=4, X+=2 ){
TetsuyaKonno 0:00b6f7454ada 1312 pc.printf( "#YCbCr," );
TetsuyaKonno 0:00b6f7454ada 1313 /*Xp*/pc.printf( "%d,", X);
TetsuyaKonno 0:00b6f7454ada 1314 /*Yp*/pc.printf( "%d,", Y);
TetsuyaKonno 0:00b6f7454ada 1315 /*Y0*/pc.printf( "%d,", ImageData[ ( Px + 0 ) + ( HW_T * Py ) ] );//6
TetsuyaKonno 0:00b6f7454ada 1316 /*Cb*/pc.printf( "%d,", ImageData[ ( Px + 1 ) + ( HW_T * Py ) ] );//5
TetsuyaKonno 0:00b6f7454ada 1317 /*Cr*/pc.printf( "%d,", ImageData[ ( Px + 3 ) + ( HW_T * Py ) ] );//7
TetsuyaKonno 0:00b6f7454ada 1318 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1319
TetsuyaKonno 0:00b6f7454ada 1320 pc.printf( "#YCbCr," );
TetsuyaKonno 0:00b6f7454ada 1321 /*Xp*/pc.printf( "%d,", X+1);
TetsuyaKonno 0:00b6f7454ada 1322 /*Yp*/pc.printf( "%d,", Y);
TetsuyaKonno 0:00b6f7454ada 1323 /*Y1*/pc.printf( "%d,", ImageData[ ( Px + 2 ) + ( HW_T * Py ) ] );//4
TetsuyaKonno 0:00b6f7454ada 1324 /*Cb*/pc.printf( "%d,", ImageData[ ( Px + 1 ) + ( HW_T * Py ) ] );//5
TetsuyaKonno 0:00b6f7454ada 1325 /*Cr*/pc.printf( "%d,", ImageData[ ( Px + 3 ) + ( HW_T * Py ) ] );//7
TetsuyaKonno 0:00b6f7454ada 1326 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1327 }
TetsuyaKonno 0:00b6f7454ada 1328 }
TetsuyaKonno 0:00b6f7454ada 1329 break;
TetsuyaKonno 0:00b6f7454ada 1330 case GREY_SCALE:
TetsuyaKonno 0:00b6f7454ada 1331 //YCBCR_422 GreyScale
TetsuyaKonno 0:00b6f7454ada 1332 for( Y = 0; Y < VW; Y++ ){
TetsuyaKonno 0:00b6f7454ada 1333 for( X = 0; X < HW; X+=2 ){
TetsuyaKonno 0:00b6f7454ada 1334 pc.printf( "#YCbCr," );
TetsuyaKonno 0:00b6f7454ada 1335 /*Xp*/pc.printf( "%d,", X);
TetsuyaKonno 0:00b6f7454ada 1336 /*Yp*/pc.printf( "%d,", Y);
TetsuyaKonno 0:00b6f7454ada 1337 /*Y0*/pc.printf( "%d,", ImageData[ ( Y * HW ) + ( X + 0 ) ] );//6
TetsuyaKonno 0:00b6f7454ada 1338 /*Cb*/pc.printf( "%d,", 128);//5
TetsuyaKonno 0:00b6f7454ada 1339 /*Cr*/pc.printf( "%d,", 128);//7
TetsuyaKonno 0:00b6f7454ada 1340 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1341
TetsuyaKonno 0:00b6f7454ada 1342 pc.printf( "#YCbCr," );
TetsuyaKonno 0:00b6f7454ada 1343 /*Xp*/pc.printf( "%d,", X+1);
TetsuyaKonno 0:00b6f7454ada 1344 /*Yp*/pc.printf( "%d,", Y);
TetsuyaKonno 0:00b6f7454ada 1345 /*Y1*/pc.printf( "%d,", ImageData[ ( Y * HW ) + ( X + 1 ) ] );//4
TetsuyaKonno 0:00b6f7454ada 1346 /*Cb*/pc.printf( "%d,", 128);//5
TetsuyaKonno 0:00b6f7454ada 1347 /*Cr*/pc.printf( "%d,", 128);//7
TetsuyaKonno 0:00b6f7454ada 1348 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1349 }
TetsuyaKonno 0:00b6f7454ada 1350 }
TetsuyaKonno 0:00b6f7454ada 1351 break;
TetsuyaKonno 0:00b6f7454ada 1352 case BINARY:
TetsuyaKonno 0:00b6f7454ada 1353 //YCBCR_422 Binary
TetsuyaKonno 0:00b6f7454ada 1354 for( Y = 0; Y < VW; Y++ ){
TetsuyaKonno 0:00b6f7454ada 1355 for( X = 0; X < HW; X+=2 ){
TetsuyaKonno 0:00b6f7454ada 1356 pc.printf( "#YCbCr," );
TetsuyaKonno 0:00b6f7454ada 1357 /*Xp*/pc.printf( "%d,", X);
TetsuyaKonno 0:00b6f7454ada 1358 /*Yp*/pc.printf( "%d,", Y);
TetsuyaKonno 0:00b6f7454ada 1359 value = ImageData[ ( Y * HW ) + ( X + 0 ) ];
TetsuyaKonno 0:00b6f7454ada 1360 if( value ) value = 255;
TetsuyaKonno 0:00b6f7454ada 1361 else value = 0;
TetsuyaKonno 0:00b6f7454ada 1362 /*Y0*/pc.printf( "%d,", value );//6
TetsuyaKonno 0:00b6f7454ada 1363 /*Cb*/pc.printf( "%d,", 128);//5
TetsuyaKonno 0:00b6f7454ada 1364 /*Cr*/pc.printf( "%d,", 128);//7
TetsuyaKonno 0:00b6f7454ada 1365 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1366
TetsuyaKonno 0:00b6f7454ada 1367 pc.printf( "#YCbCr," );
TetsuyaKonno 0:00b6f7454ada 1368 /*Xp*/pc.printf( "%d,", X+1);
TetsuyaKonno 0:00b6f7454ada 1369 /*Yp*/pc.printf( "%d,", Y);
TetsuyaKonno 0:00b6f7454ada 1370 value = ImageData[ ( Y * HW ) + ( X + 1 ) ];
TetsuyaKonno 0:00b6f7454ada 1371 if( value ) value = 255;
TetsuyaKonno 0:00b6f7454ada 1372 else value = 0;
TetsuyaKonno 0:00b6f7454ada 1373 /*Y1*/pc.printf( "%d,", value );//4
TetsuyaKonno 0:00b6f7454ada 1374 /*Cb*/pc.printf( "%d,", 128);//5
TetsuyaKonno 0:00b6f7454ada 1375 /*Cr*/pc.printf( "%d,", 128);//7
TetsuyaKonno 0:00b6f7454ada 1376 pc.printf( "\n\r" );
TetsuyaKonno 0:00b6f7454ada 1377 }
TetsuyaKonno 0:00b6f7454ada 1378 }
TetsuyaKonno 0:00b6f7454ada 1379 break;
TetsuyaKonno 0:00b6f7454ada 1380 default:
TetsuyaKonno 0:00b6f7454ada 1381 break;
TetsuyaKonno 0:00b6f7454ada 1382 }
TetsuyaKonno 0:00b6f7454ada 1383 pc.printf( "End\n\r" );
TetsuyaKonno 0:00b6f7454ada 1384 }
TetsuyaKonno 0:00b6f7454ada 1385
TetsuyaKonno 0:00b6f7454ada 1386 //------------------------------------------------------------------//
TetsuyaKonno 0:00b6f7454ada 1387 // End of file
TetsuyaKonno 0:00b6f7454ada 1388 //------------------------------------------------------------------//