"""
This example shows how to disseminate EMG data using biosiglive and a dedicated interface.
First an interface is created, then a device is added to the interface. For EMG data, two interfaces are available:
ViconClient to stream data from a vicon Nexus software via the Vicon Data Stream SDK (https://www.vicon.com/software/datastream-sdk/). The Pytrigno interface for streaming data from the Delsys trigno community SDK (https://delsys.com/sdk/).
If you want to try this example offline, you can use the provided custom interface named 'MyInterface' which you can use as a standard interface.

The EMG device taking as input argument :
- the number of electrodes
- the type of the device (the allowed types are listed in the DeviceType class)
- the name of the device (for the Vicon system, it must be the same name as the device to stream).
- the flow of the device.
- the process method to use. Here, the process_emg method is used.
- any other argument needed for the processing method. (you can see the possible arguments in the documentation of the process_emg method).

If you want to display the data in real time, you can use the biosiglive plot classes, please take a look at the live_plot.py example.
After initializing the interface and the device, the data exchange is done in a loop.
The data must first be received from the source by the get_device_data method.
After that, the data can be used as is or processed using the process() method of the Device class.
In this function you can pass a method if you want to use a different method than the default one and every needed argument for that function as well.
"""

from custom_interface import MyInterface
from biosiglive.gui.plot import LivePlot
from biosiglive import (
    ViconClient,
    RealTimeProcessingMethod,
    PlotType,
)
from time import sleep, time


if __name__ == "__main__":
    try_offline = True

    output_file_path = "trial_x.bio"
    if try_offline:
        interface = MyInterface(system_rate=100, data_path="abd.bio")
    else:
        interface = ViconClient(ip="localhost", system_rate=100)

    n_electrodes = 4
    muscle_names = [
        "Pectoralis major",
        "Deltoid anterior",
        "Deltoid medial",
        "Deltoid posterior",
    ]
    interface.add_device(
        nb_channels=n_electrodes,
        device_type="emg",
        name="emg",
        rate=2000,
        device_data_file_key="emg",
        processing_method=RealTimeProcessingMethod.ProcessEmg,
        moving_average=True,
    )

    emg_plot = LivePlot(
        name="emg", rate=100, plot_type=PlotType.Curve, nb_subplots=n_electrodes, channel_names=muscle_names
    )
    emg_plot.init(plot_windows=500, y_labels="Processed EMG (mV)")

    emg_raw_plot = LivePlot(
        name="emg_raw", rate=100, plot_type=PlotType.Curve, nb_subplots=n_electrodes, channel_names=muscle_names
    )
    emg_raw_plot.init(plot_windows=10000, colors=(255, 0, 0), y_labels="EMG (mV)")

    time_to_sleep = 1 / 100
    count = 0
    while True:
        tic = time()
        raw_emg = interface.get_device_data(device_name="emg")
        emg_proc = interface.devices[0].process()
        emg_plot.update(emg_proc[:, -1:])
        emg_raw_plot.update(raw_emg)
        count += 1
        loop_time = time() - tic
        real_time_to_sleep = time_to_sleep - loop_time
        if real_time_to_sleep > 0:
            sleep(real_time_to_sleep)
