This program supports the Image processing micon car production kit (M-S348).
Dependencies: GR-PEACH_video mbed
main.cpp@0:00b6f7454ada, 2018-10-30 (annotated)
- Committer:
- TetsuyaKonno
- Date:
- Tue Oct 30 09:06:30 2018 +0000
- Revision:
- 0:00b6f7454ada
New program file
Who changed what in which revision?
User | Revision | Line number | New 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 | //------------------------------------------------------------------// |