Tower.hs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. module Gidl.Backend.Tower where
  2. import Data.List (intercalate)
  3. import Ivory.Artifact
  4. import Ivory.Artifact.Template
  5. import qualified Paths_gidl as P
  6. import Gidl.Types
  7. import Gidl.Interface
  8. import Gidl.Schema
  9. import Gidl.Backend.Cabal
  10. import Gidl.Backend.Ivory (dotwords, ivorySources)
  11. import Gidl.Backend.Ivory.Schema (ifModuleName)
  12. import Gidl.Backend.Tower.Schema
  13. towerBackend :: TypeEnv -> InterfaceEnv -> String -> String -> [Artifact]
  14. towerBackend te ie pkgname namespace_raw =
  15. [ cabalFileArtifact cf
  16. , makefile
  17. , defaultconf
  18. , artifactPath "tests" (codegenTest ie namespace)
  19. ] ++ map (artifactPath "src") sources
  20. where
  21. namespace = dotwords namespace_raw
  22. sources = isources ++ tsources
  23. tsources = towerSources ie (namespace ++ ["Tower"])
  24. isources = ivorySources te ie (namespace ++ ["Ivory"])
  25. cf = (defaultCabalFile pkgname cabalmods deps) { executables = [ cg_exe ] }
  26. cabalmods = map (filePathToPackage . artifactFileName) sources
  27. deps = words "ivory ivory-stdlib ivory-serialize tower"
  28. cg_exe = defaultCabalExe (pkgname ++ "-gen") "CodeGen.hs"
  29. (deps ++ (words "tower-config tower-freertos-stm32") ++ [pkgname])
  30. towerSources :: InterfaceEnv -> [String] -> [Artifact]
  31. towerSources (InterfaceEnv ie) namespace = towerInterfaces
  32. where
  33. towerInterfaces = concat
  34. [ [ schemaModule (namespace ++ ["Interface"]) i (producerSchema i)
  35. , schemaModule (namespace ++ ["Interface"]) i (consumerSchema i) ]
  36. | (_iname, i) <- ie ]
  37. makefile :: Artifact
  38. makefile = artifactCabalFile P.getDataDir "support/tower/Makefile"
  39. defaultconf :: Artifact
  40. defaultconf = artifactCabalFile P.getDataDir "support/tower/default.conf"
  41. codegenTest :: InterfaceEnv -> [String] -> Artifact
  42. codegenTest (InterfaceEnv ie) modulepath =
  43. artifactCabalFileTemplate P.getDataDir fname
  44. [("module_path",intercalate "." modulepath)
  45. ,("imports", intercalate "\n"
  46. [ "import "
  47. ++ interfaceImport (ifModuleName i) "Producer"
  48. ++ "\n"
  49. ++ "import "
  50. ++ interfaceImport (ifModuleName i) "Consumer"
  51. | (_, i) <- ie
  52. ])
  53. ,("app_body", intercalate "\n " (concat [ interfaceTest i | (_, i) <- ie ]))
  54. ]
  55. where
  56. fname = "support/tower/CodeGen.hs.template"
  57. interfaceImport i j = intercalate "." (modulepath ++ ["Tower", "Interface", i, j])
  58. interfaceTest :: Interface -> [String]
  59. interfaceTest i = [ schemaTest (producerSchema i)
  60. , schemaTest (consumerSchema i)
  61. ]
  62. where
  63. schemaTest :: Schema -> String
  64. schemaTest (Schema _ []) = []
  65. schemaTest (Schema schemaName _)
  66. = (inputFuncName ((ifModuleName i) ++ schemaName))
  67. ++ " (snd c) >>= \\i -> "
  68. ++ (outputFuncName ((ifModuleName i) ++ schemaName))
  69. ++ " i >>= \\(_ :: ChanOutput (Array 80 (Stored Uint8))) -> return ()"