|
|
- -- raspilcd, a simple tool to display bmp pictures & text on a ST7565 LCD
- -- Copyright (C) 2014 Torsten Meissner
- --
- -- This program is free software: you can redistribute it and/or modify
- -- it under the terms of the GNU General Public License as published by
- -- the Free Software Foundation, either version 3 of the License, or
- -- (at your option) any later version.
- --
- -- This program is distributed in the hope that it will be useful,
- -- but WITHOUT ANY WARRANTY; without even the implied warranty of
- -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- -- GNU General Public License for more details.
- --
- -- You should have received a copy of the GNU General Public License
- -- along with this program. If not, see http://www.gnu.org/licenses/.
-
-
-
- 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;
|