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


from io import BytesIO
import struct

import oi

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", "psi_effort_filter", "heading_traj", "track_line_traj", "cross_track_traj", "range_traj", "x_effort", "y_effort", "z_effort", "psi_effort", "tl_pos_goal", "tl_pos_rate", "tl_pos_enabled", "surf_pose_sequence", "range_assist", "xtrack_assist", "range_src", "xtrack_src", "heading_src", "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.filter_status_t", "oi.trajectory_status_t", "oi.trajectory_status_t", "oi.trajectory_status_t", "oi.trajectory_status_t", "double", "double", "double", "double", "double", "double", "boolean", "int32_t", "double", "double", "int64_t", "int64_t", "int64_t", "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, None, None, None]

    def __init__(self):
        self.header = oi.lcm_header_t()
        """
        message header
        LCM Type: oi.lcm_header_t
        """

        self.heading_control = oi.controller_status_t()
        """
        controller status
        LCM Type: oi.controller_status_t
        """

        self.track_line_control = oi.controller_status_t()
        """ LCM Type: oi.controller_status_t """
        self.cross_track_control = oi.controller_status_t()
        """ LCM Type: oi.controller_status_t """
        self.range_control = oi.controller_status_t()
        """ LCM Type: oi.controller_status_t """
        self.x_effort_filter = oi.filter_status_t()
        """
        output filter status
        LCM Type: oi.filter_status_t
        """

        self.y_effort_filter = oi.filter_status_t()
        """ LCM Type: oi.filter_status_t """
        self.z_effort_filter = oi.filter_status_t()
        """ LCM Type: oi.filter_status_t """
        self.psi_effort_filter = oi.filter_status_t()
        """ LCM Type: oi.filter_status_t """
        self.heading_traj = oi.trajectory_status_t()
        """
        trajectory status
        LCM Type: oi.trajectory_status_t
        """

        self.track_line_traj = oi.trajectory_status_t()
        """ LCM Type: oi.trajectory_status_t """
        self.cross_track_traj = oi.trajectory_status_t()
        """ LCM Type: oi.trajectory_status_t """
        self.range_traj = oi.trajectory_status_t()
        """ LCM Type: oi.trajectory_status_t """
        self.x_effort = 0.0
        """
        body frame effort
        LCM Type: double
        """

        self.y_effort = 0.0
        """ LCM Type: double """
        self.z_effort = 0.0
        """ LCM Type: double """
        self.psi_effort = 0.0
        """ LCM Type: double """
        self.tl_pos_goal = 0.0
        """
        track-line position variables
        LCM Type: double
        """

        self.tl_pos_rate = 0.0
        """ LCM Type: double """
        self.tl_pos_enabled = False
        """ LCM Type: boolean """
        self.surf_pose_sequence = 0
        """ LCM Type: int32_t """
        self.range_assist = 0.0
        """
        process variables
        LCM Type: double
        """

        self.xtrack_assist = 0.0
        """ LCM Type: double """
        self.range_src = 0
        """ LCM Type: int64_t """
        self.xtrack_src = 0
        """ LCM Type: int64_t """
        self.heading_src = 0
        """ LCM Type: int64_t """
        self.is_control_enabled = False
        """ LCM Type: boolean """
        self.is_x_effort_enabled = False
        """ LCM Type: boolean """
        self.is_y_effort_enabled = False
        """ LCM Type: boolean """
        self.is_z_effort_enabled = False
        """ LCM Type: boolean """
        self.is_psi_effort_enabled = False
        """ LCM Type: boolean """
        self.control_exec_ms = 0.0
        """
        loop statistics
        LCM Type: double
        """

        self.other_exec_ms = 0.0
        """ LCM Type: double """
        self.percent_idle = 0.0
        """ LCM Type: double """
        self.missed_updates = 0
        """ LCM Type: int64_t """

    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.psi_effort_filter._get_packed_fingerprint() == oi.filter_status_t._get_packed_fingerprint()
        self.psi_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(">ddddddbiddqqqbbbbbdddq", self.x_effort, self.y_effort, self.z_effort, self.psi_effort, self.tl_pos_goal, self.tl_pos_rate, self.tl_pos_enabled, self.surf_pose_sequence, self.range_assist, self.xtrack_assist, self.range_src, self.xtrack_src, self.heading_src, 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))

    @staticmethod
    def decode(data: bytes):
        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)

    @staticmethod
    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.psi_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.tl_pos_goal, self.tl_pos_rate = struct.unpack(">dddddd", buf.read(48))
        self.tl_pos_enabled = bool(struct.unpack('b', buf.read(1))[0])
        self.surf_pose_sequence, self.range_assist, self.xtrack_assist, self.range_src, self.xtrack_src, self.heading_src = struct.unpack(">iddqqq", buf.read(44))
        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

    @staticmethod
    def _get_hash_recursive(parents):
        if oi_control_status_t in parents: return 0
        newparents = parents + [oi_control_status_t]
        tmphash = (0x284854f1f7be9694+ 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.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
    _packed_fingerprint = None

    @staticmethod
    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

    def get_hash(self):
        """Get the LCM hash of the struct"""
        return struct.unpack(">Q", oi_control_status_t._get_packed_fingerprint())[0]

