-- -- Author: Brent Seidel -- Date: 9-Aug-2024 -- -- This file is part of bbs_embed. -- Bbs_embed 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. -- -- bbs_embed 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 bbs_embed. If not, see .-- -- with Ada.Text_IO; with Ada.Direct_IO; with Ada.IO_Exceptions; with BBS.units; use type BBS.units.emf_v; -- -- This is a high level object-oriented interface to some of the AIN pins on -- the BeagleBone Black. This uses the control files in the /sys directory -- tree. Since it operates through the file system, it is not particularly high -- performance, but should be adequate for running relays or indicators. If you -- need higher performance, it should be possible to access the device registers -- directly through /dev/kmem. It should be possible to change the underlaying -- implementation here without impacting code that uses this package. -- package BBS.embed.AIN.linux is -- -- The analog related pins for the BeagleBone Black are: -- AIN0 - P9_39 -- AIN1 - P9_40 -- AIN2 - P9_37 -- AIN3 - P9_38 -- AIN4 - P9_33 -- AIN5 - P9_36 -- AIN6 - P9_35 -- Vdd_ADC - P9_32 -- Gnd_ADC - P9_34 -- -- The processor datasheet indicates that there are actually 8 analog inputs, but -- perhaps one of them may not be brought out to a processor pin. The analog inputs -- appear to be part of a touch screen system, but accessing those functions may -- require writing a specific linux device driver. -- -- There are no pin control files for these pins - they are dedicated to analog -- input. -- type Linux_AIN_record is new AIN_record with private; max_volts : constant BBS.units.emf_v := 1.8; -- -- Create a new AIN object -- function ain_new return AIN; -- -- Configure a new AIN object. Port should be one of the AIN constants from -- the BBS.BBB.pins package. -- procedure configure(self : in out Linux_AIN_record; port : string); -- -- Read the value of an input AIN. The ADC has 12 bits of resolution, so the -- returned value would be in the range 0-4095. -- overriding function get(self : Linux_AIN_record) return uint12; -- -- Read the value of an input AIN in volts. The maximum value is 1.8 so the -- result is equal to 1.8*(reading in uint12)/uint12'last; -- function get(self : Linux_AIN_record) return BBS.units.emf_v; -- -- Close the file for the pin. Once this is called, the AIN object will -- need to be re-configured. -- procedure close(self : in out Linux_AIN_record); private package Char_IO is new Ada.Direct_IO(Character); type Linux_AIN_record is new AIN_record with record AIN_file : Char_IO.File_Type; end record; end;