p_ImageEncodingType = pp.Forward()
p_MotorID = pp.Forward()
p_CameraID = pp.Forward()
p_SonarID = pp.Forward()
p_LightID = pp.Forward()
p_NodeType = pp.Forward()
p_NodeStatus = pp.Forward()
p_NodeInputStatus = pp.Forward()
p_NodeIOStatus = pp.Forward()
p_OutputType = pp.Forward()
p_Controller = pp.Forward()

# Parse Structs
p_floatYPR << pp.Group(l \
    + p_float + c \
    + p_float + c \
    + p_float \
    + r)
p_floatYPR.setParseAction(lambda x: messaging.floatYPR(*x[0]))
p_floatXYZ << pp.Group(l \
    + p_float + c \
    + p_float + c \
    + p_float \
    + r)
p_floatXYZ.setParseAction(lambda x: messaging.floatXYZ(*x[0]))
p_floatXY << pp.Group(l \
    + p_float + c \
    + p_float \
    + r)
p_floatXY.setParseAction(lambda x: messaging.floatXY(*x[0]))
p_NodeInput << pp.Group(l \
# Forward declarations
p_floatYPR = pp.Forward()
p_TimeStamp = pp.Forward()
p_PolarImage = pp.Forward()

p_int32Vec = pp.Forward()
p_byteVec = pp.Forward()

p_ImageEncodingType = pp.Forward()
p_SonarID = pp.Forward()

# Parse Structs
p_floatYPR << pp.Group(l \
    + p_float + c \
    + p_float + c \
    + p_float \
    + r)
p_floatYPR.setParseAction(lambda x: messaging.floatYPR(*x[0]))
p_TimeStamp << pp.Group(l \
    + p_int + c \
    + p_int \
    + r)
p_TimeStamp.setParseAction(lambda x: messaging.TimeStamp(*x[0]))
p_PolarImage << pp.Group(l \
    + p_byteVec + c \
    + p_ImageEncodingType + c \
    + p_int32Vec + c \
    + p_float + c \
    + p_float + c \
    + p_float + c \