Skip to content

Commit

Permalink
Hexiwear: Added drivers for various sensors
Browse files Browse the repository at this point in the history
Added drivers for heart rate monitor and barometric pressure sensor

Signed-off-by: J. German Rivera <jgrivera67@gmail.com>
  • Loading branch information
jgrivera67 committed Sep 11, 2017
1 parent 17fffa2 commit 1e7f376
Show file tree
Hide file tree
Showing 20 changed files with 2,465 additions and 298 deletions.
42 changes: 42 additions & 0 deletions building_blocks/portable/number_conversion_utils.adb
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,48 @@ package body Number_Conversion_Utils is
end if;
end Hexadecimal_String_To_Unsigned;

-----------------------------
-- Signed_To_Decimal_String --
------------------------------

procedure Signed_To_Decimal_String (Value : Integer_32;
Buffer : out String;
Actual_Length : out Positive)
is
Tmp_Buffer : String (1 .. 10);
Start_Index : Positive range Tmp_Buffer'Range := Tmp_Buffer'First;
Value_Left : Unsigned_32 := Unsigned_32 (abs Value);
First_Digit_Index : Positive range Buffer'Range;
begin
for I in reverse Tmp_Buffer'Range loop
Tmp_Buffer (I) := Character'Val ((Value_Left mod 10) +
Character'Pos ('0'));
Value_Left := Value_Left / 10;
if Value_Left = 0 then
Start_Index := I;
exit;
end if;
end loop;

Actual_Length := (Tmp_Buffer'Last - Start_Index) + 1;
if Value < 0 then
Actual_Length := Actual_Length + 1;
Buffer (Buffer'First) := '-';
First_Digit_Index := Buffer'First + 1;
else
First_Digit_Index := Buffer'First;
end if;

if Buffer'Length >= Actual_Length then
Buffer (First_Digit_Index .. First_Digit_Index + Actual_Length - 1) :=
Tmp_Buffer (Start_Index .. Tmp_Buffer'Last);
else
raise Program_Error
with "Signed_To_Decimal_String: buffer too small";
end if;

end Signed_To_Decimal_String;

--------------------------------
-- Unsigned_To_Decimal_String --
--------------------------------
Expand Down
5 changes: 5 additions & 0 deletions building_blocks/portable/number_conversion_utils.ads
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ package Number_Conversion_Utils is
Value : out Unsigned_8;
Conversion_Ok : out Boolean);

procedure Signed_To_Decimal_String (Value : Integer_32;
Buffer : out String;
Actual_Length : out Positive)
with Pre => Buffer'Length >= 1;

procedure Unsigned_To_Decimal_String (Value : Unsigned_32;
Buffer : out String;
Actual_Length : out Positive;
Expand Down
23 changes: 12 additions & 11 deletions drivers/board_specific/hexiwear/Accelerometer.adb
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ package body Accelerometer is
--
-- Sign extend to 16 bits 14-bit negative value
--
Value := (Value and Shift_Left (Unsigned_16 (2#11#), 14));
Value := (Value or Shift_Left (Unsigned_16 (2#11#), 14));
end if;

return Acceleration_Reading_Type (Value);
Expand Down Expand Up @@ -233,7 +233,7 @@ package body Accelerometer is
Accelerometer_Const.I2C_Slave_Address,
Accel_Ctrl_Reg1'Enum_Rep);

pragma Assert (Ctrl_Reg1_Value.Active /= 0);
pragma Assert (Ctrl_Reg1_Value.Active = 0);
end Deactivate_Accelerometer;

-------------------
Expand Down Expand Up @@ -291,22 +291,23 @@ package body Accelerometer is
-- Detect_Tapping --
--------------------

procedure Detect_Tapping
procedure Detect_Tapping (Double_Tap_Detected : out Boolean)
is
Pulse_Source_Value : Accel_Pulse_Source_Register_Type with Unreferenced;
Pulse_Source_Value : Accel_Pulse_Source_Register_Type;
begin
Suspend_Until_True (Accelerometer_Var.Tapping_Detected_Susp_Obj);

--
-- Read the accelerometer motion detection register to make the
-- accelerometer de-assert the INT2 pin:
-- Read the accelerometer pulse source register to make the
-- accelerometer de-assert the INT1 pin:
--
Pulse_Source_Value.Value :=
I2C_Read (Accelerometer_Const.I2C_Device_Id,
Accelerometer_Const.I2C_Slave_Address,
Accel_Pulse_Src'Enum_Rep);

--Ada.Text_IO.Put_Line ("Detect_Tapping called:" & Pulse_Source_Value.Value'Image);--???
pragma Assert (Pulse_Source_Value.EA = 1);
Double_Tap_Detected := (Pulse_Source_Value.DPE = 1);
end Detect_Tapping;

----------------
Expand All @@ -330,7 +331,7 @@ package body Accelerometer is

--
-- Enable X, Y, Z Single Pulse and X, Y and Z Double Pulse with
-- DPA = 0 no double pulse abort
-- event latch disabled and no double pulse abort
--
I2C_Write (Accelerometer_Const.I2C_Device_Id,
Accelerometer_Const.I2C_Slave_Address,
Expand Down Expand Up @@ -550,7 +551,7 @@ package body Accelerometer is
FF_MT_Count_Value);

--
-- Set HPF_OUT = 0 - high-pass filter disabled
-- Set HPF_OUT = 1 - high-pass filter enabled
-- Set FS[1:0] = 0 - 2g scale:
-- range -2g .. 2g (0.25mg increments):
-- - A reading of 0x1fff (or 8191) corresponds to 1.99975g
Expand All @@ -563,7 +564,7 @@ package body Accelerometer is
-- 1 = 1000mg / 4096
-- 1 = 0.25mg
--
XYZ_Data_Cfg_Value.HPF_Out := 0;
XYZ_Data_Cfg_Value.HPF_Out := 1;
XYZ_Data_Cfg_Value.FS := XYZ_Data_Cfg_FS_2g;
I2C_Write (Accelerometer_Const.I2C_Device_Id,
Accelerometer_Const.I2C_Slave_Address,
Expand Down Expand Up @@ -834,7 +835,7 @@ package body Accelerometer is
Accel_Int_Source'Enum_Rep);

Runtime_Logs.Error_Print (
"Unexpected Int2 interrupt (Int_Source_Value" &
"Unexpected accelerometer INT2 interrupt (Int_Source_Value" &
Int_Source_Value.Value'Image & ")");
end loop;
end Int2_Task;
Expand Down
2 changes: 1 addition & 1 deletion drivers/board_specific/hexiwear/Accelerometer.ads
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ package Accelerometer is
Z_Axis_Motion : out Unsigned_8)
with Pre => Initialized;

procedure Detect_Tapping
procedure Detect_Tapping (Double_Tap_Detected : out Boolean)
with Pre => Initialized;

Type Milli_G_Type is new Integer;
Expand Down
Loading

0 comments on commit 1e7f376

Please sign in to comment.