This program is line trace program by image processing.
Dependencies: GR-PEACH_video mbed
main.cpp@0:98993ca640e2, 2016-09-02 (annotated)
- Committer:
- TetsuyaKonno
- Date:
- Fri Sep 02 07:26:12 2016 +0000
- Revision:
- 0:98993ca640e2
First program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TetsuyaKonno | 0:98993ca640e2 | 1 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 2 | //Supported MCU: RZ/A1H |
TetsuyaKonno | 0:98993ca640e2 | 3 | //File Contents: Trace Program by Image Processing |
TetsuyaKonno | 0:98993ca640e2 | 4 | // (GR-PEACH version on the Micon Car) |
TetsuyaKonno | 0:98993ca640e2 | 5 | //Version number: Ver.1.01 |
TetsuyaKonno | 0:98993ca640e2 | 6 | //Date: 2016.07.20 |
TetsuyaKonno | 0:98993ca640e2 | 7 | //Copyright: Renesas Electronics Corporation |
TetsuyaKonno | 0:98993ca640e2 | 8 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 9 | |
TetsuyaKonno | 0:98993ca640e2 | 10 | //This program supports the following boards: |
TetsuyaKonno | 0:98993ca640e2 | 11 | //* GR-PEACH(E version) |
TetsuyaKonno | 0:98993ca640e2 | 12 | //* Motor drive board Ver.5 |
TetsuyaKonno | 0:98993ca640e2 | 13 | //* Camera module (SC-310) |
TetsuyaKonno | 0:98993ca640e2 | 14 | |
TetsuyaKonno | 0:98993ca640e2 | 15 | //Include |
TetsuyaKonno | 0:98993ca640e2 | 16 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 17 | #include "mbed.h" |
TetsuyaKonno | 0:98993ca640e2 | 18 | #include "math.h" |
TetsuyaKonno | 0:98993ca640e2 | 19 | #include "iodefine.h" |
TetsuyaKonno | 0:98993ca640e2 | 20 | #include "DisplayBace.h" |
TetsuyaKonno | 0:98993ca640e2 | 21 | |
TetsuyaKonno | 0:98993ca640e2 | 22 | //Define |
TetsuyaKonno | 0:98993ca640e2 | 23 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 24 | //Motor PWM cycle |
TetsuyaKonno | 0:98993ca640e2 | 25 | #define MOTOR_PWM_CYCLE 33332 /* Motor PWM period */ |
TetsuyaKonno | 0:98993ca640e2 | 26 | /* 1ms P0φ/1 = 0.03us */ |
TetsuyaKonno | 0:98993ca640e2 | 27 | //Motor speed |
TetsuyaKonno | 0:98993ca640e2 | 28 | #define MAX_SPEED 40 /* motor() set: 0 to 100 */ |
TetsuyaKonno | 0:98993ca640e2 | 29 | |
TetsuyaKonno | 0:98993ca640e2 | 30 | //Servo PWM cycle |
TetsuyaKonno | 0:98993ca640e2 | 31 | #define SERVO_PWM_CYCLE 33332 /* SERVO PWM period */ |
TetsuyaKonno | 0:98993ca640e2 | 32 | /* 16ms P0φ/16 = 0.48us */ |
TetsuyaKonno | 0:98993ca640e2 | 33 | #define SERVO_CENTER 3124 /* 1.5ms / 0.48us - 1 = 3124*/ |
TetsuyaKonno | 0:98993ca640e2 | 34 | #define HANDLE_STEP 18 /* 1 degree value */ |
TetsuyaKonno | 0:98993ca640e2 | 35 | |
TetsuyaKonno | 0:98993ca640e2 | 36 | //LED Color on GR-PEACH |
TetsuyaKonno | 0:98993ca640e2 | 37 | #define LED_OFF 0x00 |
TetsuyaKonno | 0:98993ca640e2 | 38 | #define LED_RED 0x01 |
TetsuyaKonno | 0:98993ca640e2 | 39 | #define LED_GREEN 0x02 |
TetsuyaKonno | 0:98993ca640e2 | 40 | #define LED_YELLOW 0x03 |
TetsuyaKonno | 0:98993ca640e2 | 41 | #define LED_BLUE 0x04 |
TetsuyaKonno | 0:98993ca640e2 | 42 | #define LED_PURPLE 0x05 |
TetsuyaKonno | 0:98993ca640e2 | 43 | #define LED_SKYBLUE 0x06 |
TetsuyaKonno | 0:98993ca640e2 | 44 | #define LED_WHITE 0x07 |
TetsuyaKonno | 0:98993ca640e2 | 45 | |
TetsuyaKonno | 0:98993ca640e2 | 46 | //Status |
TetsuyaKonno | 0:98993ca640e2 | 47 | #define RUN 0x00 |
TetsuyaKonno | 0:98993ca640e2 | 48 | #define SENSOR 0x01 |
TetsuyaKonno | 0:98993ca640e2 | 49 | #define MARK_T 0x02 |
TetsuyaKonno | 0:98993ca640e2 | 50 | #define MARK_C 0x03 |
TetsuyaKonno | 0:98993ca640e2 | 51 | #define MARK_R 0x04 |
TetsuyaKonno | 0:98993ca640e2 | 52 | #define MARK_L 0x05 |
TetsuyaKonno | 0:98993ca640e2 | 53 | #define STOP 0x06 |
TetsuyaKonno | 0:98993ca640e2 | 54 | #define ERROR 0xff |
TetsuyaKonno | 0:98993ca640e2 | 55 | |
TetsuyaKonno | 0:98993ca640e2 | 56 | //Define(NTSC-Video) |
TetsuyaKonno | 0:98993ca640e2 | 57 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 58 | #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0) |
TetsuyaKonno | 0:98993ca640e2 | 59 | #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD) |
TetsuyaKonno | 0:98993ca640e2 | 60 | #define DATA_SIZE_PER_PIC (2u) |
TetsuyaKonno | 0:98993ca640e2 | 61 | |
TetsuyaKonno | 0:98993ca640e2 | 62 | /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128 |
TetsuyaKonno | 0:98993ca640e2 | 63 | in accordance with the frame buffer burst transfer mode. */ |
TetsuyaKonno | 0:98993ca640e2 | 64 | #define PIXEL_HW (320u) /* QVGA */ |
TetsuyaKonno | 0:98993ca640e2 | 65 | #define PIXEL_VW (240u) /* QVGA */ |
TetsuyaKonno | 0:98993ca640e2 | 66 | #define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u) |
TetsuyaKonno | 0:98993ca640e2 | 67 | #define VIDEO_BUFFER_HEIGHT (PIXEL_VW) |
TetsuyaKonno | 0:98993ca640e2 | 68 | |
TetsuyaKonno | 0:98993ca640e2 | 69 | //Constructor |
TetsuyaKonno | 0:98993ca640e2 | 70 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 71 | Ticker interrput; |
TetsuyaKonno | 0:98993ca640e2 | 72 | Serial pc(USBTX, USBRX); |
TetsuyaKonno | 0:98993ca640e2 | 73 | DigitalOut LED_R(P6_13); /* LED1 on the GR-PEACH board */ |
TetsuyaKonno | 0:98993ca640e2 | 74 | DigitalOut LED_G(P6_14); /* LED2 on the GR-PEACH board */ |
TetsuyaKonno | 0:98993ca640e2 | 75 | DigitalOut LED_B(P6_15); /* LED3 on the GR-PEACH board */ |
TetsuyaKonno | 0:98993ca640e2 | 76 | DigitalIn user_botton(P6_0); /* SW1 on the GR-PEACH board */ |
TetsuyaKonno | 0:98993ca640e2 | 77 | |
TetsuyaKonno | 0:98993ca640e2 | 78 | DigitalOut Left_motor_signal(P4_6); /* Used by motor fanction */ |
TetsuyaKonno | 0:98993ca640e2 | 79 | DigitalOut Right_motor_signal(P4_7); /* Used by motor fanction */ |
TetsuyaKonno | 0:98993ca640e2 | 80 | DigitalIn push_sw(P2_13); /* SW1 on the Motor Drive board */ |
TetsuyaKonno | 0:98993ca640e2 | 81 | DigitalOut LED_3(P2_14); /* LED3 on the Motor Drive board */ |
TetsuyaKonno | 0:98993ca640e2 | 82 | DigitalOut LED_2(P2_15); /* LED2 on the Motor Drive board */ |
TetsuyaKonno | 0:98993ca640e2 | 83 | |
TetsuyaKonno | 0:98993ca640e2 | 84 | //Prototype |
TetsuyaKonno | 0:98993ca640e2 | 85 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 86 | //Peripheral functions |
TetsuyaKonno | 0:98993ca640e2 | 87 | void init_MTU2_PWM_Motor( void ); /* Initialize PWM functions */ |
TetsuyaKonno | 0:98993ca640e2 | 88 | void init_MTU2_PWM_Servo( void ); /* Initialize PWM functions */ |
TetsuyaKonno | 0:98993ca640e2 | 89 | void intTimer( void ); /* Interrupt fanction */ |
TetsuyaKonno | 0:98993ca640e2 | 90 | |
TetsuyaKonno | 0:98993ca640e2 | 91 | //GR-peach board |
TetsuyaKonno | 0:98993ca640e2 | 92 | void led_rgb(int led); |
TetsuyaKonno | 0:98993ca640e2 | 93 | unsigned int user_button_get( void ); |
TetsuyaKonno | 0:98993ca640e2 | 94 | |
TetsuyaKonno | 0:98993ca640e2 | 95 | //Motor drive board |
TetsuyaKonno | 0:98993ca640e2 | 96 | void led_out(int led); |
TetsuyaKonno | 0:98993ca640e2 | 97 | unsigned int pushsw_get( void ); |
TetsuyaKonno | 0:98993ca640e2 | 98 | void motor( int accele_l, int accele_r ); |
TetsuyaKonno | 0:98993ca640e2 | 99 | void handle( int angle ); |
TetsuyaKonno | 0:98993ca640e2 | 100 | int diff( int pwm ); |
TetsuyaKonno | 0:98993ca640e2 | 101 | |
TetsuyaKonno | 0:98993ca640e2 | 102 | //Interrupt function |
TetsuyaKonno | 0:98993ca640e2 | 103 | void led_status_process( void ); /* Function for only interrupt */ |
TetsuyaKonno | 0:98993ca640e2 | 104 | void led_status_set( int set ); |
TetsuyaKonno | 0:98993ca640e2 | 105 | |
TetsuyaKonno | 0:98993ca640e2 | 106 | //Prototype(NTSC-video) |
TetsuyaKonno | 0:98993ca640e2 | 107 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 108 | static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type); |
TetsuyaKonno | 0:98993ca640e2 | 109 | static void WaitVfield(const int32_t wait_count); |
TetsuyaKonno | 0:98993ca640e2 | 110 | static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type); |
TetsuyaKonno | 0:98993ca640e2 | 111 | static void WaitVsync(const int32_t wait_count); |
TetsuyaKonno | 0:98993ca640e2 | 112 | |
TetsuyaKonno | 0:98993ca640e2 | 113 | //Prototype(Display Debug) |
TetsuyaKonno | 0:98993ca640e2 | 114 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 115 | void ImageData_Serial_Out( unsigned char *Data_Y, int Width ); |
TetsuyaKonno | 0:98993ca640e2 | 116 | void ImageData_Serial_Out2( unsigned char *Data_Y, int Width ); |
TetsuyaKonno | 0:98993ca640e2 | 117 | void ImageData_Serial_Out3( void ); |
TetsuyaKonno | 0:98993ca640e2 | 118 | |
TetsuyaKonno | 0:98993ca640e2 | 119 | //Prototype(Trace by Image Processing) |
TetsuyaKonno | 0:98993ca640e2 | 120 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 121 | int CenterLine_Corrective( unsigned char *Binary ); |
TetsuyaKonno | 0:98993ca640e2 | 122 | void change_framebuffer_process( void ); /* Function for only interrupt */ |
TetsuyaKonno | 0:98993ca640e2 | 123 | void digital_sensor_process( unsigned char *Binary ); /* Function for only interrupt */ |
TetsuyaKonno | 0:98993ca640e2 | 124 | unsigned char digital_sensor( void ); |
TetsuyaKonno | 0:98993ca640e2 | 125 | |
TetsuyaKonno | 0:98993ca640e2 | 126 | //Prototype(Mark detection) |
TetsuyaKonno | 0:98993ca640e2 | 127 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 128 | void Image_Extraction( unsigned char *Data_Y ); |
TetsuyaKonno | 0:98993ca640e2 | 129 | void Image_Compression2( unsigned char *Data_Y, int Data_W , unsigned char *Comp_Y, int Comp_M ); |
TetsuyaKonno | 0:98993ca640e2 | 130 | void Binarization_process( unsigned char *Comp_Y, unsigned char *Binary, long items ); |
TetsuyaKonno | 0:98993ca640e2 | 131 | |
TetsuyaKonno | 0:98993ca640e2 | 132 | //Globle |
TetsuyaKonno | 0:98993ca640e2 | 133 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 134 | volatile unsigned long cnt0; /* Used by timer function */ |
TetsuyaKonno | 0:98993ca640e2 | 135 | volatile unsigned long cnt1; /* Used within main */ |
TetsuyaKonno | 0:98993ca640e2 | 136 | volatile int pattern; /* Pattern numbers */ |
TetsuyaKonno | 0:98993ca640e2 | 137 | volatile int status_set; /* Status */ |
TetsuyaKonno | 0:98993ca640e2 | 138 | volatile int handle_buff; |
TetsuyaKonno | 0:98993ca640e2 | 139 | |
TetsuyaKonno | 0:98993ca640e2 | 140 | const int revolution_difference[] = { |
TetsuyaKonno | 0:98993ca640e2 | 141 | 100, 98, 97, 95, 93, |
TetsuyaKonno | 0:98993ca640e2 | 142 | 92, 90, 88, 87, 85, |
TetsuyaKonno | 0:98993ca640e2 | 143 | 84, 82, 81, 79, 78, |
TetsuyaKonno | 0:98993ca640e2 | 144 | 76, 75, 73, 72, 71, |
TetsuyaKonno | 0:98993ca640e2 | 145 | 69, 68, 66, 65, 64, |
TetsuyaKonno | 0:98993ca640e2 | 146 | 62, 61, 59, 58, 57, |
TetsuyaKonno | 0:98993ca640e2 | 147 | 55, 54, 52, 51, 50, |
TetsuyaKonno | 0:98993ca640e2 | 148 | 48, 47, 45, 44, 42, |
TetsuyaKonno | 0:98993ca640e2 | 149 | 41, 39, 38, 36, 35, |
TetsuyaKonno | 0:98993ca640e2 | 150 | 33 }; |
TetsuyaKonno | 0:98993ca640e2 | 151 | |
TetsuyaKonno | 0:98993ca640e2 | 152 | /* Trace by image processing */ |
TetsuyaKonno | 0:98993ca640e2 | 153 | volatile int Sensor_X[8][6]; |
TetsuyaKonno | 0:98993ca640e2 | 154 | volatile unsigned char sensor_value; |
TetsuyaKonno | 0:98993ca640e2 | 155 | |
TetsuyaKonno | 0:98993ca640e2 | 156 | /* Mark detection */ |
TetsuyaKonno | 0:98993ca640e2 | 157 | unsigned char ImageData[320*240]; |
TetsuyaKonno | 0:98993ca640e2 | 158 | unsigned char ImageComp[160*120]; |
TetsuyaKonno | 0:98993ca640e2 | 159 | unsigned char ImageBinary[160*120]; |
TetsuyaKonno | 0:98993ca640e2 | 160 | |
TetsuyaKonno | 0:98993ca640e2 | 161 | int Xt, Yt; |
TetsuyaKonno | 0:98993ca640e2 | 162 | int Xc, Yc; |
TetsuyaKonno | 0:98993ca640e2 | 163 | int Xr, Yr; |
TetsuyaKonno | 0:98993ca640e2 | 164 | int Xl, Yl; |
TetsuyaKonno | 0:98993ca640e2 | 165 | |
TetsuyaKonno | 0:98993ca640e2 | 166 | //Globle(NTSC-video) |
TetsuyaKonno | 0:98993ca640e2 | 167 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 168 | static uint8_t FrameBuffer_Video_A[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!; |
TetsuyaKonno | 0:98993ca640e2 | 169 | static uint8_t FrameBuffer_Video_B[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!; |
TetsuyaKonno | 0:98993ca640e2 | 170 | static volatile int32_t vsync_count; |
TetsuyaKonno | 0:98993ca640e2 | 171 | static volatile int32_t vfield_count; |
TetsuyaKonno | 0:98993ca640e2 | 172 | uint8_t * write_buff_addr = FrameBuffer_Video_A; |
TetsuyaKonno | 0:98993ca640e2 | 173 | uint8_t * save_buff_addr = FrameBuffer_Video_B; |
TetsuyaKonno | 0:98993ca640e2 | 174 | |
TetsuyaKonno | 0:98993ca640e2 | 175 | //Main |
TetsuyaKonno | 0:98993ca640e2 | 176 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 177 | int main( void ) |
TetsuyaKonno | 0:98993ca640e2 | 178 | { |
TetsuyaKonno | 0:98993ca640e2 | 179 | /* NTSC-Video */ |
TetsuyaKonno | 0:98993ca640e2 | 180 | DisplayBase::graphics_error_t error; |
TetsuyaKonno | 0:98993ca640e2 | 181 | |
TetsuyaKonno | 0:98993ca640e2 | 182 | /* Create DisplayBase object */ |
TetsuyaKonno | 0:98993ca640e2 | 183 | DisplayBase Display; |
TetsuyaKonno | 0:98993ca640e2 | 184 | |
TetsuyaKonno | 0:98993ca640e2 | 185 | /* Graphics initialization process */ |
TetsuyaKonno | 0:98993ca640e2 | 186 | error = Display.Graphics_init(NULL); |
TetsuyaKonno | 0:98993ca640e2 | 187 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 188 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 189 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 190 | } |
TetsuyaKonno | 0:98993ca640e2 | 191 | |
TetsuyaKonno | 0:98993ca640e2 | 192 | error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL); |
TetsuyaKonno | 0:98993ca640e2 | 193 | if( error != DisplayBase::GRAPHICS_OK ) { |
TetsuyaKonno | 0:98993ca640e2 | 194 | while(1); |
TetsuyaKonno | 0:98993ca640e2 | 195 | } |
TetsuyaKonno | 0:98993ca640e2 | 196 | |
TetsuyaKonno | 0:98993ca640e2 | 197 | /* Interrupt callback function setting (Vsync signal input to scaler 0) */ |
TetsuyaKonno | 0:98993ca640e2 | 198 | error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VI_VSYNC, 0, IntCallbackFunc_Vsync); |
TetsuyaKonno | 0:98993ca640e2 | 199 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 200 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 201 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 202 | } |
TetsuyaKonno | 0:98993ca640e2 | 203 | |
TetsuyaKonno | 0:98993ca640e2 | 204 | /* Video capture setting (progressive form fixed) */ |
TetsuyaKonno | 0:98993ca640e2 | 205 | error = Display.Video_Write_Setting( |
TetsuyaKonno | 0:98993ca640e2 | 206 | VIDEO_INPUT_CH, |
TetsuyaKonno | 0:98993ca640e2 | 207 | DisplayBase::COL_SYS_NTSC_358, |
TetsuyaKonno | 0:98993ca640e2 | 208 | write_buff_addr, |
TetsuyaKonno | 0:98993ca640e2 | 209 | VIDEO_BUFFER_STRIDE, |
TetsuyaKonno | 0:98993ca640e2 | 210 | DisplayBase::VIDEO_FORMAT_YCBCR422, |
TetsuyaKonno | 0:98993ca640e2 | 211 | DisplayBase::WR_RD_WRSWA_32_16BIT, |
TetsuyaKonno | 0:98993ca640e2 | 212 | PIXEL_VW, |
TetsuyaKonno | 0:98993ca640e2 | 213 | PIXEL_HW |
TetsuyaKonno | 0:98993ca640e2 | 214 | ); |
TetsuyaKonno | 0:98993ca640e2 | 215 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 216 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 217 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 218 | } |
TetsuyaKonno | 0:98993ca640e2 | 219 | |
TetsuyaKonno | 0:98993ca640e2 | 220 | /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */ |
TetsuyaKonno | 0:98993ca640e2 | 221 | error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield); |
TetsuyaKonno | 0:98993ca640e2 | 222 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 223 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 224 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 225 | } |
TetsuyaKonno | 0:98993ca640e2 | 226 | |
TetsuyaKonno | 0:98993ca640e2 | 227 | /* Video write process start */ |
TetsuyaKonno | 0:98993ca640e2 | 228 | error = Display.Video_Start (VIDEO_INPUT_CH); |
TetsuyaKonno | 0:98993ca640e2 | 229 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 230 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 231 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 232 | } |
TetsuyaKonno | 0:98993ca640e2 | 233 | |
TetsuyaKonno | 0:98993ca640e2 | 234 | /* Video write process stop */ |
TetsuyaKonno | 0:98993ca640e2 | 235 | error = Display.Video_Stop (VIDEO_INPUT_CH); |
TetsuyaKonno | 0:98993ca640e2 | 236 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 237 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 238 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 239 | } |
TetsuyaKonno | 0:98993ca640e2 | 240 | |
TetsuyaKonno | 0:98993ca640e2 | 241 | /* Video write process start */ |
TetsuyaKonno | 0:98993ca640e2 | 242 | error = Display.Video_Start (VIDEO_INPUT_CH); |
TetsuyaKonno | 0:98993ca640e2 | 243 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 244 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 245 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 246 | } |
TetsuyaKonno | 0:98993ca640e2 | 247 | |
TetsuyaKonno | 0:98993ca640e2 | 248 | /* Wait vsync to update resister */ |
TetsuyaKonno | 0:98993ca640e2 | 249 | WaitVsync(1); |
TetsuyaKonno | 0:98993ca640e2 | 250 | |
TetsuyaKonno | 0:98993ca640e2 | 251 | /* Wait 2 Vfield(Top or bottom field) */ |
TetsuyaKonno | 0:98993ca640e2 | 252 | WaitVfield(2); |
TetsuyaKonno | 0:98993ca640e2 | 253 | |
TetsuyaKonno | 0:98993ca640e2 | 254 | /* Initialize MCU functions */ |
TetsuyaKonno | 0:98993ca640e2 | 255 | init_MTU2_PWM_Motor(); |
TetsuyaKonno | 0:98993ca640e2 | 256 | init_MTU2_PWM_Servo(); |
TetsuyaKonno | 0:98993ca640e2 | 257 | interrput.attach(&intTimer, 0.001); |
TetsuyaKonno | 0:98993ca640e2 | 258 | pc.baud(230400); |
TetsuyaKonno | 0:98993ca640e2 | 259 | |
TetsuyaKonno | 0:98993ca640e2 | 260 | /* Initialize Micon Car state */ |
TetsuyaKonno | 0:98993ca640e2 | 261 | led_out( 0x0 ); |
TetsuyaKonno | 0:98993ca640e2 | 262 | handle( 0 ); |
TetsuyaKonno | 0:98993ca640e2 | 263 | motor( 0, 0 ); |
TetsuyaKonno | 0:98993ca640e2 | 264 | |
TetsuyaKonno | 0:98993ca640e2 | 265 | /* wait to stabilize NTSC signal (about 170ms) */ |
TetsuyaKonno | 0:98993ca640e2 | 266 | wait(0.2); |
TetsuyaKonno | 0:98993ca640e2 | 267 | |
TetsuyaKonno | 0:98993ca640e2 | 268 | led_status_set( SENSOR ); |
TetsuyaKonno | 0:98993ca640e2 | 269 | CenterLine_Corrective( ImageBinary ); |
TetsuyaKonno | 0:98993ca640e2 | 270 | if( pushsw_get() ) { |
TetsuyaKonno | 0:98993ca640e2 | 271 | while( 1 ){ |
TetsuyaKonno | 0:98993ca640e2 | 272 | ImageData_Serial_Out2( ImageBinary, 20 ); |
TetsuyaKonno | 0:98993ca640e2 | 273 | } |
TetsuyaKonno | 0:98993ca640e2 | 274 | } |
TetsuyaKonno | 0:98993ca640e2 | 275 | led_status_set( RUN ); |
TetsuyaKonno | 0:98993ca640e2 | 276 | |
TetsuyaKonno | 0:98993ca640e2 | 277 | while(1) { |
TetsuyaKonno | 0:98993ca640e2 | 278 | |
TetsuyaKonno | 0:98993ca640e2 | 279 | switch( pattern ) { |
TetsuyaKonno | 0:98993ca640e2 | 280 | /***************************************************************** |
TetsuyaKonno | 0:98993ca640e2 | 281 | About patern |
TetsuyaKonno | 0:98993ca640e2 | 282 | 0:wait for switch input |
TetsuyaKonno | 0:98993ca640e2 | 283 | 1:check if start bar is open |
TetsuyaKonno | 0:98993ca640e2 | 284 | 11:normal trace |
TetsuyaKonno | 0:98993ca640e2 | 285 | *****************************************************************/ |
TetsuyaKonno | 0:98993ca640e2 | 286 | case 0: |
TetsuyaKonno | 0:98993ca640e2 | 287 | /* wait for switch input */ |
TetsuyaKonno | 0:98993ca640e2 | 288 | if( pushsw_get() ) { |
TetsuyaKonno | 0:98993ca640e2 | 289 | led_out( 0x0 ); |
TetsuyaKonno | 0:98993ca640e2 | 290 | led_status_set( RUN ); |
TetsuyaKonno | 0:98993ca640e2 | 291 | pattern = 11; |
TetsuyaKonno | 0:98993ca640e2 | 292 | cnt1 = 0; |
TetsuyaKonno | 0:98993ca640e2 | 293 | break; |
TetsuyaKonno | 0:98993ca640e2 | 294 | } |
TetsuyaKonno | 0:98993ca640e2 | 295 | if( cnt1 < 100 ) { |
TetsuyaKonno | 0:98993ca640e2 | 296 | led_out( 0x1 ); |
TetsuyaKonno | 0:98993ca640e2 | 297 | } else if( cnt1 < 200 ) { |
TetsuyaKonno | 0:98993ca640e2 | 298 | led_out( 0x2 ); |
TetsuyaKonno | 0:98993ca640e2 | 299 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 300 | cnt1 = 0; |
TetsuyaKonno | 0:98993ca640e2 | 301 | } |
TetsuyaKonno | 0:98993ca640e2 | 302 | break; |
TetsuyaKonno | 0:98993ca640e2 | 303 | |
TetsuyaKonno | 0:98993ca640e2 | 304 | case 11: |
TetsuyaKonno | 0:98993ca640e2 | 305 | /* normal trace */ |
TetsuyaKonno | 0:98993ca640e2 | 306 | switch( (digital_sensor()&0x0f) ) { |
TetsuyaKonno | 0:98993ca640e2 | 307 | case 0x00: |
TetsuyaKonno | 0:98993ca640e2 | 308 | handle( 0 ); |
TetsuyaKonno | 0:98993ca640e2 | 309 | motor( 100, 100 ); |
TetsuyaKonno | 0:98993ca640e2 | 310 | break; |
TetsuyaKonno | 0:98993ca640e2 | 311 | case 0x02: |
TetsuyaKonno | 0:98993ca640e2 | 312 | handle( 3 ); |
TetsuyaKonno | 0:98993ca640e2 | 313 | motor( 100, diff(100) ); |
TetsuyaKonno | 0:98993ca640e2 | 314 | break; |
TetsuyaKonno | 0:98993ca640e2 | 315 | case 0x03: |
TetsuyaKonno | 0:98993ca640e2 | 316 | handle( 12 ); |
TetsuyaKonno | 0:98993ca640e2 | 317 | motor( 100, diff(100) ); |
TetsuyaKonno | 0:98993ca640e2 | 318 | break; |
TetsuyaKonno | 0:98993ca640e2 | 319 | case 0x01: |
TetsuyaKonno | 0:98993ca640e2 | 320 | handle( 20 ); |
TetsuyaKonno | 0:98993ca640e2 | 321 | motor( 100, diff(100) ); |
TetsuyaKonno | 0:98993ca640e2 | 322 | pattern = 12; |
TetsuyaKonno | 0:98993ca640e2 | 323 | break; |
TetsuyaKonno | 0:98993ca640e2 | 324 | case 0x04: |
TetsuyaKonno | 0:98993ca640e2 | 325 | handle( -3 ); |
TetsuyaKonno | 0:98993ca640e2 | 326 | motor( diff(100), 100 ); |
TetsuyaKonno | 0:98993ca640e2 | 327 | break; |
TetsuyaKonno | 0:98993ca640e2 | 328 | case 0x0c: |
TetsuyaKonno | 0:98993ca640e2 | 329 | handle( -12 ); |
TetsuyaKonno | 0:98993ca640e2 | 330 | motor( diff(100), 100 ); |
TetsuyaKonno | 0:98993ca640e2 | 331 | break; |
TetsuyaKonno | 0:98993ca640e2 | 332 | case 0x08: |
TetsuyaKonno | 0:98993ca640e2 | 333 | handle( -20 ); |
TetsuyaKonno | 0:98993ca640e2 | 334 | motor( diff(100), 100 ); |
TetsuyaKonno | 0:98993ca640e2 | 335 | pattern = 13; |
TetsuyaKonno | 0:98993ca640e2 | 336 | break; |
TetsuyaKonno | 0:98993ca640e2 | 337 | default: |
TetsuyaKonno | 0:98993ca640e2 | 338 | break; |
TetsuyaKonno | 0:98993ca640e2 | 339 | } |
TetsuyaKonno | 0:98993ca640e2 | 340 | break; |
TetsuyaKonno | 0:98993ca640e2 | 341 | |
TetsuyaKonno | 0:98993ca640e2 | 342 | case 12: |
TetsuyaKonno | 0:98993ca640e2 | 343 | /* Left side */ |
TetsuyaKonno | 0:98993ca640e2 | 344 | if( (digital_sensor()&0x02) == 0x02 ) { |
TetsuyaKonno | 0:98993ca640e2 | 345 | pattern = 11; |
TetsuyaKonno | 0:98993ca640e2 | 346 | break; |
TetsuyaKonno | 0:98993ca640e2 | 347 | } |
TetsuyaKonno | 0:98993ca640e2 | 348 | switch( (digital_sensor()&0x0f) ) { |
TetsuyaKonno | 0:98993ca640e2 | 349 | case 0x01: |
TetsuyaKonno | 0:98993ca640e2 | 350 | handle( 20 ); |
TetsuyaKonno | 0:98993ca640e2 | 351 | motor( 100, diff(100) ); |
TetsuyaKonno | 0:98993ca640e2 | 352 | break; |
TetsuyaKonno | 0:98993ca640e2 | 353 | case 0x00: |
TetsuyaKonno | 0:98993ca640e2 | 354 | case 0x08: |
TetsuyaKonno | 0:98993ca640e2 | 355 | case 0x0c: |
TetsuyaKonno | 0:98993ca640e2 | 356 | handle( 22 ); |
TetsuyaKonno | 0:98993ca640e2 | 357 | motor( 100, diff(100) ); |
TetsuyaKonno | 0:98993ca640e2 | 358 | break; |
TetsuyaKonno | 0:98993ca640e2 | 359 | default: |
TetsuyaKonno | 0:98993ca640e2 | 360 | break; |
TetsuyaKonno | 0:98993ca640e2 | 361 | } |
TetsuyaKonno | 0:98993ca640e2 | 362 | break; |
TetsuyaKonno | 0:98993ca640e2 | 363 | |
TetsuyaKonno | 0:98993ca640e2 | 364 | case 13: |
TetsuyaKonno | 0:98993ca640e2 | 365 | /* right side */ |
TetsuyaKonno | 0:98993ca640e2 | 366 | if( (digital_sensor()&0x04) == 0x04 ) { |
TetsuyaKonno | 0:98993ca640e2 | 367 | pattern = 11; |
TetsuyaKonno | 0:98993ca640e2 | 368 | } |
TetsuyaKonno | 0:98993ca640e2 | 369 | switch( (digital_sensor()&0x0f) ) { |
TetsuyaKonno | 0:98993ca640e2 | 370 | case 0x08: |
TetsuyaKonno | 0:98993ca640e2 | 371 | handle( -20 ); |
TetsuyaKonno | 0:98993ca640e2 | 372 | motor( diff(100), 100 ); |
TetsuyaKonno | 0:98993ca640e2 | 373 | break; |
TetsuyaKonno | 0:98993ca640e2 | 374 | case 0x00: |
TetsuyaKonno | 0:98993ca640e2 | 375 | case 0x01: |
TetsuyaKonno | 0:98993ca640e2 | 376 | case 0x03: |
TetsuyaKonno | 0:98993ca640e2 | 377 | handle( -22 ); |
TetsuyaKonno | 0:98993ca640e2 | 378 | motor( diff(100), 100 ); |
TetsuyaKonno | 0:98993ca640e2 | 379 | break; |
TetsuyaKonno | 0:98993ca640e2 | 380 | default: |
TetsuyaKonno | 0:98993ca640e2 | 381 | break; |
TetsuyaKonno | 0:98993ca640e2 | 382 | } |
TetsuyaKonno | 0:98993ca640e2 | 383 | break; |
TetsuyaKonno | 0:98993ca640e2 | 384 | |
TetsuyaKonno | 0:98993ca640e2 | 385 | default: |
TetsuyaKonno | 0:98993ca640e2 | 386 | break; |
TetsuyaKonno | 0:98993ca640e2 | 387 | } |
TetsuyaKonno | 0:98993ca640e2 | 388 | } |
TetsuyaKonno | 0:98993ca640e2 | 389 | } |
TetsuyaKonno | 0:98993ca640e2 | 390 | |
TetsuyaKonno | 0:98993ca640e2 | 391 | //Initialize MTU2 PWM functions |
TetsuyaKonno | 0:98993ca640e2 | 392 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 393 | //MTU2_3, MTU2_4 |
TetsuyaKonno | 0:98993ca640e2 | 394 | //Reset-Synchronized PWM mode |
TetsuyaKonno | 0:98993ca640e2 | 395 | //TIOC4A(P4_4) :Left-motor |
TetsuyaKonno | 0:98993ca640e2 | 396 | //TIOC4B(P4_5) :Right-motor |
TetsuyaKonno | 0:98993ca640e2 | 397 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 398 | void init_MTU2_PWM_Motor( void ) |
TetsuyaKonno | 0:98993ca640e2 | 399 | { |
TetsuyaKonno | 0:98993ca640e2 | 400 | /* Port setting for S/W I/O Contorol */ |
TetsuyaKonno | 0:98993ca640e2 | 401 | /* alternative mode */ |
TetsuyaKonno | 0:98993ca640e2 | 402 | |
TetsuyaKonno | 0:98993ca640e2 | 403 | /* MTU2_4 (P4_4)(P4_5) */ |
TetsuyaKonno | 0:98993ca640e2 | 404 | GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/ |
TetsuyaKonno | 0:98993ca640e2 | 405 | GPIOPFCAE4 &= 0xffcf; /* The alternative function of a pin */ |
TetsuyaKonno | 0:98993ca640e2 | 406 | GPIOPFCE4 |= 0x0030; /* The alternative function of a pin */ |
TetsuyaKonno | 0:98993ca640e2 | 407 | GPIOPFC4 &= 0xffcf; /* The alternative function of a pin */ |
TetsuyaKonno | 0:98993ca640e2 | 408 | /* 2nd altemative function/output */ |
TetsuyaKonno | 0:98993ca640e2 | 409 | GPIOP4 &= 0xffcf; /* */ |
TetsuyaKonno | 0:98993ca640e2 | 410 | GPIOPM4 &= 0xffcf; /* p4_4,P4_5:output */ |
TetsuyaKonno | 0:98993ca640e2 | 411 | GPIOPMC4 |= 0x0030; /* P4_4,P4_5:double */ |
TetsuyaKonno | 0:98993ca640e2 | 412 | |
TetsuyaKonno | 0:98993ca640e2 | 413 | /* Mosule stop 33(MTU2) canceling */ |
TetsuyaKonno | 0:98993ca640e2 | 414 | CPGSTBCR3 &= 0xf7; |
TetsuyaKonno | 0:98993ca640e2 | 415 | |
TetsuyaKonno | 0:98993ca640e2 | 416 | /* MTU2_3 and MTU2_4 (Motor PWM) */ |
TetsuyaKonno | 0:98993ca640e2 | 417 | MTU2TCR_3 = 0x20; /* TCNT Clear(TGRA), P0φ/1 */ |
TetsuyaKonno | 0:98993ca640e2 | 418 | MTU2TOCR1 = 0x04; /* */ |
TetsuyaKonno | 0:98993ca640e2 | 419 | MTU2TOCR2 = 0x40; /* N L>H P H>L */ |
TetsuyaKonno | 0:98993ca640e2 | 420 | MTU2TMDR_3 = 0x38; /* Buff:ON Reset-Synchronized PWM mode */ |
TetsuyaKonno | 0:98993ca640e2 | 421 | MTU2TMDR_4 = 0x30; /* Buff:ON */ |
TetsuyaKonno | 0:98993ca640e2 | 422 | MTU2TOER = 0xc6; /* TIOC3B,4A,4B enabled output */ |
TetsuyaKonno | 0:98993ca640e2 | 423 | MTU2TCNT_3 = MTU2TCNT_4 = 0; /* TCNT3,TCNT4 Set 0 */ |
TetsuyaKonno | 0:98993ca640e2 | 424 | MTU2TGRA_3 = MTU2TGRC_3 = MOTOR_PWM_CYCLE; |
TetsuyaKonno | 0:98993ca640e2 | 425 | /* PWM-Cycle(1ms) */ |
TetsuyaKonno | 0:98993ca640e2 | 426 | MTU2TGRA_4 = MTU2TGRC_4 = 0; /* Left-motor(P4_4) */ |
TetsuyaKonno | 0:98993ca640e2 | 427 | MTU2TGRB_4 = MTU2TGRD_4 = 0; /* Right-motor(P4_5) */ |
TetsuyaKonno | 0:98993ca640e2 | 428 | MTU2TSTR |= 0x40; /* TCNT_4 Start */ |
TetsuyaKonno | 0:98993ca640e2 | 429 | } |
TetsuyaKonno | 0:98993ca640e2 | 430 | |
TetsuyaKonno | 0:98993ca640e2 | 431 | //Initialize MTU2 PWM functions |
TetsuyaKonno | 0:98993ca640e2 | 432 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 433 | //MTU2_0 |
TetsuyaKonno | 0:98993ca640e2 | 434 | //PWM mode 1 |
TetsuyaKonno | 0:98993ca640e2 | 435 | //TIOC0A(P4_0) :Servo-motor |
TetsuyaKonno | 0:98993ca640e2 | 436 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 437 | void init_MTU2_PWM_Servo( void ) |
TetsuyaKonno | 0:98993ca640e2 | 438 | { |
TetsuyaKonno | 0:98993ca640e2 | 439 | /* Port setting for S/W I/O Contorol */ |
TetsuyaKonno | 0:98993ca640e2 | 440 | /* alternative mode */ |
TetsuyaKonno | 0:98993ca640e2 | 441 | |
TetsuyaKonno | 0:98993ca640e2 | 442 | /* MTU2_0 (P4_0) */ |
TetsuyaKonno | 0:98993ca640e2 | 443 | GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/ |
TetsuyaKonno | 0:98993ca640e2 | 444 | GPIOPFCAE4 &= 0xfffe; /* The alternative function of a pin */ |
TetsuyaKonno | 0:98993ca640e2 | 445 | GPIOPFCE4 &= 0xfffe; /* The alternative function of a pin */ |
TetsuyaKonno | 0:98993ca640e2 | 446 | GPIOPFC4 |= 0x0001; /* The alternative function of a pin */ |
TetsuyaKonno | 0:98993ca640e2 | 447 | /* 2nd alternative function/output */ |
TetsuyaKonno | 0:98993ca640e2 | 448 | GPIOP4 &= 0xfffe; /* */ |
TetsuyaKonno | 0:98993ca640e2 | 449 | GPIOPM4 &= 0xfffe; /* p4_0:output */ |
TetsuyaKonno | 0:98993ca640e2 | 450 | GPIOPMC4 |= 0x0001; /* P4_0:double */ |
TetsuyaKonno | 0:98993ca640e2 | 451 | |
TetsuyaKonno | 0:98993ca640e2 | 452 | /* Mosule stop 33(MTU2) canceling */ |
TetsuyaKonno | 0:98993ca640e2 | 453 | CPGSTBCR3 &= 0xf7; |
TetsuyaKonno | 0:98993ca640e2 | 454 | |
TetsuyaKonno | 0:98993ca640e2 | 455 | /* MTU2_0 (Motor PWM) */ |
TetsuyaKonno | 0:98993ca640e2 | 456 | MTU2TCR_0 = 0x22; /* TCNT Clear(TGRA), P0φ/16 */ |
TetsuyaKonno | 0:98993ca640e2 | 457 | MTU2TIORH_0 = 0x52; /* TGRA L>H, TGRB H>L */ |
TetsuyaKonno | 0:98993ca640e2 | 458 | MTU2TMDR_0 = 0x32; /* TGRC and TGRD = Buff-mode*/ |
TetsuyaKonno | 0:98993ca640e2 | 459 | /* PWM-mode1 */ |
TetsuyaKonno | 0:98993ca640e2 | 460 | MTU2TCNT_0 = 0; /* TCNT0 Set 0 */ |
TetsuyaKonno | 0:98993ca640e2 | 461 | MTU2TGRA_0 = MTU2TGRC_0 = SERVO_PWM_CYCLE; |
TetsuyaKonno | 0:98993ca640e2 | 462 | /* PWM-Cycle(16ms) */ |
TetsuyaKonno | 0:98993ca640e2 | 463 | MTU2TGRB_0 = MTU2TGRD_0 = 0; /* Servo-motor(P4_0) */ |
TetsuyaKonno | 0:98993ca640e2 | 464 | MTU2TSTR |= 0x01; /* TCNT_0 Start */ |
TetsuyaKonno | 0:98993ca640e2 | 465 | } |
TetsuyaKonno | 0:98993ca640e2 | 466 | |
TetsuyaKonno | 0:98993ca640e2 | 467 | //Interrupt Timer |
TetsuyaKonno | 0:98993ca640e2 | 468 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 469 | void intTimer( void ) |
TetsuyaKonno | 0:98993ca640e2 | 470 | { |
TetsuyaKonno | 0:98993ca640e2 | 471 | static int counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 472 | |
TetsuyaKonno | 0:98993ca640e2 | 473 | cnt0++; |
TetsuyaKonno | 0:98993ca640e2 | 474 | cnt1++; |
TetsuyaKonno | 0:98993ca640e2 | 475 | |
TetsuyaKonno | 0:98993ca640e2 | 476 | /* Mark Check Process */ |
TetsuyaKonno | 0:98993ca640e2 | 477 | switch( counter++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 478 | case 0: |
TetsuyaKonno | 0:98993ca640e2 | 479 | change_framebuffer_process(); |
TetsuyaKonno | 0:98993ca640e2 | 480 | break; |
TetsuyaKonno | 0:98993ca640e2 | 481 | case 1: |
TetsuyaKonno | 0:98993ca640e2 | 482 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 483 | break; |
TetsuyaKonno | 0:98993ca640e2 | 484 | case 2: |
TetsuyaKonno | 0:98993ca640e2 | 485 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 486 | break; |
TetsuyaKonno | 0:98993ca640e2 | 487 | case 3: |
TetsuyaKonno | 0:98993ca640e2 | 488 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 489 | break; |
TetsuyaKonno | 0:98993ca640e2 | 490 | case 4: |
TetsuyaKonno | 0:98993ca640e2 | 491 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 492 | break; |
TetsuyaKonno | 0:98993ca640e2 | 493 | case 5: |
TetsuyaKonno | 0:98993ca640e2 | 494 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 495 | break; |
TetsuyaKonno | 0:98993ca640e2 | 496 | case 6: |
TetsuyaKonno | 0:98993ca640e2 | 497 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 498 | break; |
TetsuyaKonno | 0:98993ca640e2 | 499 | case 7: |
TetsuyaKonno | 0:98993ca640e2 | 500 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 501 | break; |
TetsuyaKonno | 0:98993ca640e2 | 502 | case 8: |
TetsuyaKonno | 0:98993ca640e2 | 503 | Image_Extraction( ImageData ); |
TetsuyaKonno | 0:98993ca640e2 | 504 | break; |
TetsuyaKonno | 0:98993ca640e2 | 505 | case 9: |
TetsuyaKonno | 0:98993ca640e2 | 506 | Image_Compression2( ImageData, 320, ImageComp, 16 ); |
TetsuyaKonno | 0:98993ca640e2 | 507 | break; |
TetsuyaKonno | 0:98993ca640e2 | 508 | case 10: |
TetsuyaKonno | 0:98993ca640e2 | 509 | Image_Compression2( ImageData, 320, ImageComp, 16 ); |
TetsuyaKonno | 0:98993ca640e2 | 510 | break; |
TetsuyaKonno | 0:98993ca640e2 | 511 | case 11: |
TetsuyaKonno | 0:98993ca640e2 | 512 | Binarization_process( ImageComp, ImageBinary, 20*15 ); |
TetsuyaKonno | 0:98993ca640e2 | 513 | break; |
TetsuyaKonno | 0:98993ca640e2 | 514 | case 33: |
TetsuyaKonno | 0:98993ca640e2 | 515 | counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 516 | break; |
TetsuyaKonno | 0:98993ca640e2 | 517 | default: |
TetsuyaKonno | 0:98993ca640e2 | 518 | break; |
TetsuyaKonno | 0:98993ca640e2 | 519 | } |
TetsuyaKonno | 0:98993ca640e2 | 520 | |
TetsuyaKonno | 0:98993ca640e2 | 521 | /* Trace by image processing */ |
TetsuyaKonno | 0:98993ca640e2 | 522 | digital_sensor_process( ImageBinary ); |
TetsuyaKonno | 0:98993ca640e2 | 523 | |
TetsuyaKonno | 0:98993ca640e2 | 524 | /* LED processing */ |
TetsuyaKonno | 0:98993ca640e2 | 525 | led_status_process(); |
TetsuyaKonno | 0:98993ca640e2 | 526 | } |
TetsuyaKonno | 0:98993ca640e2 | 527 | |
TetsuyaKonno | 0:98993ca640e2 | 528 | //LED_RGB(on GR-PEACH board) |
TetsuyaKonno | 0:98993ca640e2 | 529 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 530 | void led_rgb(int led) |
TetsuyaKonno | 0:98993ca640e2 | 531 | { |
TetsuyaKonno | 0:98993ca640e2 | 532 | LED_R = led & 0x1; |
TetsuyaKonno | 0:98993ca640e2 | 533 | LED_G = (led >> 1 ) & 0x1; |
TetsuyaKonno | 0:98993ca640e2 | 534 | LED_B = (led >> 2 ) & 0x1; |
TetsuyaKonno | 0:98993ca640e2 | 535 | } |
TetsuyaKonno | 0:98993ca640e2 | 536 | |
TetsuyaKonno | 0:98993ca640e2 | 537 | //user_button_get(on GR-PEACH board) |
TetsuyaKonno | 0:98993ca640e2 | 538 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 539 | unsigned int user_button_get( void ) |
TetsuyaKonno | 0:98993ca640e2 | 540 | { |
TetsuyaKonno | 0:98993ca640e2 | 541 | return (~user_botton) & 0x1; /* Read ports with switches */ |
TetsuyaKonno | 0:98993ca640e2 | 542 | } |
TetsuyaKonno | 0:98993ca640e2 | 543 | |
TetsuyaKonno | 0:98993ca640e2 | 544 | //LED_Status(on GR-PEACH board) Function for only interrupt |
TetsuyaKonno | 0:98993ca640e2 | 545 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 546 | void led_status_process( void ) |
TetsuyaKonno | 0:98993ca640e2 | 547 | { |
TetsuyaKonno | 0:98993ca640e2 | 548 | static unsigned long led_timer; |
TetsuyaKonno | 0:98993ca640e2 | 549 | int led_set; |
TetsuyaKonno | 0:98993ca640e2 | 550 | int on_time; |
TetsuyaKonno | 0:98993ca640e2 | 551 | int off_time; |
TetsuyaKonno | 0:98993ca640e2 | 552 | |
TetsuyaKonno | 0:98993ca640e2 | 553 | /* setting */ |
TetsuyaKonno | 0:98993ca640e2 | 554 | switch( status_set ){ |
TetsuyaKonno | 0:98993ca640e2 | 555 | case RUN: |
TetsuyaKonno | 0:98993ca640e2 | 556 | led_set = LED_GREEN; |
TetsuyaKonno | 0:98993ca640e2 | 557 | on_time = 500; |
TetsuyaKonno | 0:98993ca640e2 | 558 | off_time = 500; |
TetsuyaKonno | 0:98993ca640e2 | 559 | break; |
TetsuyaKonno | 0:98993ca640e2 | 560 | |
TetsuyaKonno | 0:98993ca640e2 | 561 | case SENSOR: |
TetsuyaKonno | 0:98993ca640e2 | 562 | led_set = LED_BLUE; |
TetsuyaKonno | 0:98993ca640e2 | 563 | on_time = 50; |
TetsuyaKonno | 0:98993ca640e2 | 564 | off_time = 50; |
TetsuyaKonno | 0:98993ca640e2 | 565 | break; |
TetsuyaKonno | 0:98993ca640e2 | 566 | |
TetsuyaKonno | 0:98993ca640e2 | 567 | case MARK_T: |
TetsuyaKonno | 0:98993ca640e2 | 568 | led_set = LED_WHITE; |
TetsuyaKonno | 0:98993ca640e2 | 569 | on_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 570 | off_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 571 | break; |
TetsuyaKonno | 0:98993ca640e2 | 572 | |
TetsuyaKonno | 0:98993ca640e2 | 573 | case MARK_C: |
TetsuyaKonno | 0:98993ca640e2 | 574 | led_set = LED_YELLOW; |
TetsuyaKonno | 0:98993ca640e2 | 575 | on_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 576 | off_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 577 | break; |
TetsuyaKonno | 0:98993ca640e2 | 578 | |
TetsuyaKonno | 0:98993ca640e2 | 579 | case MARK_R: |
TetsuyaKonno | 0:98993ca640e2 | 580 | led_set = LED_PURPLE; |
TetsuyaKonno | 0:98993ca640e2 | 581 | on_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 582 | off_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 583 | break; |
TetsuyaKonno | 0:98993ca640e2 | 584 | |
TetsuyaKonno | 0:98993ca640e2 | 585 | case MARK_L: |
TetsuyaKonno | 0:98993ca640e2 | 586 | led_set = LED_SKYBLUE; |
TetsuyaKonno | 0:98993ca640e2 | 587 | on_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 588 | off_time = 250; |
TetsuyaKonno | 0:98993ca640e2 | 589 | break; |
TetsuyaKonno | 0:98993ca640e2 | 590 | |
TetsuyaKonno | 0:98993ca640e2 | 591 | case STOP: |
TetsuyaKonno | 0:98993ca640e2 | 592 | led_set = LED_RED; |
TetsuyaKonno | 0:98993ca640e2 | 593 | on_time = 1; |
TetsuyaKonno | 0:98993ca640e2 | 594 | off_time = 0; |
TetsuyaKonno | 0:98993ca640e2 | 595 | break; |
TetsuyaKonno | 0:98993ca640e2 | 596 | |
TetsuyaKonno | 0:98993ca640e2 | 597 | case ERROR: |
TetsuyaKonno | 0:98993ca640e2 | 598 | led_set = LED_RED; |
TetsuyaKonno | 0:98993ca640e2 | 599 | on_time = 50; |
TetsuyaKonno | 0:98993ca640e2 | 600 | off_time = 50; |
TetsuyaKonno | 0:98993ca640e2 | 601 | break; |
TetsuyaKonno | 0:98993ca640e2 | 602 | |
TetsuyaKonno | 0:98993ca640e2 | 603 | default: |
TetsuyaKonno | 0:98993ca640e2 | 604 | led_set = LED_OFF; |
TetsuyaKonno | 0:98993ca640e2 | 605 | on_time = 0; |
TetsuyaKonno | 0:98993ca640e2 | 606 | off_time = 1; |
TetsuyaKonno | 0:98993ca640e2 | 607 | break; |
TetsuyaKonno | 0:98993ca640e2 | 608 | } |
TetsuyaKonno | 0:98993ca640e2 | 609 | |
TetsuyaKonno | 0:98993ca640e2 | 610 | /* Display */ |
TetsuyaKonno | 0:98993ca640e2 | 611 | led_timer++; |
TetsuyaKonno | 0:98993ca640e2 | 612 | if( led_timer < on_time ) led_rgb( led_set ); |
TetsuyaKonno | 0:98993ca640e2 | 613 | else if( led_timer < ( on_time + off_time ) ) led_rgb( LED_OFF ); |
TetsuyaKonno | 0:98993ca640e2 | 614 | else led_timer = 0; |
TetsuyaKonno | 0:98993ca640e2 | 615 | } |
TetsuyaKonno | 0:98993ca640e2 | 616 | |
TetsuyaKonno | 0:98993ca640e2 | 617 | //LED_Status(on GR-PEACH board) Function for only interrupt |
TetsuyaKonno | 0:98993ca640e2 | 618 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 619 | void led_status_set( int set ) |
TetsuyaKonno | 0:98993ca640e2 | 620 | { |
TetsuyaKonno | 0:98993ca640e2 | 621 | status_set = set; |
TetsuyaKonno | 0:98993ca640e2 | 622 | } |
TetsuyaKonno | 0:98993ca640e2 | 623 | |
TetsuyaKonno | 0:98993ca640e2 | 624 | //led_out(on Motor drive board) |
TetsuyaKonno | 0:98993ca640e2 | 625 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 626 | void led_out(int led) |
TetsuyaKonno | 0:98993ca640e2 | 627 | { |
TetsuyaKonno | 0:98993ca640e2 | 628 | led = ~led; |
TetsuyaKonno | 0:98993ca640e2 | 629 | LED_3 = led & 0x1; |
TetsuyaKonno | 0:98993ca640e2 | 630 | LED_2 = ( led >> 1 ) & 0x1; |
TetsuyaKonno | 0:98993ca640e2 | 631 | } |
TetsuyaKonno | 0:98993ca640e2 | 632 | |
TetsuyaKonno | 0:98993ca640e2 | 633 | //pushsw_get(on Motor drive board) |
TetsuyaKonno | 0:98993ca640e2 | 634 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 635 | unsigned int pushsw_get( void ) |
TetsuyaKonno | 0:98993ca640e2 | 636 | { |
TetsuyaKonno | 0:98993ca640e2 | 637 | return (~push_sw) & 0x1; /* Read ports with switches */ |
TetsuyaKonno | 0:98993ca640e2 | 638 | } |
TetsuyaKonno | 0:98993ca640e2 | 639 | |
TetsuyaKonno | 0:98993ca640e2 | 640 | //motor speed control(PWM) |
TetsuyaKonno | 0:98993ca640e2 | 641 | //Arguments: motor:-100 to 100 |
TetsuyaKonno | 0:98993ca640e2 | 642 | //Here, 0 is stop, 100 is forward, -100 is reverse |
TetsuyaKonno | 0:98993ca640e2 | 643 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 644 | void motor( int accele_l, int accele_r ) |
TetsuyaKonno | 0:98993ca640e2 | 645 | { |
TetsuyaKonno | 0:98993ca640e2 | 646 | accele_l = ( accele_l * MAX_SPEED ) / 100; |
TetsuyaKonno | 0:98993ca640e2 | 647 | accele_r = ( accele_r * MAX_SPEED ) / 100; |
TetsuyaKonno | 0:98993ca640e2 | 648 | |
TetsuyaKonno | 0:98993ca640e2 | 649 | /* Left Motor Control */ |
TetsuyaKonno | 0:98993ca640e2 | 650 | if( accele_l >= 0 ) { |
TetsuyaKonno | 0:98993ca640e2 | 651 | /* forward */ |
TetsuyaKonno | 0:98993ca640e2 | 652 | Left_motor_signal = 0; |
TetsuyaKonno | 0:98993ca640e2 | 653 | MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_l / 100; |
TetsuyaKonno | 0:98993ca640e2 | 654 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 655 | /* reverse */ |
TetsuyaKonno | 0:98993ca640e2 | 656 | Left_motor_signal = 1; |
TetsuyaKonno | 0:98993ca640e2 | 657 | MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_l ) / 100; |
TetsuyaKonno | 0:98993ca640e2 | 658 | } |
TetsuyaKonno | 0:98993ca640e2 | 659 | |
TetsuyaKonno | 0:98993ca640e2 | 660 | /* Right Motor Control */ |
TetsuyaKonno | 0:98993ca640e2 | 661 | if( accele_r >= 0 ) { |
TetsuyaKonno | 0:98993ca640e2 | 662 | /* forward */ |
TetsuyaKonno | 0:98993ca640e2 | 663 | Right_motor_signal = 0; |
TetsuyaKonno | 0:98993ca640e2 | 664 | MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_r / 100; |
TetsuyaKonno | 0:98993ca640e2 | 665 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 666 | /* reverse */ |
TetsuyaKonno | 0:98993ca640e2 | 667 | Right_motor_signal = 1; |
TetsuyaKonno | 0:98993ca640e2 | 668 | MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_r ) / 100; |
TetsuyaKonno | 0:98993ca640e2 | 669 | } |
TetsuyaKonno | 0:98993ca640e2 | 670 | } |
TetsuyaKonno | 0:98993ca640e2 | 671 | |
TetsuyaKonno | 0:98993ca640e2 | 672 | //Handle fanction |
TetsuyaKonno | 0:98993ca640e2 | 673 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 674 | void handle( int angle ) |
TetsuyaKonno | 0:98993ca640e2 | 675 | { |
TetsuyaKonno | 0:98993ca640e2 | 676 | handle_buff = angle; |
TetsuyaKonno | 0:98993ca640e2 | 677 | /* When the servo move from left to right in reverse, replace "-" with "+" */ |
TetsuyaKonno | 0:98993ca640e2 | 678 | MTU2TGRD_0 = SERVO_CENTER - angle * HANDLE_STEP; |
TetsuyaKonno | 0:98993ca640e2 | 679 | } |
TetsuyaKonno | 0:98993ca640e2 | 680 | |
TetsuyaKonno | 0:98993ca640e2 | 681 | //handle(on Motor drive board) |
TetsuyaKonno | 0:98993ca640e2 | 682 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 683 | int diff( int pwm ) |
TetsuyaKonno | 0:98993ca640e2 | 684 | { |
TetsuyaKonno | 0:98993ca640e2 | 685 | int i, ret; |
TetsuyaKonno | 0:98993ca640e2 | 686 | |
TetsuyaKonno | 0:98993ca640e2 | 687 | i = handle_buff; |
TetsuyaKonno | 0:98993ca640e2 | 688 | if( i < 0 ) i = -i; |
TetsuyaKonno | 0:98993ca640e2 | 689 | if( i > 45 ) i = 45; |
TetsuyaKonno | 0:98993ca640e2 | 690 | ret = revolution_difference[i] * pwm / 100; |
TetsuyaKonno | 0:98993ca640e2 | 691 | |
TetsuyaKonno | 0:98993ca640e2 | 692 | return ret; |
TetsuyaKonno | 0:98993ca640e2 | 693 | } |
TetsuyaKonno | 0:98993ca640e2 | 694 | |
TetsuyaKonno | 0:98993ca640e2 | 695 | //Image Data Output( for the Excel ) |
TetsuyaKonno | 0:98993ca640e2 | 696 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 697 | void ImageData_Serial_Out( unsigned char *Data_Y, int Width ) |
TetsuyaKonno | 0:98993ca640e2 | 698 | { |
TetsuyaKonno | 0:98993ca640e2 | 699 | int Xp, Yp, inc, Height; |
TetsuyaKonno | 0:98993ca640e2 | 700 | |
TetsuyaKonno | 0:98993ca640e2 | 701 | Height = (Width / (double)4) * 3; |
TetsuyaKonno | 0:98993ca640e2 | 702 | for( Yp = 0, inc = 0; Yp < Height; Yp++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 703 | for( Xp = 0; Xp < Width; Xp++, inc++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 704 | pc.printf( "%d,", Data_Y[ inc ] ); |
TetsuyaKonno | 0:98993ca640e2 | 705 | } |
TetsuyaKonno | 0:98993ca640e2 | 706 | pc.printf("\n\r"); |
TetsuyaKonno | 0:98993ca640e2 | 707 | } |
TetsuyaKonno | 0:98993ca640e2 | 708 | } |
TetsuyaKonno | 0:98993ca640e2 | 709 | |
TetsuyaKonno | 0:98993ca640e2 | 710 | //Image Data Output2( for TeraTerm ) |
TetsuyaKonno | 0:98993ca640e2 | 711 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 712 | void ImageData_Serial_Out2( unsigned char *Data_Y, int Width ) |
TetsuyaKonno | 0:98993ca640e2 | 713 | { |
TetsuyaKonno | 0:98993ca640e2 | 714 | int Xp, Yp, Height; |
TetsuyaKonno | 0:98993ca640e2 | 715 | |
TetsuyaKonno | 0:98993ca640e2 | 716 | Height = (Width / (double)4) * 3; |
TetsuyaKonno | 0:98993ca640e2 | 717 | for( Yp = 0; Yp < Height; Yp++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 718 | for( Xp = 0; Xp < Width; Xp++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 719 | pc.printf( "%d ", Data_Y[Xp + (Yp * Width)] ); |
TetsuyaKonno | 0:98993ca640e2 | 720 | } |
TetsuyaKonno | 0:98993ca640e2 | 721 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:98993ca640e2 | 722 | } |
TetsuyaKonno | 0:98993ca640e2 | 723 | pc.printf( "\033[%dA" , Height ); |
TetsuyaKonno | 0:98993ca640e2 | 724 | } |
TetsuyaKonno | 0:98993ca640e2 | 725 | |
TetsuyaKonno | 0:98993ca640e2 | 726 | //Image Data Output3( for the converter ( csv --> jpg ) ) |
TetsuyaKonno | 0:98993ca640e2 | 727 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 728 | void ImageData_Serial_Out3( void ) |
TetsuyaKonno | 0:98993ca640e2 | 729 | { |
TetsuyaKonno | 0:98993ca640e2 | 730 | int Xp, Yp, x, y; |
TetsuyaKonno | 0:98993ca640e2 | 731 | |
TetsuyaKonno | 0:98993ca640e2 | 732 | /* Camera module test process */ |
TetsuyaKonno | 0:98993ca640e2 | 733 | pc.printf( "//,X-Size,Y-Size" ); |
TetsuyaKonno | 0:98993ca640e2 | 734 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:98993ca640e2 | 735 | pc.printf( "#SIZE,320,240" ); |
TetsuyaKonno | 0:98993ca640e2 | 736 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:98993ca640e2 | 737 | pc.printf( "//,X-Point,Y-Point" ); |
TetsuyaKonno | 0:98993ca640e2 | 738 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:98993ca640e2 | 739 | |
TetsuyaKonno | 0:98993ca640e2 | 740 | for( Yp = 0, y = 0; Yp < 240; Yp+=1, y++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 741 | for( Xp = 0, x = 0; Xp < 640; Xp+=4, x+=2 ){ |
TetsuyaKonno | 0:98993ca640e2 | 742 | pc.printf( "#YCbCr," ); |
TetsuyaKonno | 0:98993ca640e2 | 743 | /*Xp*/pc.printf( "%d,", x); |
TetsuyaKonno | 0:98993ca640e2 | 744 | /*Yp*/pc.printf( "%d,", y); |
TetsuyaKonno | 0:98993ca640e2 | 745 | /*Y0*/pc.printf( "%d,", save_buff_addr[(Xp+0)+(640*Yp)]);//6 |
TetsuyaKonno | 0:98993ca640e2 | 746 | /*Cb*/pc.printf( "%d,", save_buff_addr[(Xp+1)+(640*Yp)]);//5 |
TetsuyaKonno | 0:98993ca640e2 | 747 | /*Cr*/pc.printf( "%d,", save_buff_addr[(Xp+3)+(640*Yp)]);//7 |
TetsuyaKonno | 0:98993ca640e2 | 748 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:98993ca640e2 | 749 | |
TetsuyaKonno | 0:98993ca640e2 | 750 | pc.printf( "#YCbCr," ); |
TetsuyaKonno | 0:98993ca640e2 | 751 | /*Xp*/pc.printf( "%d,", x+1); |
TetsuyaKonno | 0:98993ca640e2 | 752 | /*Yp*/pc.printf( "%d,", y); |
TetsuyaKonno | 0:98993ca640e2 | 753 | /*Y1*/pc.printf( "%d,", save_buff_addr[(Xp+2)+(640*Yp)]);//4 |
TetsuyaKonno | 0:98993ca640e2 | 754 | /*Cb*/pc.printf( "%d,", save_buff_addr[(Xp+1)+(640*Yp)]);//5 |
TetsuyaKonno | 0:98993ca640e2 | 755 | /*Cr*/pc.printf( "%d,", save_buff_addr[(Xp+3)+(640*Yp)]);//7 |
TetsuyaKonno | 0:98993ca640e2 | 756 | pc.printf( "\n\r" ); |
TetsuyaKonno | 0:98993ca640e2 | 757 | } |
TetsuyaKonno | 0:98993ca640e2 | 758 | } |
TetsuyaKonno | 0:98993ca640e2 | 759 | } |
TetsuyaKonno | 0:98993ca640e2 | 760 | |
TetsuyaKonno | 0:98993ca640e2 | 761 | //Change FrameBuffer Process |
TetsuyaKonno | 0:98993ca640e2 | 762 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 763 | void change_framebuffer_process( void ) |
TetsuyaKonno | 0:98993ca640e2 | 764 | { |
TetsuyaKonno | 0:98993ca640e2 | 765 | DisplayBase::graphics_error_t error; |
TetsuyaKonno | 0:98993ca640e2 | 766 | DisplayBase Display; |
TetsuyaKonno | 0:98993ca640e2 | 767 | |
TetsuyaKonno | 0:98993ca640e2 | 768 | /* Change address buffer */ |
TetsuyaKonno | 0:98993ca640e2 | 769 | if (write_buff_addr == FrameBuffer_Video_A) { |
TetsuyaKonno | 0:98993ca640e2 | 770 | write_buff_addr = FrameBuffer_Video_B; |
TetsuyaKonno | 0:98993ca640e2 | 771 | save_buff_addr = FrameBuffer_Video_A; |
TetsuyaKonno | 0:98993ca640e2 | 772 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 773 | write_buff_addr = FrameBuffer_Video_A; |
TetsuyaKonno | 0:98993ca640e2 | 774 | save_buff_addr = FrameBuffer_Video_B; |
TetsuyaKonno | 0:98993ca640e2 | 775 | } |
TetsuyaKonno | 0:98993ca640e2 | 776 | |
TetsuyaKonno | 0:98993ca640e2 | 777 | /* Change write buffer */ |
TetsuyaKonno | 0:98993ca640e2 | 778 | error = Display.Video_Write_Change( |
TetsuyaKonno | 0:98993ca640e2 | 779 | VIDEO_INPUT_CH, |
TetsuyaKonno | 0:98993ca640e2 | 780 | write_buff_addr, |
TetsuyaKonno | 0:98993ca640e2 | 781 | VIDEO_BUFFER_STRIDE); |
TetsuyaKonno | 0:98993ca640e2 | 782 | if (error != DisplayBase::GRAPHICS_OK) { |
TetsuyaKonno | 0:98993ca640e2 | 783 | printf("Line %d, error %d\n", __LINE__, error); |
TetsuyaKonno | 0:98993ca640e2 | 784 | while (1); |
TetsuyaKonno | 0:98993ca640e2 | 785 | } |
TetsuyaKonno | 0:98993ca640e2 | 786 | } |
TetsuyaKonno | 0:98993ca640e2 | 787 | |
TetsuyaKonno | 0:98993ca640e2 | 788 | //CenterLine_Corrective image size 20*15pix |
TetsuyaKonno | 0:98993ca640e2 | 789 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 790 | int CenterLine_Corrective( unsigned char *Binary ) |
TetsuyaKonno | 0:98993ca640e2 | 791 | { |
TetsuyaKonno | 0:98993ca640e2 | 792 | #define L 0 |
TetsuyaKonno | 0:98993ca640e2 | 793 | #define R 1 |
TetsuyaKonno | 0:98993ca640e2 | 794 | |
TetsuyaKonno | 0:98993ca640e2 | 795 | int iRet, offset_X, offset_Y; |
TetsuyaKonno | 0:98993ca640e2 | 796 | int Xpix, X; |
TetsuyaKonno | 0:98993ca640e2 | 797 | int Ypix; |
TetsuyaKonno | 0:98993ca640e2 | 798 | int Pixel_diff[2]; |
TetsuyaKonno | 0:98993ca640e2 | 799 | int Error_cnt; |
TetsuyaKonno | 0:98993ca640e2 | 800 | int value; |
TetsuyaKonno | 0:98993ca640e2 | 801 | |
TetsuyaKonno | 0:98993ca640e2 | 802 | /* Center of image */ |
TetsuyaKonno | 0:98993ca640e2 | 803 | offset_X = 6; |
TetsuyaKonno | 0:98993ca640e2 | 804 | offset_Y = 12; |
TetsuyaKonno | 0:98993ca640e2 | 805 | |
TetsuyaKonno | 0:98993ca640e2 | 806 | /* corrective of center line */ |
TetsuyaKonno | 0:98993ca640e2 | 807 | for( Ypix = 0, Error_cnt = 0; Ypix < (offset_Y - 4); Ypix++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 808 | for( value = 0; value < 2; value++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 809 | for( Xpix = offset_X; Xpix < (offset_X + 8); Xpix++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 810 | /* Lift side */ |
TetsuyaKonno | 0:98993ca640e2 | 811 | Pixel_diff[L] = 0; |
TetsuyaKonno | 0:98993ca640e2 | 812 | if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + Xpix ] >= 1 ) { |
TetsuyaKonno | 0:98993ca640e2 | 813 | for( X = Xpix; X > (Xpix - 4); X-- ) { |
TetsuyaKonno | 0:98993ca640e2 | 814 | if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + X ] >= 1 ) { |
TetsuyaKonno | 0:98993ca640e2 | 815 | Pixel_diff[L]++; |
TetsuyaKonno | 0:98993ca640e2 | 816 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 817 | break; |
TetsuyaKonno | 0:98993ca640e2 | 818 | } |
TetsuyaKonno | 0:98993ca640e2 | 819 | } |
TetsuyaKonno | 0:98993ca640e2 | 820 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 821 | Pixel_diff[L] = -1; |
TetsuyaKonno | 0:98993ca640e2 | 822 | } |
TetsuyaKonno | 0:98993ca640e2 | 823 | /* Right side */ |
TetsuyaKonno | 0:98993ca640e2 | 824 | Pixel_diff[R] = 0; |
TetsuyaKonno | 0:98993ca640e2 | 825 | if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + (Xpix + 1) ] >= 1 ) { |
TetsuyaKonno | 0:98993ca640e2 | 826 | for( X = (Xpix + 1); X < ((Xpix + 1) + 4); X++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 827 | if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + X ] >= 1 ) { |
TetsuyaKonno | 0:98993ca640e2 | 828 | Pixel_diff[R]++; |
TetsuyaKonno | 0:98993ca640e2 | 829 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 830 | break; |
TetsuyaKonno | 0:98993ca640e2 | 831 | } |
TetsuyaKonno | 0:98993ca640e2 | 832 | } |
TetsuyaKonno | 0:98993ca640e2 | 833 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 834 | Pixel_diff[R] = 1; |
TetsuyaKonno | 0:98993ca640e2 | 835 | } |
TetsuyaKonno | 0:98993ca640e2 | 836 | /* check */ |
TetsuyaKonno | 0:98993ca640e2 | 837 | iRet = Pixel_diff[L] - Pixel_diff[R]; |
TetsuyaKonno | 0:98993ca640e2 | 838 | if( value >= iRet && iRet >= -value ) { |
TetsuyaKonno | 0:98993ca640e2 | 839 | break; |
TetsuyaKonno | 0:98993ca640e2 | 840 | } |
TetsuyaKonno | 0:98993ca640e2 | 841 | } |
TetsuyaKonno | 0:98993ca640e2 | 842 | if( value >= iRet && iRet >= -value ) { |
TetsuyaKonno | 0:98993ca640e2 | 843 | /* X coordinate */ |
TetsuyaKonno | 0:98993ca640e2 | 844 | Sensor_X[Ypix][2] = Xpix; |
TetsuyaKonno | 0:98993ca640e2 | 845 | Sensor_X[Ypix][3] = Xpix + 1; |
TetsuyaKonno | 0:98993ca640e2 | 846 | break; |
TetsuyaKonno | 0:98993ca640e2 | 847 | } else { |
TetsuyaKonno | 0:98993ca640e2 | 848 | Sensor_X[Ypix][2] = Sensor_X[Ypix][3] = -1; |
TetsuyaKonno | 0:98993ca640e2 | 849 | Error_cnt++; |
TetsuyaKonno | 0:98993ca640e2 | 850 | } |
TetsuyaKonno | 0:98993ca640e2 | 851 | } |
TetsuyaKonno | 0:98993ca640e2 | 852 | /* Left side sensor */ |
TetsuyaKonno | 0:98993ca640e2 | 853 | Sensor_X[Ypix][1] = Sensor_X[Ypix][2] - ( Pixel_diff[L] ); |
TetsuyaKonno | 0:98993ca640e2 | 854 | Sensor_X[Ypix][0] = Sensor_X[Ypix][1] - ( Pixel_diff[L] + 1 );//( Sensor_X[Ypix][2] - Sensor_X[Ypix][1] ); |
TetsuyaKonno | 0:98993ca640e2 | 855 | /* Right side sensor */ |
TetsuyaKonno | 0:98993ca640e2 | 856 | Sensor_X[Ypix][4] = Sensor_X[Ypix][3] + ( Pixel_diff[R] ); |
TetsuyaKonno | 0:98993ca640e2 | 857 | Sensor_X[Ypix][5] = Sensor_X[Ypix][4] + ( Pixel_diff[R] + 1 );//( Sensor_X[Ypix][4] - Sensor_X[Ypix][3] ); |
TetsuyaKonno | 0:98993ca640e2 | 858 | } |
TetsuyaKonno | 0:98993ca640e2 | 859 | return Error_cnt; |
TetsuyaKonno | 0:98993ca640e2 | 860 | } |
TetsuyaKonno | 0:98993ca640e2 | 861 | |
TetsuyaKonno | 0:98993ca640e2 | 862 | //digital_sensor_process |
TetsuyaKonno | 0:98993ca640e2 | 863 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 864 | void digital_sensor_process( unsigned char *Binary ) |
TetsuyaKonno | 0:98993ca640e2 | 865 | { |
TetsuyaKonno | 0:98993ca640e2 | 866 | static int counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 867 | static int Ypix = 0; |
TetsuyaKonno | 0:98993ca640e2 | 868 | |
TetsuyaKonno | 0:98993ca640e2 | 869 | int offset_Y; |
TetsuyaKonno | 0:98993ca640e2 | 870 | unsigned char sensor, data; |
TetsuyaKonno | 0:98993ca640e2 | 871 | |
TetsuyaKonno | 0:98993ca640e2 | 872 | offset_Y = 12; |
TetsuyaKonno | 0:98993ca640e2 | 873 | sensor = 0; |
TetsuyaKonno | 0:98993ca640e2 | 874 | |
TetsuyaKonno | 0:98993ca640e2 | 875 | // Distributed processing |
TetsuyaKonno | 0:98993ca640e2 | 876 | switch( counter++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 877 | case 15: |
TetsuyaKonno | 0:98993ca640e2 | 878 | case 31: |
TetsuyaKonno | 0:98993ca640e2 | 879 | data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][2] ] & 0x01; |
TetsuyaKonno | 0:98993ca640e2 | 880 | data |= Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][3] ] & 0x01; |
TetsuyaKonno | 0:98993ca640e2 | 881 | sensor |= (data << 4) & 0x10; |
TetsuyaKonno | 0:98993ca640e2 | 882 | data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][0] ] & 0x01; |
TetsuyaKonno | 0:98993ca640e2 | 883 | sensor |= (data << 3) & 0x08; |
TetsuyaKonno | 0:98993ca640e2 | 884 | data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][1] ] & 0x01; |
TetsuyaKonno | 0:98993ca640e2 | 885 | sensor |= (data << 2) & 0x04; |
TetsuyaKonno | 0:98993ca640e2 | 886 | data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][4] ] & 0x01; |
TetsuyaKonno | 0:98993ca640e2 | 887 | sensor |= (data << 1) & 0x02; |
TetsuyaKonno | 0:98993ca640e2 | 888 | data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][5] ] & 0x01; |
TetsuyaKonno | 0:98993ca640e2 | 889 | sensor |= (data << 0) & 0x01; |
TetsuyaKonno | 0:98993ca640e2 | 890 | sensor &= 0x1f; |
TetsuyaKonno | 0:98993ca640e2 | 891 | sensor_value = sensor; |
TetsuyaKonno | 0:98993ca640e2 | 892 | Ypix += 4; |
TetsuyaKonno | 0:98993ca640e2 | 893 | break; |
TetsuyaKonno | 0:98993ca640e2 | 894 | case 33: |
TetsuyaKonno | 0:98993ca640e2 | 895 | counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 896 | Ypix = 0; |
TetsuyaKonno | 0:98993ca640e2 | 897 | break; |
TetsuyaKonno | 0:98993ca640e2 | 898 | default: |
TetsuyaKonno | 0:98993ca640e2 | 899 | break; |
TetsuyaKonno | 0:98993ca640e2 | 900 | } |
TetsuyaKonno | 0:98993ca640e2 | 901 | } |
TetsuyaKonno | 0:98993ca640e2 | 902 | |
TetsuyaKonno | 0:98993ca640e2 | 903 | //digital_sensor |
TetsuyaKonno | 0:98993ca640e2 | 904 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 905 | unsigned char digital_sensor( void ) |
TetsuyaKonno | 0:98993ca640e2 | 906 | { |
TetsuyaKonno | 0:98993ca640e2 | 907 | return sensor_value; |
TetsuyaKonno | 0:98993ca640e2 | 908 | } |
TetsuyaKonno | 0:98993ca640e2 | 909 | |
TetsuyaKonno | 0:98993ca640e2 | 910 | //Image Data YCbCr -> Y(320*240pix) |
TetsuyaKonno | 0:98993ca640e2 | 911 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 912 | void Image_Extraction( unsigned char *Data_Y ) |
TetsuyaKonno | 0:98993ca640e2 | 913 | { |
TetsuyaKonno | 0:98993ca640e2 | 914 | static int Xp, Yp, inc; |
TetsuyaKonno | 0:98993ca640e2 | 915 | static int counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 916 | |
TetsuyaKonno | 0:98993ca640e2 | 917 | // Distributed processing |
TetsuyaKonno | 0:98993ca640e2 | 918 | switch( counter++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 919 | case 0: |
TetsuyaKonno | 0:98993ca640e2 | 920 | for( Yp = 0, inc = 0; Yp < 30; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 921 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 922 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 923 | } |
TetsuyaKonno | 0:98993ca640e2 | 924 | } |
TetsuyaKonno | 0:98993ca640e2 | 925 | break; |
TetsuyaKonno | 0:98993ca640e2 | 926 | case 1: |
TetsuyaKonno | 0:98993ca640e2 | 927 | for( ; Yp < 60; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 928 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 929 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 930 | } |
TetsuyaKonno | 0:98993ca640e2 | 931 | } |
TetsuyaKonno | 0:98993ca640e2 | 932 | break; |
TetsuyaKonno | 0:98993ca640e2 | 933 | case 2: |
TetsuyaKonno | 0:98993ca640e2 | 934 | for( ; Yp < 90; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 935 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 936 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 937 | } |
TetsuyaKonno | 0:98993ca640e2 | 938 | } |
TetsuyaKonno | 0:98993ca640e2 | 939 | break; |
TetsuyaKonno | 0:98993ca640e2 | 940 | case 3: |
TetsuyaKonno | 0:98993ca640e2 | 941 | for( ; Yp < 120; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 942 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 943 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 944 | } |
TetsuyaKonno | 0:98993ca640e2 | 945 | } |
TetsuyaKonno | 0:98993ca640e2 | 946 | break; |
TetsuyaKonno | 0:98993ca640e2 | 947 | case 4: |
TetsuyaKonno | 0:98993ca640e2 | 948 | for( ; Yp < 150; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 949 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 950 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 951 | } |
TetsuyaKonno | 0:98993ca640e2 | 952 | } |
TetsuyaKonno | 0:98993ca640e2 | 953 | break; |
TetsuyaKonno | 0:98993ca640e2 | 954 | case 5: |
TetsuyaKonno | 0:98993ca640e2 | 955 | for( ; Yp < 180; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 956 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 957 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 958 | } |
TetsuyaKonno | 0:98993ca640e2 | 959 | } |
TetsuyaKonno | 0:98993ca640e2 | 960 | break; |
TetsuyaKonno | 0:98993ca640e2 | 961 | case 6: |
TetsuyaKonno | 0:98993ca640e2 | 962 | for( ; Yp < 210; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 963 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 964 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 965 | } |
TetsuyaKonno | 0:98993ca640e2 | 966 | } |
TetsuyaKonno | 0:98993ca640e2 | 967 | break; |
TetsuyaKonno | 0:98993ca640e2 | 968 | case 7: |
TetsuyaKonno | 0:98993ca640e2 | 969 | for( ; Yp < 240; Yp++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 970 | for( Xp = 0; Xp < 640; Xp+=2, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 971 | Data_Y[ inc ] = save_buff_addr[(Xp)+(640*Yp)]; |
TetsuyaKonno | 0:98993ca640e2 | 972 | } |
TetsuyaKonno | 0:98993ca640e2 | 973 | } |
TetsuyaKonno | 0:98993ca640e2 | 974 | counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 975 | break; |
TetsuyaKonno | 0:98993ca640e2 | 976 | default: |
TetsuyaKonno | 0:98993ca640e2 | 977 | break; |
TetsuyaKonno | 0:98993ca640e2 | 978 | } |
TetsuyaKonno | 0:98993ca640e2 | 979 | |
TetsuyaKonno | 0:98993ca640e2 | 980 | } |
TetsuyaKonno | 0:98993ca640e2 | 981 | |
TetsuyaKonno | 0:98993ca640e2 | 982 | //Image_Compression2 Y ( Averaging processing ) |
TetsuyaKonno | 0:98993ca640e2 | 983 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 984 | void Image_Compression2( unsigned char *Data_Y, int Data_W , unsigned char *Comp_Y, int Comp_M ) |
TetsuyaKonno | 0:98993ca640e2 | 985 | { |
TetsuyaKonno | 0:98993ca640e2 | 986 | int Data_H, Pixel_T, Pixel_D; |
TetsuyaKonno | 0:98993ca640e2 | 987 | int x, y; |
TetsuyaKonno | 0:98993ca640e2 | 988 | static int Xp, Yp, inc; |
TetsuyaKonno | 0:98993ca640e2 | 989 | static int counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 990 | |
TetsuyaKonno | 0:98993ca640e2 | 991 | Data_H = (Data_W / (double)4) * 3; |
TetsuyaKonno | 0:98993ca640e2 | 992 | Pixel_D = Comp_M * Comp_M; |
TetsuyaKonno | 0:98993ca640e2 | 993 | |
TetsuyaKonno | 0:98993ca640e2 | 994 | // Distributed processing |
TetsuyaKonno | 0:98993ca640e2 | 995 | switch( counter++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 996 | case 0: |
TetsuyaKonno | 0:98993ca640e2 | 997 | for( Yp = 0, inc = 0; Yp < (Data_H / 2); Yp+=Comp_M ){ |
TetsuyaKonno | 0:98993ca640e2 | 998 | for( Xp = 0; Xp < Data_W; Xp+=Comp_M, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 999 | Pixel_T = 0; |
TetsuyaKonno | 0:98993ca640e2 | 1000 | for( y = 0; y < Comp_M; y++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 1001 | for( x = 0; x < Comp_M; x++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 1002 | Pixel_T += Data_Y[( Xp + x ) + (( Yp + y ) * Data_W )]; |
TetsuyaKonno | 0:98993ca640e2 | 1003 | } |
TetsuyaKonno | 0:98993ca640e2 | 1004 | } |
TetsuyaKonno | 0:98993ca640e2 | 1005 | Comp_Y[inc] = Pixel_T / Pixel_D; |
TetsuyaKonno | 0:98993ca640e2 | 1006 | } |
TetsuyaKonno | 0:98993ca640e2 | 1007 | } |
TetsuyaKonno | 0:98993ca640e2 | 1008 | break; |
TetsuyaKonno | 0:98993ca640e2 | 1009 | case 1: |
TetsuyaKonno | 0:98993ca640e2 | 1010 | for( ; Yp < Data_H; Yp+=Comp_M ){ |
TetsuyaKonno | 0:98993ca640e2 | 1011 | for( Xp = 0; Xp < Data_W; Xp+=Comp_M, inc++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 1012 | Pixel_T = 0; |
TetsuyaKonno | 0:98993ca640e2 | 1013 | for( y = 0; y < Comp_M; y++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 1014 | for( x = 0; x < Comp_M; x++ ){ |
TetsuyaKonno | 0:98993ca640e2 | 1015 | Pixel_T += Data_Y[( Xp + x ) + (( Yp + y ) * Data_W )]; |
TetsuyaKonno | 0:98993ca640e2 | 1016 | } |
TetsuyaKonno | 0:98993ca640e2 | 1017 | } |
TetsuyaKonno | 0:98993ca640e2 | 1018 | Comp_Y[inc] = Pixel_T / Pixel_D; |
TetsuyaKonno | 0:98993ca640e2 | 1019 | } |
TetsuyaKonno | 0:98993ca640e2 | 1020 | } |
TetsuyaKonno | 0:98993ca640e2 | 1021 | counter = 0; |
TetsuyaKonno | 0:98993ca640e2 | 1022 | break; |
TetsuyaKonno | 0:98993ca640e2 | 1023 | default: |
TetsuyaKonno | 0:98993ca640e2 | 1024 | break; |
TetsuyaKonno | 0:98993ca640e2 | 1025 | } |
TetsuyaKonno | 0:98993ca640e2 | 1026 | |
TetsuyaKonno | 0:98993ca640e2 | 1027 | } |
TetsuyaKonno | 0:98993ca640e2 | 1028 | |
TetsuyaKonno | 0:98993ca640e2 | 1029 | // Binarization_process |
TetsuyaKonno | 0:98993ca640e2 | 1030 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 1031 | void Binarization_process( unsigned char *Comp_Y, unsigned char *Binary, long items ) |
TetsuyaKonno | 0:98993ca640e2 | 1032 | { |
TetsuyaKonno | 0:98993ca640e2 | 1033 | int i, threshold; |
TetsuyaKonno | 0:98993ca640e2 | 1034 | |
TetsuyaKonno | 0:98993ca640e2 | 1035 | threshold = 128; |
TetsuyaKonno | 0:98993ca640e2 | 1036 | for( i = 0; i < items; i++ ) { |
TetsuyaKonno | 0:98993ca640e2 | 1037 | if( Comp_Y[i] >= threshold ) Binary[i] = 1; |
TetsuyaKonno | 0:98993ca640e2 | 1038 | else Binary[i] = 0; |
TetsuyaKonno | 0:98993ca640e2 | 1039 | } |
TetsuyaKonno | 0:98993ca640e2 | 1040 | } |
TetsuyaKonno | 0:98993ca640e2 | 1041 | |
TetsuyaKonno | 0:98993ca640e2 | 1042 | //******************************************************************// |
TetsuyaKonno | 0:98993ca640e2 | 1043 | // @brief Interrupt callback function |
TetsuyaKonno | 0:98993ca640e2 | 1044 | // @param[in] int_type : VDC5 interrupt type |
TetsuyaKonno | 0:98993ca640e2 | 1045 | // @retval None |
TetsuyaKonno | 0:98993ca640e2 | 1046 | //*******************************************************************/ |
TetsuyaKonno | 0:98993ca640e2 | 1047 | static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) |
TetsuyaKonno | 0:98993ca640e2 | 1048 | { |
TetsuyaKonno | 0:98993ca640e2 | 1049 | if (vfield_count > 0) { |
TetsuyaKonno | 0:98993ca640e2 | 1050 | vfield_count--; |
TetsuyaKonno | 0:98993ca640e2 | 1051 | } |
TetsuyaKonno | 0:98993ca640e2 | 1052 | } |
TetsuyaKonno | 0:98993ca640e2 | 1053 | |
TetsuyaKonno | 0:98993ca640e2 | 1054 | //******************************************************************// |
TetsuyaKonno | 0:98993ca640e2 | 1055 | // @brief Wait for the specified number of times Vsync occurs |
TetsuyaKonno | 0:98993ca640e2 | 1056 | // @param[in] wait_count : Wait count |
TetsuyaKonno | 0:98993ca640e2 | 1057 | // @retval None |
TetsuyaKonno | 0:98993ca640e2 | 1058 | //*******************************************************************/ |
TetsuyaKonno | 0:98993ca640e2 | 1059 | static void WaitVfield(const int32_t wait_count) |
TetsuyaKonno | 0:98993ca640e2 | 1060 | { |
TetsuyaKonno | 0:98993ca640e2 | 1061 | vfield_count = wait_count; |
TetsuyaKonno | 0:98993ca640e2 | 1062 | while (vfield_count > 0) { |
TetsuyaKonno | 0:98993ca640e2 | 1063 | /* Do nothing */ |
TetsuyaKonno | 0:98993ca640e2 | 1064 | } |
TetsuyaKonno | 0:98993ca640e2 | 1065 | } |
TetsuyaKonno | 0:98993ca640e2 | 1066 | |
TetsuyaKonno | 0:98993ca640e2 | 1067 | //******************************************************************// |
TetsuyaKonno | 0:98993ca640e2 | 1068 | // @brief Interrupt callback function for Vsync interruption |
TetsuyaKonno | 0:98993ca640e2 | 1069 | // @param[in] int_type : VDC5 interrupt type |
TetsuyaKonno | 0:98993ca640e2 | 1070 | // @retval None |
TetsuyaKonno | 0:98993ca640e2 | 1071 | //*******************************************************************/ |
TetsuyaKonno | 0:98993ca640e2 | 1072 | static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) |
TetsuyaKonno | 0:98993ca640e2 | 1073 | { |
TetsuyaKonno | 0:98993ca640e2 | 1074 | if (vsync_count > 0) { |
TetsuyaKonno | 0:98993ca640e2 | 1075 | vsync_count--; |
TetsuyaKonno | 0:98993ca640e2 | 1076 | } |
TetsuyaKonno | 0:98993ca640e2 | 1077 | } |
TetsuyaKonno | 0:98993ca640e2 | 1078 | |
TetsuyaKonno | 0:98993ca640e2 | 1079 | //******************************************************************// |
TetsuyaKonno | 0:98993ca640e2 | 1080 | // @brief Wait for the specified number of times Vsync occurs |
TetsuyaKonno | 0:98993ca640e2 | 1081 | // @param[in] wait_count : Wait count |
TetsuyaKonno | 0:98993ca640e2 | 1082 | // @retval None |
TetsuyaKonno | 0:98993ca640e2 | 1083 | //*******************************************************************/ |
TetsuyaKonno | 0:98993ca640e2 | 1084 | static void WaitVsync(const int32_t wait_count) |
TetsuyaKonno | 0:98993ca640e2 | 1085 | { |
TetsuyaKonno | 0:98993ca640e2 | 1086 | vsync_count = wait_count; |
TetsuyaKonno | 0:98993ca640e2 | 1087 | while (vsync_count > 0) { |
TetsuyaKonno | 0:98993ca640e2 | 1088 | /* Do nothing */ |
TetsuyaKonno | 0:98993ca640e2 | 1089 | } |
TetsuyaKonno | 0:98993ca640e2 | 1090 | } |
TetsuyaKonno | 0:98993ca640e2 | 1091 | |
TetsuyaKonno | 0:98993ca640e2 | 1092 | //------------------------------------------------------------------// |
TetsuyaKonno | 0:98993ca640e2 | 1093 | // End of file |
TetsuyaKonno | 0:98993ca640e2 | 1094 | //------------------------------------------------------------------// |