import time
import math

from spynnaker_external_devices_plugin.pyNN.connections\
    .spynnaker_live_spikes_connection import SpynnakerLiveSpikesConnection

# class that sends a lenghts and extensions speeds, using SpiNNaker APIs
# it simulates a simple stretch
class SpindleLengthSender(object):

    def __init__(self, pop_labels):
        self._length_sender = SpynnakerLiveSpikesConnection(
                                receive_labels=None, local_port=19999,
                                send_labels=pop_labels)
        self._len = 0.95
        self._dlen = 0.0
        self._go_on = True

        for label in pop_labels:
            self._length_sender.add_start_callback(label, self.send_input_spindle)

        self._count = 0

    def len_to_intlist(self):
        l = list()
        l.append(int(math.trunc(self._len)))
        l.append(int((self._len - math.trunc(self._len)) * 1000))
        l.append(int(math.trunc(self._dlen)))
        l.append(int((self._dlen - math.trunc(self._dlen)) * 1000))
        return l

    def stop(self):
        self._go_on = False

    def generate_new_length(self):
        if self._count < 110:
            self._len = 0.95
            self._dlen = 0.0
        elif self._count < 220:
            self._len += (1.08-0.95)/110
            self._dlen = (1.08-0.95)/1.1
        else:
            self._len = 1.08
            self._dlen = 0.0
        self._count += 1

    def send_input_spindle(self, label, sender):
        while self._go_on:
            self.generate_new_length()
            sender.send_spikes(label, self.len_to_intlist())
            time.sleep(0.01)