{-# LINE 1 "src/Foreign/SwissEphemerisExtras.hsc" #-}
{-# LANGUAGE CPP, ForeignFunctionInterface, RecordWildCards #-}
-- |
-- Module: Foreign.SwissEphemerisExtras
-- License: AGPL-3
-- Maintainer: swiss-ephemeris@lfborjas.com
-- Portability: POSIX
--
-- Declarations of bindings to the underlying C library's non-essential
-- functionality.
--
-- Import at your own risk!
--
-- Exposes very low-level FFI bindings to the C library. Use the @SwissEphemeris.*@ modules and their more
-- Haskell-friendly exports.


module Foreign.SwissEphemerisExtras where

import Foreign
import Foreign.C.Types
import Foreign.C.String



-- | Equivalent to GROB in @gravgroup.h@
data GravityObject a = GravityObject
  { GravityObject a -> CDouble
pos :: CDouble
  -- ^ position of object in /centiseconds/.
  , GravityObject a -> CDouble
lsize :: CDouble
  -- ^ glyph size in your chosen graphics env, left side.
  , GravityObject a -> CDouble
rsize :: CDouble
  -- ^ glyph size in your chosen graphics env, right side.
  , GravityObject a -> CDouble
ppos :: CDouble
  -- ^ corrected ("placed") position after we're done; can set as zero.
  , GravityObject a -> CInt
sector_no :: CInt
  -- ^ assigned sector number, will be set as objects are
  -- rearranged.
  , GravityObject a -> CInt
sequence_no :: CInt
  -- ^ number in the sequence of objects, won't be re-assigned,
  -- but setting it is optional
  , GravityObject a -> CInt
level_no :: CInt
  -- ^ when allowing for multi-level arrangement, the level
  -- an object ends up.
  , GravityObject a -> CDouble
scale :: CDouble
  -- ^ if any resizing is done, percentage of full size.
  , GravityObject a -> Ptr a
dp :: Ptr a
  -- ^ pointer to additional data.
  }

instance Storable a => Storable (GravityObject a) where
  alignment :: GravityObject a -> Int
alignment GravityObject a
_ = Int
8
{-# LINE 52 "src/Foreign/SwissEphemerisExtras.hsc" #-}
  sizeOf _ = (64)
{-# LINE 53 "src/Foreign/SwissEphemerisExtras.hsc" #-}
  peek ptr = do
    pos <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 55 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    lsize <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 56 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    rsize <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 57 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    ppos <- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 58 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    sector_no <- (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 59 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    sequence_no <- (\hsc_ptr -> peekByteOff hsc_ptr 36) ptr
{-# LINE 60 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    level_no <- (\hsc_ptr -> peekByteOff hsc_ptr 40) ptr
{-# LINE 61 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    scale <- (\hsc_ptr -> peekByteOff hsc_ptr 48) ptr
{-# LINE 62 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    dp <- (\hsc_ptr -> peekByteOff hsc_ptr 56) ptr
{-# LINE 63 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    return $ GravityObject{..}
  poke :: Ptr (GravityObject a) -> GravityObject a -> IO ()
poke Ptr (GravityObject a)
ptr (GravityObject{Ptr a
CInt
CDouble
dp :: Ptr a
scale :: CDouble
level_no :: CInt
sequence_no :: CInt
sector_no :: CInt
ppos :: CDouble
rsize :: CDouble
lsize :: CDouble
pos :: CDouble
dp :: forall a. GravityObject a -> Ptr a
scale :: forall a. GravityObject a -> CDouble
level_no :: forall a. GravityObject a -> CInt
sequence_no :: forall a. GravityObject a -> CInt
sector_no :: forall a. GravityObject a -> CInt
ppos :: forall a. GravityObject a -> CDouble
rsize :: forall a. GravityObject a -> CDouble
lsize :: forall a. GravityObject a -> CDouble
pos :: forall a. GravityObject a -> CDouble
..})= do
    (\Ptr (GravityObject a)
hsc_ptr -> Ptr (GravityObject a) -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr (GravityObject a)
hsc_ptr Int
0) Ptr (GravityObject a)
ptr CDouble
pos
{-# LINE 66 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr lsize
{-# LINE 67 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr rsize
{-# LINE 68 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 24) ptr ppos
{-# LINE 69 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 32) ptr sector_no
{-# LINE 70 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 36) ptr sequence_no
{-# LINE 71 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 40) ptr level_no
{-# LINE 72 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 48) ptr scale
{-# LINE 73 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 56) ptr dp
{-# LINE 74 "src/Foreign/SwissEphemerisExtras.hsc" #-}
    

-- | Simple helper to recalculate positions for planets/bodies
-- for drawing in a circular chart without collisions/
-- overlaps, keeping them inside their assigned "sectors"
-- (e.g. houses.) See 'GravityObject'.
foreign import ccall unsafe "dgravgroup.h grav_group"
  c_grav_group :: Ptr (GravityObject a)
               -- ^ array of @GROB@s ('GravityObject's)
               -> CInt
               -- ^ nob
               -> Ptr CDouble
               -- ^ sectors; must include an extra, final sector.
               -> CInt
               -- ^ nsectors
               -> CString
               -- ^ char* err
               -> (IO CInt)

-- | More advanced version of @grav_group@ that also allows:
--
-- * Sending in zero sectors (i.e. just drawing in a circle)
-- * Shifting between "levels" (closer to the center) as a way
-- of resolving collisions in glyphs.
--
foreign import ccall unsafe "dgravgroup.h grav_group2"
  c_grav_group2 :: Ptr (GravityObject a)
               -- ^ array of @GROB@s ('GravityObject's)
               -> CInt
               -- ^ nob
               -> Ptr CDouble
               -- ^ sectors; must include an extra, final sector.
               -> CInt
               -- ^ nsectors
               -> CBool
               -- ^ allow planets to "shift" levels?
               -> CString
               -- ^ char* err
               -> (IO CInt)