with Ada.Text_IO;
							 | 
						|
								with bcm2835_h;
							 | 
						|
								with st7565lcd;
							 | 
						|
								
							 | 
						|
								with Interfaces; use Interfaces;
							 | 
						|
								with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Streams.Stream_IO;
							 | 
						|
								use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Streams.Stream_IO;
							 | 
						|
								with Ada.Command_Line; use Ada.Command_Line;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								procedure raspilcd is
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    -- shorter names for packages
							 | 
						|
								    package IO  renames Ada.Text_IO;
							 | 
						|
								    package LCD renames st7565lcd;
							 | 
						|
								    package IOS renames Ada.Streams.Stream_IO;
							 | 
						|
								
							 | 
						|
								    -- stream.io definitions
							 | 
						|
								    My_File        : IOS.FILE_TYPE;
							 | 
						|
								    My_File_Access : IOS.STREAM_ACCESS;
							 | 
						|
								
							 | 
						|
								    -- picture data
							 | 
						|
								    picture_header  : LCD.t_bmp_header;
							 | 
						|
								    color_mask      : LCD.t_color_mask;
							 | 
						|
								    picture_data    : LCD.t_bmp_array (0 .. 128 * 64 - 1);
							 | 
						|
								
							 | 
						|
								    -- lcd pixel array
							 | 
						|
								    lcd_data : LCD.t_lcd_array;
							 | 
						|
								
							 | 
						|
								    -- exception handling
							 | 
						|
								    tool_info : string := "raspi-lcd version 0.1, (c) 2014 by tmeissner";
							 | 
						|
								    usage     : string := "usage: ./raspitest BMP-FILE (as root)";
							 | 
						|
								    bmp_error : string := "error: malformed BMP-FILE (valid: 128x64, no compression, 32bpp)";
							 | 
						|
								    cli_exception : exception;
							 | 
						|
								    bmp_exception : exception;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								begin
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    -- no picture given
							 | 
						|
								    if Argument_Count /= 1 then
							 | 
						|
								        raise cli_exception;
							 | 
						|
								    end if;
							 | 
						|
								
							 | 
						|
								    -- open picture file
							 | 
						|
								    declare
							 | 
						|
								        filename : string := Argument (1);
							 | 
						|
								    begin
							 | 
						|
								        IOS.Open(My_File, In_File, filename);
							 | 
						|
								        My_File_Access := IOS.Stream(My_File);
							 | 
						|
								    end;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    -- read bmp header
							 | 
						|
								    LCD.t_bmp_header'Read(My_File_Access, picture_header);
							 | 
						|
								
							 | 
						|
								    --Put_Line("Width:       " & Integer'Image(picture_header.biWidth));
							 | 
						|
								    --Put_Line("Height:      " & Integer'Image(picture_header.biHeight));
							 | 
						|
								    --Put_Line("Color Depth: " & Integer'Image(Integer(picture_header.biBitCount)));
							 | 
						|
								    --Put_Line("Compression: " & Integer'Image(Integer(picture_header.biCompression)));
							 | 
						|
								
							 | 
						|
								    -- check for valid bmp format    
							 | 
						|
								    if (abs picture_header.biHeight /= 64 or picture_header.biWidth /= 128 or 
							 | 
						|
								        (picture_header.biCompression /= 0 and picture_header.biCompression /= 3) or
							 | 
						|
								        picture_header.biBitCount /= 32) then
							 | 
						|
								        raise bmp_exception;
							 | 
						|
								    end if;
							 | 
						|
								
							 | 
						|
								    -- get color map if existing
							 | 
						|
								    if picture_header.biCompression = 3 then
							 | 
						|
								        LCD.t_color_mask'Read(My_File_Access, color_mask);
							 | 
						|
								    end if;
							 | 
						|
								   
							 | 
						|
								    -- read in image data
							 | 
						|
								    if picture_header.biHeight < 0 then
							 | 
						|
								
							 | 
						|
								        -- top-down pixel matrix
							 | 
						|
								        for index in picture_data'range loop
							 | 
						|
								            if not IOS.End_Of_File(My_File) then
							 | 
						|
								                LCD.t_byte_array'Read(My_File_Access, picture_data(index));
							 | 
						|
								            end if;
							 | 
						|
								        end loop;
							 | 
						|
								
							 | 
						|
								    else
							 | 
						|
								
							 | 
						|
								        -- bottom-top pixel matrix
							 | 
						|
								        for row in reverse 0 .. 63 loop
							 | 
						|
								            for column in 0 .. 127 loop
							 | 
						|
								                if not IOS.End_Of_File(My_File) then
							 | 
						|
								                    LCD.t_byte_array'Read(My_File_Access, picture_data(row * 128 + column));
							 | 
						|
								                end if;
							 | 
						|
								            end loop;
							 | 
						|
								        end loop;
							 | 
						|
								
							 | 
						|
								    end if;
							 | 
						|
								    
							 | 
						|
								    -- close picture file
							 | 
						|
								    Ada.Streams.Stream_IO.Close(My_File);
							 | 
						|
								    
							 | 
						|
								    -- convert bmp to lcd matrix
							 | 
						|
								    lcd_data := LCD.bmp_to_lcd(bmp => picture_data, color_mask => color_mask);
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    -- load bcm2835 lib
							 | 
						|
								    -- print picture and some text on lcd
							 | 
						|
								    if integer(bcm2835_h.bcm2835_init) = 0 then
							 | 
						|
								
							 | 
						|
								        IO.Put_Line("Error while initializing BCM2835 library");
							 | 
						|
								    
							 | 
						|
								    else
							 | 
						|
								
							 | 
						|
								        LCD.io_init;
							 | 
						|
								 
							 | 
						|
								        LCD.lcd_init;
							 | 
						|
								 
							 | 
						|
								        LCD.lcd_picture(xpos => 0, ypos => 0, picture => lcd_data);
							 | 
						|
								
							 | 
						|
								        bcm2835_h.bcm2835_delay(5000);
							 | 
						|
								 
							 | 
						|
								        LCD.lcd_clear;
							 | 
						|
								
							 | 
						|
								        LCD.lcd_ascii57_string(xpos => 0, ypos => 0, data => "raspiFPGA 0.1");
							 | 
						|
								        LCD.lcd_ascii57_string(xpos => 0, ypos => 1, data => "(c) raspiDEV 2013");
							 | 
						|
								
							 | 
						|
								        -- close library
							 | 
						|
								        if integer(bcm2835_h.bcm2835_close) = 0 then
							 | 
						|
								            IO.Put_Line("Error while closing BCM2835 library");
							 | 
						|
								        end if;
							 | 
						|
								
							 | 
						|
								    end if;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    -- exception handling
							 | 
						|
								    exception
							 | 
						|
								    when e: cli_exception =>
							 | 
						|
								        put_line(tool_info);
							 | 
						|
								        put_line(usage);
							 | 
						|
								    when e: bmp_exception =>
							 | 
						|
								        put_line(tool_info);
							 | 
						|
								        put_line(bmp_error);
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								end raspilcd;
							 |