checked in ada code for safety

including control of GPIOs on NRF level
devel_freefall
Jonas Arnold 3 years ago
parent ab4d31de08
commit e62232101b
  1. 40
      ASYD_Safety/Ada_Microbit/examples/MicroBit/jumper/README.md
  2. 26
      ASYD_Safety/Ada_Microbit/examples/MicroBit/jumper/jumper.gpr
  3. 123
      ASYD_Safety/Ada_Microbit/examples/MicroBit/jumper/src/main.adb

@ -0,0 +1,40 @@
Accelerometer Example
=====================
In this example we will see how to use the accelerometer of the micro:bit. The
accelerometer can, for instance, be used to know which way the micro:bit is
oriented.
Code
====
To get the acceleration value for all axes, we will just call the function
`MicroBit.Accelerometer.Data`. This function returns a record with `X`, `Y`
and `Z` field giving the value for each axis.
```ada
declare
Data : MMA8653.All_Axes_Data;
-- A variable to store the accelerometer data
begin
-- Read Accelerometer data
Data := Accelerometer.Data;
end;
```
We can then use the value in the record to get some information about the
orientation of the micro:bit. For example, if the Y value is below `-200`
the micro:bit is vertical.
Note that the type used to store the values of the accelerometer is declared in
the package `MMA8653` (the driver), so we have to `with` and `use` this package
to be have acces to the operations for this type.
```ada
if Data.Y < -200 then
-- The micro:bit is vertical
end if;
```

@ -0,0 +1,26 @@
with "../../../boards/MicroBit/microbit_zfp.gpr";
project Jumper is
for Runtime ("ada") use Microbit_Zfp'Runtime ("Ada");
for Target use "arm-eabi";
for Main use ("main.adb");
for Languages use ("Ada");
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Create_Missing_Dirs use "True";
package Compiler renames Microbit_Zfp.Compiler;
package Linker is
for Default_Switches ("ada") use Microbit_Zfp.Linker_Switches & ("-Wl,--print-memory-usage", "-Wl,--gc-sections");
end Linker;
package Ide is
for Program_Host use ":1234";
for Communication_Protocol use "remote";
for Connection_Tool use "pyocd";
end Ide;
end Jumper;

@ -0,0 +1,123 @@
------------------------------------------------------------------------------
-- Template --
------------------------------------------------------------------------------
with LSM303; use LSM303;
with MicroBit.Display;
with MicroBit.Accelerometer;
with MicroBit.Console;
-- with MicroBit.IOs;
with MicroBit.Time;
with nRF.GPIO; use nRF.GPIO;
use MicroBit;
-- use MicroBit.IOs;
procedure Main is
-- PROGRAM VARIABLES
Data : LSM303.All_Axes_Data;
-- Value : MicroBit.IOs.Analog_Value;
FreeFallCounter : Integer;
FreeFallDetectionCycles : Integer;
FreeFallCondition : Boolean;
Threshold : Axis_Data;
-- IO VARIABLES
DO_1_Pt : GPIO_Point;
DO_2_Pt : GPIO_Point;
DO_3_Pt : GPIO_Point;
DO_4_Pt : GPIO_Point;
DO_Conf : GPIO_Configuration;
begin
-- PROGRAM STARTUP
Console.Put_Line ("Jumper - starting up ..");
FreeFallCondition := False;
FreeFallCounter := 0;
FreeFallDetectionCycles := 70; -- 70 * 5ms = 350ms
Threshold := 150; -- acceleration sensor threshold
-- IO CONFIGURATION
DO_1_Pt := MB_P2;
DO_2_Pt := MB_P8;
DO_3_Pt := MB_P9;
DO_4_Pt := MB_P16;
DO_Conf.Mode := Mode_Out;
DO_Conf.Resistors := No_Pull;
DO_Conf.Input_Buffer := Input_Buffer_Connect;
DO_Conf.Sense := Sense_Disabled;
-- APPLY IO CONFIGURATION
DO_1_Pt.Configure_IO(DO_Conf);
DO_1_Pt.Clear;
DO_2_Pt.Configure_IO(DO_Conf);
DO_2_Pt.Clear;
DO_3_Pt.Configure_IO(DO_Conf);
DO_3_Pt.Clear;
DO_4_Pt.Configure_IO(DO_Conf);
DO_4_Pt.Clear;
loop
-- Read the accelerometer data
Data := Accelerometer.Data;
-- Print the data on the serial port
Console.Put_Line ("X:" & Data.X'Img & ASCII.HT &
"Y:" & Data.Y'Img & ASCII.HT &
"Z:" & Data.Z'Img);
-- FREEFALL DETECTION
-- check wether all axis are sub-threshold => increment counter
if abs(Data.X) < Threshold and
abs(Data.Y) < Threshold and
abs(Data.Z) < Threshold then
FreeFallCounter := FreeFallCounter + 1;
-- otherwise reset counter
else
FreeFallCounter := 0;
end if;
-- FREEFALL DETECTION
if FreeFallCounter >= FreeFallDetectionCycles then
-- set free fall condition
FreeFallCondition := True;
end if;
-- Clear the LED matrix
Display.Clear;
-- Check, wether FreeFallCondition was triggered
if FreeFallCondition then
-- set outputs
DO_1_Pt.Set;
DO_2_Pt.Set;
DO_3_Pt.Set;
DO_4_Pt.Set;
Display.Display ('X');
else
Display.Display ('0');
end if;
-- Read analogue pin (could be 0,1,2,3,4, or 10)
-- Value := MicroBit.IOs.Analog (2);
-- Console.Put_Line ("Value : " & Value'Image);
-- Set output
-- if Value > Analog_Value(200) then
-- MicroBit.IOs.Set (12, True);
-- else
-- MicroBit.IOs.Set (12, False);
-- end if;
Time.Sleep (5); -- 200 samples / s
end loop;
end Main;
Loading…
Cancel
Save