"""LCM type definitions
This file automatically generated by lcm.
DO NOT MODIFY BY HAND!!!!
"""

try:
    import cStringIO.StringIO as BytesIO
except ImportError:
    from io import BytesIO
import struct

import oi.lcm_header_t

import oi.trajectory_status_t

import oi.filter_status_t

import oi.controller_status_t

class oi_control_status_t(object):
    __slots__ = ["header", "heading_control", "track_line_control", "cross_track_control", "range_control", "x_effort_filter", "y_effort_filter", "z_effort_filter", "heading_traj", "track_line_traj", "cross_track_traj", "range_traj", "x_effort", "y_effort", "z_effort", "psi_effort", "range_assist", "range_src", "xtrack_src", "heading_src", "x_effort_scale", "y_effort_scale", "z_effort_scale", "is_control_enabled", "is_x_effort_enabled", "is_y_effort_enabled", "is_z_effort_enabled", "is_psi_effort_enabled", "control_exec_ms", "other_exec_ms", "percent_idle", "missed_updates"]

    __typenames__ = ["oi.lcm_header_t", "oi.controller_status_t", "oi.controller_status_t", "oi.controller_status_t", "oi.controller_status_t", "oi.filter_status_t", "oi.filter_status_t", "oi.filter_status_t", "oi.trajectory_status_t", "oi.trajectory_status_t", "oi.trajectory_status_t", "oi.trajectory_status_t", "double", "double", "double", "double", "double", "int64_t", "int64_t", "int64_t", "double", "double", "double", "boolean", "boolean", "boolean", "boolean", "boolean", "double", "double", "double", "int64_t"]

    __dimensions__ = [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]

    def __init__(self):
        self.header = oi.lcm_header_t()
        self.heading_control = oi.controller_status_t()
        self.track_line_control = oi.controller_status_t()
        self.cross_track_control = oi.controller_status_t()
        self.range_control = oi.controller_status_t()
        self.x_effort_filter = oi.filter_status_t()
        self.y_effort_filter = oi.filter_status_t()
        self.z_effort_filter = oi.filter_status_t()
        self.heading_traj = oi.trajectory_status_t()
        self.track_line_traj = oi.trajectory_status_t()
        self.cross_track_traj = oi.trajectory_status_t()
        self.range_traj = oi.trajectory_status_t()
        self.x_effort = 0.0
        self.y_effort = 0.0
        self.z_effort = 0.0
        self.psi_effort = 0.0
        self.range_assist = 0.0
        self.range_src = 0
        self.xtrack_src = 0
        self.heading_src = 0
        self.x_effort_scale = 0.0
        self.y_effort_scale = 0.0
        self.z_effort_scale = 0.0
        self.is_control_enabled = False
        self.is_x_effort_enabled = False
        self.is_y_effort_enabled = False
        self.is_z_effort_enabled = False
        self.is_psi_effort_enabled = False
        self.control_exec_ms = 0.0
        self.other_exec_ms = 0.0
        self.percent_idle = 0.0
        self.missed_updates = 0

    def encode(self):
        buf = BytesIO()
        buf.write(oi_control_status_t._get_packed_fingerprint())
        self._encode_one(buf)
        return buf.getvalue()

    def _encode_one(self, buf):
        assert self.header._get_packed_fingerprint() == oi.lcm_header_t._get_packed_fingerprint()
        self.header._encode_one(buf)
        assert self.heading_control._get_packed_fingerprint() == oi.controller_status_t._get_packed_fingerprint()
        self.heading_control._encode_one(buf)
        assert self.track_line_control._get_packed_fingerprint() == oi.controller_status_t._get_packed_fingerprint()
        self.track_line_control._encode_one(buf)
        assert self.cross_track_control._get_packed_fingerprint() == oi.controller_status_t._get_packed_fingerprint()
        self.cross_track_control._encode_one(buf)
        assert self.range_control._get_packed_fingerprint() == oi.controller_status_t._get_packed_fingerprint()
        self.range_control._encode_one(buf)
        assert self.x_effort_filter._get_packed_fingerprint() == oi.filter_status_t._get_packed_fingerprint()
        self.x_effort_filter._encode_one(buf)
        assert self.y_effort_filter._get_packed_fingerprint() == oi.filter_status_t._get_packed_fingerprint()
        self.y_effort_filter._encode_one(buf)
        assert self.z_effort_filter._get_packed_fingerprint() == oi.filter_status_t._get_packed_fingerprint()
        self.z_effort_filter._encode_one(buf)
        assert self.heading_traj._get_packed_fingerprint() == oi.trajectory_status_t._get_packed_fingerprint()
        self.heading_traj._encode_one(buf)
        assert self.track_line_traj._get_packed_fingerprint() == oi.trajectory_status_t._get_packed_fingerprint()
        self.track_line_traj._encode_one(buf)
        assert self.cross_track_traj._get_packed_fingerprint() == oi.trajectory_status_t._get_packed_fingerprint()
        self.cross_track_traj._encode_one(buf)
        assert self.range_traj._get_packed_fingerprint() == oi.trajectory_status_t._get_packed_fingerprint()
        self.range_traj._encode_one(buf)
        buf.write(struct.pack(">dddddqqqdddbbbbbdddq", self.x_effort, self.y_effort, self.z_effort, self.psi_effort, self.range_assist, self.range_src, self.xtrack_src, self.heading_src, self.x_effort_scale, self.y_effort_scale, self.z_effort_scale, self.is_control_enabled, self.is_x_effort_enabled, self.is_y_effort_enabled, self.is_z_effort_enabled, self.is_psi_effort_enabled, self.control_exec_ms, self.other_exec_ms, self.percent_idle, self.missed_updates))

    def decode(data):
        if hasattr(data, 'read'):
            buf = data
        else:
            buf = BytesIO(data)
        if buf.read(8) != oi_control_status_t._get_packed_fingerprint():
            raise ValueError("Decode error")
        return oi_control_status_t._decode_one(buf)
    decode = staticmethod(decode)

    def _decode_one(buf):
        self = oi_control_status_t()
        self.header = oi.lcm_header_t._decode_one(buf)
        self.heading_control = oi.controller_status_t._decode_one(buf)
        self.track_line_control = oi.controller_status_t._decode_one(buf)
        self.cross_track_control = oi.controller_status_t._decode_one(buf)
        self.range_control = oi.controller_status_t._decode_one(buf)
        self.x_effort_filter = oi.filter_status_t._decode_one(buf)
        self.y_effort_filter = oi.filter_status_t._decode_one(buf)
        self.z_effort_filter = oi.filter_status_t._decode_one(buf)
        self.heading_traj = oi.trajectory_status_t._decode_one(buf)
        self.track_line_traj = oi.trajectory_status_t._decode_one(buf)
        self.cross_track_traj = oi.trajectory_status_t._decode_one(buf)
        self.range_traj = oi.trajectory_status_t._decode_one(buf)
        self.x_effort, self.y_effort, self.z_effort, self.psi_effort, self.range_assist, self.range_src, self.xtrack_src, self.heading_src, self.x_effort_scale, self.y_effort_scale, self.z_effort_scale = struct.unpack(">dddddqqqddd", buf.read(88))
        self.is_control_enabled = bool(struct.unpack('b', buf.read(1))[0])
        self.is_x_effort_enabled = bool(struct.unpack('b', buf.read(1))[0])
        self.is_y_effort_enabled = bool(struct.unpack('b', buf.read(1))[0])
        self.is_z_effort_enabled = bool(struct.unpack('b', buf.read(1))[0])
        self.is_psi_effort_enabled = bool(struct.unpack('b', buf.read(1))[0])
        self.control_exec_ms, self.other_exec_ms, self.percent_idle, self.missed_updates = struct.unpack(">dddq", buf.read(32))
        return self
    _decode_one = staticmethod(_decode_one)

    _hash = None
    def _get_hash_recursive(parents):
        if oi_control_status_t in parents: return 0
        newparents = parents + [oi_control_status_t]
        tmphash = (0xfd4ae8ea5fd5a0c7+ oi.lcm_header_t._get_hash_recursive(newparents)+ oi.controller_status_t._get_hash_recursive(newparents)+ oi.controller_status_t._get_hash_recursive(newparents)+ oi.controller_status_t._get_hash_recursive(newparents)+ oi.controller_status_t._get_hash_recursive(newparents)+ oi.filter_status_t._get_hash_recursive(newparents)+ oi.filter_status_t._get_hash_recursive(newparents)+ oi.filter_status_t._get_hash_recursive(newparents)+ oi.trajectory_status_t._get_hash_recursive(newparents)+ oi.trajectory_status_t._get_hash_recursive(newparents)+ oi.trajectory_status_t._get_hash_recursive(newparents)+ oi.trajectory_status_t._get_hash_recursive(newparents)) & 0xffffffffffffffff
        tmphash  = (((tmphash<<1)&0xffffffffffffffff) + (tmphash>>63)) & 0xffffffffffffffff
        return tmphash
    _get_hash_recursive = staticmethod(_get_hash_recursive)
    _packed_fingerprint = None

    def _get_packed_fingerprint():
        if oi_control_status_t._packed_fingerprint is None:
            oi_control_status_t._packed_fingerprint = struct.pack(">Q", oi_control_status_t._get_hash_recursive([]))
        return oi_control_status_t._packed_fingerprint
    _get_packed_fingerprint = staticmethod(_get_packed_fingerprint)

