packages feed

libpafe-0.1.0.0: src/Bindings/Libpafe/Types.hsc

{-# LANGUAGE ForeignFunctionInterface #-}
module Bindings.Libpafe.Types(
  Felica(..)
 ,Pasori
 ,CUInt8
 ,CUInt16
 ,FelicaBlockInfo(..)
)
where

#include <libpafe/libpafe.h>

import Foreign.Ptr
import Foreign.C.Types
import Foreign.Storable
import Foreign.Marshal.Array
import Data.Word


#def typedef struct _felica_block_info FelicaBlockInfo;

#def typedef struct felica_block FelicaBlock;

#def typedef uint8 CUInt8;

#def typedef uint16 CUInt16;

#def typedef struct felica_area Area;

type CUInt8 = Word8
type CUInt16 = Word16

data Pasori
data Felica = Felica {
                p :: Ptr Pasori
               ,systemCode :: CUInt16
               ,idm :: [CUInt8]
               ,pmm :: [CUInt8]
               ,areaNum :: CUInt16
               ,felicaArea :: [Area]
               ,serviceNum:: CUInt16
               ,service :: [Area]
               ,nextFelica :: Ptr Felica
               }

data Area = Area {
            code :: CUInt16
           ,attr :: CUInt16
           ,bin :: CUInt16
           ,nextArea :: Ptr Area
           }

data FelicaBlockInfo = FelicaBlockInfo {
                                         blockService :: CUInt16
                                        ,mode :: CUInt8
                                        ,block :: CUInt16
                                       }

data FelicaBlock = FelicaBlock { 
                                blockData :: [CUInt8]
                               }

instance Storable Felica where
  sizeOf x = #size felica
  alignment = sizeOf
  peek ptr = do 
     p <- (#peek felica, p) ptr
     sc <- (#peek felica, systemcode) ptr
     idm <- peekArray 8 $ (#ptr felica, IDm) ptr
     pmm <- peekArray 8 $ (#ptr felica, PMm) ptr
     an <- (#peek felica, area_num) ptr
     fa <- peekArray  256 $ (#ptr felica, area) ptr
     sn <- (#peek felica, service_num) ptr
     s <- peekArray  256 $ (#ptr felica, service) ptr
     n <- (#peek felica, next) ptr
     return $ Felica p sc idm pmm an fa sn s n
  poke ptr (Felica p sc idm pmm an fa sn s n) = do
    (#poke felica, p) ptr p
    (#poke felica, systemcode) ptr sc
    pokeArray ((#ptr felica, IDm) ptr) idm
    pokeArray ((#ptr felica, PMm) ptr) pmm
    (#poke felica, area_num) ptr an
    pokeArray ((#ptr felica, area) ptr) fa
    (#poke felica, service_num) ptr sn
    pokeArray ((#ptr felica, service) ptr) s
    (#poke felica, next) ptr n

instance Storable Area where
  sizeOf x = #size felica_area
  alignment = sizeOf
  peek ptr = do
    cde <- (#peek felica_area, code) ptr 
    attrb <- (#peek felica_area, attr) ptr 
    binary <- (#peek felica_area, bin) ptr 
    nextarea <- (#peek felica_area, next) ptr 
    return $ Area cde attrb binary nextarea
  poke ptr (Area cde attrib binary nextarea) = do
    (#poke felica_area, code) ptr cde
    (#poke felica_area, attr) ptr attrib
    (#poke felica_area, bin) ptr binary
    (#poke felica_area, next) ptr nextarea

instance Storable FelicaBlockInfo where
  sizeOf x = #size felica_block_info
  alignment = sizeOf
  peek ptr = do
    svc <- (#peek felica_block_info, service) ptr
    md <- (#peek felica_block_info, mode) ptr
    blk <- (#peek felica_block_info, block) ptr
    return $ FelicaBlockInfo svc md blk
  poke ptr (FelicaBlockInfo svc md blk) = do
    (#poke felica_block_info, service) ptr svc
    (#poke felica_block_info, mode) ptr md
    (#poke felica_block_info, block) ptr blk

instance Show FelicaBlockInfo where
  show = show . block

instance Show Felica where
  show = show . idm

instance Show Area where
  show = show . code