|
@@ -1,7 +1,62 @@
|
|
|
|
+
|
|
(def-newtype time_micros_t sint64_t)
|
|
(def-newtype time_micros_t sint64_t)
|
|
|
|
+
|
|
|
|
+-- comments should be haskell style, because we're suing parsec's haskell lexer
|
|
|
|
+
|
|
(def-enum armed_t
|
|
(def-enum armed_t
|
|
((disarmed 0)
|
|
((disarmed 0)
|
|
(armed 1)))
|
|
(armed 1)))
|
|
|
|
+
|
|
(def-struct heartbeat_t
|
|
(def-struct heartbeat_t
|
|
((time time_micros_t)
|
|
((time time_micros_t)
|
|
(armed armed_t)))
|
|
(armed armed_t)))
|
|
|
|
+
|
|
|
|
+-- Bug: if you mistype the following, it quits parsing the file at that line
|
|
|
|
+-- and does not throw an error.
|
|
|
|
+-- (def-newtype some_t sint32)
|
|
|
|
+
|
|
|
|
+(def-newtype lat_t sint32_t)
|
|
|
|
+(def-newtype lon_t sint32_t)
|
|
|
|
+
|
|
|
|
+-- Todo: allow attaching unit annotations to newtypes. The code generator will
|
|
|
|
+-- provide the units as a human readable comment, and/or in some type/unit
|
|
|
|
+-- system supported by the host language.
|
|
|
|
+-- Todo: allow attaching predicates to newtypes. e.g., lon_t might have some
|
|
|
|
+-- type (degrees * 10e-6), some predicate
|
|
|
|
+-- (lambda (v) (and (gt v -180000000) (lte v 180000000)))
|
|
|
|
+
|
|
|
|
+(def-newtype meters_t float_t)
|
|
|
|
+
|
|
|
|
+(def-struct coordinate_t
|
|
|
|
+ ((lat lat_t)
|
|
|
|
+ (lon lon_t)
|
|
|
|
+ (alt meters_t)))
|
|
|
|
+
|
|
|
|
+-- Todo: the following interface syntax and semantics are a strawman.
|
|
|
|
+-- Interfaces have methods that are either streams or attrs.
|
|
|
|
+-- attrs take a parameter for access control.
|
|
|
|
+-- streams take a parameter for their default period in hz (none should default
|
|
|
|
+-- to zero). they also implicitly define an attr $(steamname)-stream-rate,
|
|
|
|
+-- which permits changing the stream rate at runtime.
|
|
|
|
+
|
|
|
|
+(def-interface vehicle
|
|
|
|
+ ((heartbeat (stream 10 heartbeat_t))))
|
|
|
|
+
|
|
|
|
+-- Interfaces implement java-style inheritance. No shadowing of inherited method
|
|
|
|
+-- names permitted.
|
|
|
|
+
|
|
|
|
+(def-interface controllable-vehicle
|
|
|
|
+ ((current_waypoint (attr read waypoint_t))
|
|
|
|
+ (next_waypoint (attr readwrite waypoint_t)))
|
|
|
|
+ (vehicle)) -- Inherits from interface vehicle
|
|
|
|
+
|
|
|
|
+-- The idea here is that, when negotiating a gidl connection, the client can
|
|
|
|
+-- specify or negotiate what interface is supported.
|
|
|
|
+-- this may be communicated by just sending the string name, or potentially by
|
|
|
|
+-- sending the entire serialized schema. At very least, the client and server
|
|
|
|
+-- should check agreement of their type schemas, probably by having the client
|
|
|
|
+-- send a sha1-hash of the serialized type schema.
|
|
|
|
+-- This allows us to specify various kinds of vehicles might exist without
|
|
|
|
+-- repeating ourselves, and provides a way to
|
|
|
|
+-- manage new functionality without breaking legacy code.
|
|
|
|
+
|