Compare commits
	
		
			5 commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 59b2022e48 | |||
| dc61ac7f85 | |||
| 3f6016106b | |||
| e43202a113 | |||
| d6932ae70c | 
					 11 changed files with 167 additions and 37 deletions
				
			
		| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
562
 | 
					641
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								photo.jpg
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								photo.jpg
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 65 KiB  | 
							
								
								
									
										20
									
								
								src/bmp.c
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								src/bmp.c
									
										
									
									
									
								
							| 
						 | 
					@ -64,7 +64,7 @@ void BMP_ConstructFilename(int number, char *buffer, unsigned int size)
 | 
				
			||||||
    memcpy(buffer + size - 5, ".BMP", 5);
 | 
					    memcpy(buffer + size - 5, ".BMP", 5);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BMP_Save(uint8_t *data, int width, int height)
 | 
					int BMP_Save(uint8_t *data, int width, int height)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    FATFS fs;
 | 
					    FATFS fs;
 | 
				
			||||||
    FIL fp;
 | 
					    FIL fp;
 | 
				
			||||||
| 
						 | 
					@ -74,19 +74,19 @@ void BMP_Save(uint8_t *data, int width, int height)
 | 
				
			||||||
    rc = f_mount(&fs, "", 0);
 | 
					    rc = f_mount(&fs, "", 0);
 | 
				
			||||||
    if(rc)
 | 
					    if(rc)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int file_number = BMP_PickFileNumber();
 | 
					    int file_number = BMP_PickFileNumber();
 | 
				
			||||||
    if(file_number == -1)
 | 
					    if(file_number == -1)
 | 
				
			||||||
        return;
 | 
					        return -2;
 | 
				
			||||||
    char filename[13];
 | 
					    char filename[13];
 | 
				
			||||||
    BMP_ConstructFilename(file_number, filename, sizeof(filename));
 | 
					    BMP_ConstructFilename(file_number, filename, sizeof(filename));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rc = f_open(&fp, filename, FA_WRITE | FA_CREATE_NEW);
 | 
					    rc = f_open(&fp, filename, FA_WRITE | FA_CREATE_NEW);
 | 
				
			||||||
    if(rc)
 | 
					    if(rc)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return;
 | 
					        return -3;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Rows must be padded to a multiple of 4 bytes
 | 
					    // Rows must be padded to a multiple of 4 bytes
 | 
				
			||||||
| 
						 | 
					@ -121,24 +121,26 @@ void BMP_Save(uint8_t *data, int width, int height)
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(f_write(&fp, &file_header, sizeof(file_header), &bw) != FR_OK)
 | 
					    if(f_write(&fp, &file_header, sizeof(file_header), &bw) != FR_OK)
 | 
				
			||||||
        return;
 | 
					        return -4;
 | 
				
			||||||
    if(f_write(&fp, &core_header, sizeof(core_header), &bw) != FR_OK)
 | 
					    if(f_write(&fp, &core_header, sizeof(core_header), &bw) != FR_OK)
 | 
				
			||||||
        return;
 | 
					        return -4;
 | 
				
			||||||
    if(f_write(&fp, &colour_table, sizeof(colour_table), &bw) != FR_OK)
 | 
					    if(f_write(&fp, &colour_table, sizeof(colour_table), &bw) != FR_OK)
 | 
				
			||||||
        return;
 | 
					        return -4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // BMPs are stored with their rows from the bottom upwards
 | 
					    // BMPs are stored with their rows from the bottom upwards
 | 
				
			||||||
    for(int y = height - 1; y >= 0; y--)
 | 
					    for(int y = height - 1; y >= 0; y--)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        uint8_t *row = data + y * (width / 8);
 | 
					        uint8_t *row = data + y * (width / 8);
 | 
				
			||||||
        if(f_write(&fp, row, width / 8, &bw) != FR_OK)
 | 
					        if(f_write(&fp, row, width / 8, &bw) != FR_OK)
 | 
				
			||||||
            return;
 | 
					            return -4;
 | 
				
			||||||
        if(padding_length != 0)
 | 
					        if(padding_length != 0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if(f_write(&fp, padding_bytes, padding_length, &bw) != FR_OK)
 | 
					            if(f_write(&fp, padding_bytes, padding_length, &bw) != FR_OK)
 | 
				
			||||||
                return;
 | 
					                return -4;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    f_close(&fp);
 | 
					    f_close(&fp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return file_number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,4 +4,4 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BMP_Save(uint8_t *data, int width, int height);
 | 
					int BMP_Save(uint8_t *data, int width, int height);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Use 2D Floyd-Steinberg dithering. Uncomment to use simple line-wise
 | 
				
			||||||
 | 
					// dithering.
 | 
				
			||||||
 | 
					#define CONFIG_USE_2D_DITHERING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Use a primitive autoexposure by shifting each frames luminosity based on the
 | 
				
			||||||
 | 
					// ratio of white to black pixels in the previous frames
 | 
				
			||||||
 | 
					// #define CONFIG_USE_EXPOSURE_CORRECTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Capture a frame when it is within this tolerance of 50% black pixels
 | 
				
			||||||
 | 
					#define CONFIG_TOLERANCE        0.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Wait this number of frames before a frame is eligible for beaing captured
 | 
				
			||||||
 | 
					#define CONFIG_MIN_FRAMES       2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Maximum number of frames to wait. Capture even if it is not within tolerance.
 | 
				
			||||||
 | 
					#define CONFIG_MAX_FRAMES       15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Print number of black pixels per captured frame
 | 
				
			||||||
 | 
					// #define CONFIG_PRINT_EXPOSURE_DEBUG_INFORMATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Print file number if a file was saved to SD card
 | 
				
			||||||
 | 
					#define CONFIG_PRINT_FILE_NUMBER
 | 
				
			||||||
							
								
								
									
										38
									
								
								src/main.c
									
										
									
									
									
								
							
							
						
						
									
										38
									
								
								src/main.c
									
										
									
									
									
								
							| 
						 | 
					@ -14,18 +14,48 @@ int main(void)
 | 
				
			||||||
    Camera_Init();
 | 
					    Camera_Init();
 | 
				
			||||||
    LTP1245_Init();
 | 
					    LTP1245_Init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LTP1245_FeedPaper(100);
 | 
					    LTP1245_FeedPaper(50);
 | 
				
			||||||
    LTP1245_FeedPaper(10);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(!Camera_Captured);
 | 
					    while(!Camera_Captured);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    extern uint8_t ImageBuffer[CAMERA_IMAGE_WIDTH * CAMERA_IMAGE_HEIGHT / 8];
 | 
					    extern uint8_t ImageBuffer[CAMERA_IMAGE_WIDTH * CAMERA_IMAGE_HEIGHT / 8];
 | 
				
			||||||
    Print_Image(ImageBuffer, CAMERA_IMAGE_WIDTH, CAMERA_IMAGE_HEIGHT, 2);
 | 
					    Print_Image(ImageBuffer, CAMERA_IMAGE_WIDTH, CAMERA_IMAGE_HEIGHT, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LTP1245_FeedPaper(100);
 | 
					#ifdef CONFIG_PRINT_EXPOSURE_DEBUG_INFORMATION
 | 
				
			||||||
 | 
					    char buffer[32] = "Finished after lines: ";
 | 
				
			||||||
 | 
					    itoa(Camera_FinalFrameCount, buffer + strlen(buffer), 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    BMP_Save(ImageBuffer, CAMERA_IMAGE_WIDTH, CAMERA_IMAGE_HEIGHT);
 | 
					    Print_Text(buffer, &Hannover_Messe_Serif_26, Print_LeftAligned);
 | 
				
			||||||
 | 
					    Print_Text("Black pixel counts:", &Hannover_Messe_Serif_26,
 | 
				
			||||||
 | 
					        Print_LeftAligned);
 | 
				
			||||||
 | 
					    for(int i = 0; i < Camera_FinalFrameCount; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(i >= (int)(sizeof(Camera_BlackPixelCounts)
 | 
				
			||||||
 | 
					            / sizeof(Camera_BlackPixelCounts[0])))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        itoa(Camera_BlackPixelCounts[i], buffer, 10);
 | 
				
			||||||
 | 
					        Print_Text(buffer, &Hannover_Messe_Serif_26, Print_LeftAligned);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int file_number = BMP_Save(ImageBuffer, CAMERA_IMAGE_WIDTH,
 | 
				
			||||||
 | 
					        CAMERA_IMAGE_HEIGHT);
 | 
				
			||||||
 | 
					    (void)file_number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PRINT_FILE_NUMBER
 | 
				
			||||||
 | 
					    LTP1245_FeedPaper(10);
 | 
				
			||||||
 | 
					    char buffer[32] = "-   ";
 | 
				
			||||||
 | 
					    if(file_number >= 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        itoa(file_number, buffer + strlen(buffer), 10);
 | 
				
			||||||
 | 
					        strcpy(buffer + strlen(buffer), "   -");
 | 
				
			||||||
 | 
					        Print_Text(buffer, &Hannover_Messe_Serif_26, Print_Centred);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    LTP1245_FeedPaper(80);
 | 
				
			||||||
    LTP1245_FeedPaper(10);
 | 
					    LTP1245_FeedPaper(10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GPIOC->BRR = (1 << PIN_SUPPLY);
 | 
					    GPIOC->BRR = (1 << PIN_SUPPLY);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@
 | 
				
			||||||
#include "font_arpegius_16.h"
 | 
					#include "font_arpegius_16.h"
 | 
				
			||||||
#include "font_arpegius_32.h"
 | 
					#include "font_arpegius_32.h"
 | 
				
			||||||
#include "bmp.h"
 | 
					#include "bmp.h"
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(void);
 | 
					int main(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										61
									
								
								src/ov7670.c
									
										
									
									
									
								
							
							
						
						
									
										61
									
								
								src/ov7670.c
									
										
									
									
									
								
							| 
						 | 
					@ -126,12 +126,12 @@
 | 
				
			||||||
#define REG_HAECC2              0xa0
 | 
					#define REG_HAECC2              0xa0
 | 
				
			||||||
#define REG_SCALING_PCLK_DELAY  0xa2
 | 
					#define REG_SCALING_PCLK_DELAY  0xa2
 | 
				
			||||||
#define REG_NT_CTRL             0xa4
 | 
					#define REG_NT_CTRL             0xa4
 | 
				
			||||||
#define REG_BD50MAX             0xa5
 | 
					#define REG_AECGMAX             0xa5
 | 
				
			||||||
#define REG_HAECC3              0xa6
 | 
					#define REG_LPH                 0xa6
 | 
				
			||||||
#define REG_HAECC4              0xa7
 | 
					#define REG_UPL                 0xa7
 | 
				
			||||||
#define REG_HAECC5              0xa8
 | 
					#define REG_TPL                 0xa8
 | 
				
			||||||
#define REG_HAECC6              0xa9
 | 
					#define REG_TPH                 0xa9
 | 
				
			||||||
#define REG_HAECC7              0xaa
 | 
					#define REG_NALG                0xaa
 | 
				
			||||||
#define REG_BD60MAX             0xab
 | 
					#define REG_BD60MAX             0xab
 | 
				
			||||||
#define REG_STR_OPT             0xac
 | 
					#define REG_STR_OPT             0xac
 | 
				
			||||||
#define REG_STR_R               0xad
 | 
					#define REG_STR_R               0xad
 | 
				
			||||||
| 
						 | 
					@ -156,10 +156,13 @@ static volatile int FrameCount = 0;
 | 
				
			||||||
volatile int Camera_Captured = 0;
 | 
					volatile int Camera_Captured = 0;
 | 
				
			||||||
static unsigned int BlackPixels = 0;
 | 
					static unsigned int BlackPixels = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CAMERA_USE_EXPOSURE_CORRECTION
 | 
					#ifdef CONFIG_USE_EXPOSURE_CORRECTION
 | 
				
			||||||
static volatile int ExposureCorrection = 0;
 | 
					static volatile int ExposureCorrection = 0;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					volatile unsigned int Camera_BlackPixelCounts[] = {0};
 | 
				
			||||||
 | 
					volatile int Camera_FinalFrameCount = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint8_t ReadRegister(uint8_t reg)
 | 
					static uint8_t ReadRegister(uint8_t reg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    while(I2C1->SR2 & I2C_SR2_BUSY);
 | 
					    while(I2C1->SR2 & I2C_SR2_BUSY);
 | 
				
			||||||
| 
						 | 
					@ -301,6 +304,24 @@ void Camera_Init(void)
 | 
				
			||||||
    WriteRegister(REG_COM14, 0x18 | 1);
 | 
					    WriteRegister(REG_COM14, 0x18 | 1);
 | 
				
			||||||
    WriteRegister(REG_SCALING_PCLK_DIV, 1);
 | 
					    WriteRegister(REG_SCALING_PCLK_DIV, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Set maximum gain ceiling
 | 
				
			||||||
 | 
					    WriteRegister(REG_COM9, 0xca);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Disable auto-exposure, enable auto-gain
 | 
				
			||||||
 | 
					    WriteRegister(REG_COM8, 0xec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // // Disable auto-gain, enable auto-exposure
 | 
				
			||||||
 | 
					    // WriteRegister(REG_COM8, 0xe9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Use histogram-based auto-exposure
 | 
				
			||||||
 | 
					    WriteRegister(REG_NALG, 0x94);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Increase AEC speed:
 | 
				
			||||||
 | 
					    // ‘Decrease TPL but not less than UPL [default 0xc1] and increase TPH but
 | 
				
			||||||
 | 
					    // not bigger than LPH [default 0xf0]’
 | 
				
			||||||
 | 
					    WriteRegister(REG_TPL, 0xc1);
 | 
				
			||||||
 | 
					    WriteRegister(REG_TPH, 0xf0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Enable VSYNC interrupts. TIM3 is enabled at the first VSYNC.
 | 
					    // Enable VSYNC interrupts. TIM3 is enabled at the first VSYNC.
 | 
				
			||||||
    FrameCount = 0;
 | 
					    FrameCount = 0;
 | 
				
			||||||
    Camera_Captured = 0;
 | 
					    Camera_Captured = 0;
 | 
				
			||||||
| 
						 | 
					@ -327,20 +348,34 @@ void TIM1_CC_IRQHandler(void)
 | 
				
			||||||
    CurrentLine = 0;
 | 
					    CurrentLine = 0;
 | 
				
			||||||
    FrameCount++;
 | 
					    FrameCount++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CAMERA_USE_EXPOSURE_CORRECTION
 | 
					#ifdef CONFIG_USE_EXPOSURE_CORRECTION
 | 
				
			||||||
    // Correct exposure across frames
 | 
					    // Correct exposure across frames
 | 
				
			||||||
    ExposureCorrection += 32 * BlackPixels / CAMERA_PIXELS - 16;
 | 
					    ExposureCorrection += 32 * BlackPixels / CAMERA_PIXELS - 16;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Check if the last frame's exposure is reasonable
 | 
					    // Check if the last frame's exposure is reasonable
 | 
				
			||||||
    if(FrameCount >= 5)
 | 
					    if(!Camera_Captured && FrameCount >= CONFIG_MIN_FRAMES
 | 
				
			||||||
 | 
					        && (
 | 
				
			||||||
 | 
					            (BlackPixels > (int)(CAMERA_PIXELS / 2
 | 
				
			||||||
 | 
					                - CAMERA_PIXELS * CONFIG_TOLERANCE)
 | 
				
			||||||
 | 
					            && BlackPixels < (int)(CAMERA_PIXELS / 2
 | 
				
			||||||
 | 
					                + CAMERA_PIXELS * CONFIG_TOLERANCE))
 | 
				
			||||||
 | 
					            || FrameCount >= CONFIG_MAX_FRAMES
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Camera_Captured = 1;
 | 
					        Camera_Captured = 1;
 | 
				
			||||||
 | 
					        Camera_FinalFrameCount = FrameCount;
 | 
				
			||||||
        // Disable everything
 | 
					        // Disable everything
 | 
				
			||||||
        TIM3->CR1 = 0;
 | 
					        TIM3->CR1 = 0;
 | 
				
			||||||
        TIM1->CR1 = 0;
 | 
					        TIM1->CR1 = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(FrameCount < (int)(sizeof(Camera_BlackPixelCounts)
 | 
				
			||||||
 | 
					        / sizeof(Camera_BlackPixelCounts[0])))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Camera_BlackPixelCounts[FrameCount] = BlackPixels;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Reset black pixel counter
 | 
					    // Reset black pixel counter
 | 
				
			||||||
    BlackPixels = 0;
 | 
					    BlackPixels = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -361,7 +396,7 @@ void TIM3_IRQHandler(void)
 | 
				
			||||||
    DMA1_Channel6->CCR = DMA_CCR_PL | DMA_CCR_MINC | DMA_CCR_EN;
 | 
					    DMA1_Channel6->CCR = DMA_CCR_PL | DMA_CCR_MINC | DMA_CCR_EN;
 | 
				
			||||||
    TIM3->DIER |= TIM_DIER_CC1DE;
 | 
					    TIM3->DIER |= TIM_DIER_CC1DE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CAMERA_USE_2D_DITHERING
 | 
					#ifdef CONFIG_USE_2D_DITHERING
 | 
				
			||||||
    static int8_t y_errors[CAMERA_IMAGE_WIDTH + 2] = {0};
 | 
					    static int8_t y_errors[CAMERA_IMAGE_WIDTH + 2] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(CurrentLine == 0)
 | 
					    if(CurrentLine == 0)
 | 
				
			||||||
| 
						 | 
					@ -374,7 +409,7 @@ void TIM3_IRQHandler(void)
 | 
				
			||||||
        && (CurrentLine / 2 < CAMERA_IMAGE_HEIGHT))
 | 
					        && (CurrentLine / 2 < CAMERA_IMAGE_HEIGHT))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CAMERA_USE_2D_DITHERING
 | 
					#ifdef CONFIG_USE_2D_DITHERING
 | 
				
			||||||
        // Apply errors propagated from the previous line. Since y_errors is
 | 
					        // Apply errors propagated from the previous line. Since y_errors is
 | 
				
			||||||
        // overwritten during x error diffusion, this is done now.
 | 
					        // overwritten during x error diffusion, this is done now.
 | 
				
			||||||
        for(int i = 0; i < CAMERA_IMAGE_WIDTH; i++)
 | 
					        for(int i = 0; i < CAMERA_IMAGE_WIDTH; i++)
 | 
				
			||||||
| 
						 | 
					@ -388,7 +423,7 @@ void TIM3_IRQHandler(void)
 | 
				
			||||||
        for(int i = 0; i < CAMERA_IMAGE_WIDTH; i++)
 | 
					        for(int i = 0; i < CAMERA_IMAGE_WIDTH; i++)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            int pixel = LineBuffer[i + 15] + x_error;
 | 
					            int pixel = LineBuffer[i + 15] + x_error;
 | 
				
			||||||
#ifdef CAMERA_USE_EXPOSURE_CORRECTION
 | 
					#ifdef CONFIG_USE_EXPOSURE_CORRECTION
 | 
				
			||||||
            if(ExposureCorrection < 0)
 | 
					            if(ExposureCorrection < 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if(pixel < -ExposureCorrection)
 | 
					                if(pixel < -ExposureCorrection)
 | 
				
			||||||
| 
						 | 
					@ -421,7 +456,7 @@ void TIM3_IRQHandler(void)
 | 
				
			||||||
                    ~(0x80 >> (i % 8));
 | 
					                    ~(0x80 >> (i % 8));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CAMERA_USE_2D_DITHERING
 | 
					#ifdef CONFIG_USE_2D_DITHERING
 | 
				
			||||||
            // Error propagated to the next pixel in the same line
 | 
					            // Error propagated to the next pixel in the same line
 | 
				
			||||||
            x_error = error * 7 / 16;
 | 
					            x_error = error * 7 / 16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/ov7670.h
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/ov7670.h
									
										
									
									
									
								
							| 
						 | 
					@ -2,19 +2,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include "stm32f1xx.h"
 | 
					#include "stm32f1xx.h"
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CAMERA_IMAGE_WIDTH      160
 | 
					#define CAMERA_IMAGE_WIDTH      160
 | 
				
			||||||
#define CAMERA_IMAGE_HEIGHT     144
 | 
					#define CAMERA_IMAGE_HEIGHT     144
 | 
				
			||||||
#define CAMERA_PIXELS           (CAMERA_IMAGE_WIDTH * CAMERA_IMAGE_HEIGHT)
 | 
					#define CAMERA_PIXELS           (CAMERA_IMAGE_WIDTH * CAMERA_IMAGE_HEIGHT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Use 2D Floyd-Steinberg dithering. Uncomment to use simple line-wise
 | 
					 | 
				
			||||||
// dithering.
 | 
					 | 
				
			||||||
#define CAMERA_USE_2D_DITHERING
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Use a primitive autoexposure by shifting each frames luminosity based on the
 | 
					 | 
				
			||||||
// ratio of white to black pixels in the previous frames
 | 
					 | 
				
			||||||
// #define CAMERA_USE_EXPOSURE_CORRECTION
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern volatile int Camera_Captured;
 | 
					extern volatile int Camera_Captured;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern volatile unsigned int Camera_BlackPixelCounts[CONFIG_MAX_FRAMES];
 | 
				
			||||||
 | 
					extern volatile int Camera_FinalFrameCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Camera_Init(void);
 | 
					void Camera_Init(void);
 | 
				
			||||||
							
								
								
									
										35
									
								
								src/print.c
									
										
									
									
									
								
							
							
						
						
									
										35
									
								
								src/print.c
									
										
									
									
									
								
							| 
						 | 
					@ -3,12 +3,45 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint8_t Print_Buffer[PRINT_BUFFER_LINES * LTP1245_LINE_BYTES];
 | 
					static uint8_t Print_Buffer[PRINT_BUFFER_LINES * LTP1245_LINE_BYTES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Print_Text(const char *text, const Font_t *font)
 | 
					int Print_MeasureTextWidth(const char *text, const Font_t *font)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char c;
 | 
				
			||||||
 | 
					    int width = 0;
 | 
				
			||||||
 | 
					    while((c = *text++) != 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(c > font->glyphcount + font->charoffset
 | 
				
			||||||
 | 
					            || c < font->charoffset)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        width += font->glyphs[c - font->charoffset].width;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return width;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Print_Text(const char *text, const Font_t *font,
 | 
				
			||||||
 | 
					    Print_TextAlignment_t alignment)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int height = font->height;
 | 
					    int height = font->height;
 | 
				
			||||||
    memset(Print_Buffer, 0, LTP1245_LINE_BYTES * height);
 | 
					    memset(Print_Buffer, 0, LTP1245_LINE_BYTES * height);
 | 
				
			||||||
    char c;
 | 
					    char c;
 | 
				
			||||||
    int xpos = 0;
 | 
					    int xpos = 0;
 | 
				
			||||||
 | 
					    if(alignment != Print_LeftAligned)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int width = Print_MeasureTextWidth(text, font);
 | 
				
			||||||
 | 
					        if(width < LTP1245_LINEWIDTH)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(alignment == Print_Centred)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                xpos = LTP1245_LINEWIDTH / 2 - width / 2;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                xpos = LTP1245_LINEWIDTH - width;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    while((c = *text++) != 0)
 | 
					    while((c = *text++) != 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if(c > font->glyphcount + font->charoffset
 | 
					        if(c > font->glyphcount + font->charoffset
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/print.h
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/print.h
									
										
									
									
									
								
							| 
						 | 
					@ -7,5 +7,13 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PRINT_BUFFER_LINES      64
 | 
					#define PRINT_BUFFER_LINES      64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Print_Text(const char *text, const Font_t *font);
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Print_LeftAligned,
 | 
				
			||||||
 | 
					    Print_Centred,
 | 
				
			||||||
 | 
					    Print_RightAligned,
 | 
				
			||||||
 | 
					} Print_TextAlignment_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Print_Text(const char *text, const Font_t *font,
 | 
				
			||||||
 | 
					    Print_TextAlignment_t alignment);
 | 
				
			||||||
void Print_Image(const uint8_t *data, int width, int height, int scale);
 | 
					void Print_Image(const uint8_t *data, int width, int height, int scale);
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue