diff --git a/Source/Plugins/SerialInput/SerialInput.cpp b/Source/Plugins/SerialInput/SerialInput.cpp index f1dc7d227d3e14b49c7fa4532d2bfb616817e70a..5c90d831a9c86c3981fd04571b96d594722db65b 100644 --- a/Source/Plugins/SerialInput/SerialInput.cpp +++ b/Source/Plugins/SerialInput/SerialInput.cpp @@ -24,6 +24,7 @@ #include <stdio.h> #include "SerialInput.h" +#define MAX_MSG_SIZE 10000 const int SerialInput::BAUDRATES[12] = { @@ -45,8 +46,10 @@ const int SerialInput::BAUDRATES[12] = SerialInput::SerialInput() : GenericProcessor ("Serial Port") , baudrate (0) + , lastRecv (0) { setProcessorType (PROCESSOR_TYPE_SOURCE); + dataBuffer.calloc(MAX_MSG_SIZE); } @@ -55,6 +58,15 @@ SerialInput::~SerialInput() serial.close(); } +//Since the data needs a meximum buffer size but the actual number of read bytes might be less, let's +//add that info as a metadata field. +void SerialInput::createEventChannels() +{ + //It's going to be raw binary data, so let's make it uint8 + EventChannel* chan = new EventChannel(EventChannel::UINT8_ARRAY, 1, MAX_MSG_SIZE, this); + chan->addEventMetaData(new MetaDataDescriptor(MetaDataDescriptor::UINT64, 1, "Read Bytes", "Number of actual read bytes in the buffer", "bufferLength")); + eventChannelArray.add(chan); +} StringArray SerialInput::getDevices() { @@ -112,8 +124,11 @@ bool SerialInput::disable() } -void SerialInput::process (AudioSampleBuffer&, MidiBuffer& events) +void SerialInput::process (AudioSampleBuffer&) { + uint64 timestamp = CoreServices::getGlobalTimestamp(); + setTimestampAndSamples(timestamp, 0); + int bytesAvailable = serial.available(); if (bytesAvailable == OF_SERIAL_ERROR) @@ -125,18 +140,22 @@ void SerialInput::process (AudioSampleBuffer&, MidiBuffer& events) if (bytesAvailable > 0) { - unsigned char buffer[10000]; - int bytesRead = serial.readBytes (buffer, bytesAvailable); + + int bytesRead = serial.readBytes (dataBuffer, bytesAvailable); if (bytesRead > 0) { - addEvent (events, // MidiBuffer - BINARY_MSG, // eventType - 0, // sampleNum - nodeId, // eventID - 0, // eventChannel - bytesRead, // numBytes - buffer); // data + //Clear the rest of the buffer so we don't send garbage. + if (bytesRead < lastRecv) + zeromem(dataBuffer.getData() + bytesRead, lastRecv - bytesRead); + lastRecv = bytesRead; + MetaDataValueArray metadata; + MetaDataValuePtr bufferRead = new MetaDataValue(MetaDataDescriptor::UINT64, 1); + bufferRead->setValue(static_cast<uint64>(bytesRead)); + metadata.add(bufferRead); + const EventChannel* chan = getEventChannel(getEventChannelIndex(0, getNodeId())); + BinaryEventPtr event = BinaryEvent::createBinaryEvent(chan, timestamp, static_cast<uint8*>(dataBuffer.getData()), MAX_MSG_SIZE, metadata); + addEvent(chan, event, 0); } else if (bytesRead < 0) { diff --git a/Source/Plugins/SerialInput/SerialInput.h b/Source/Plugins/SerialInput/SerialInput.h index b9333bc86a9c06dceb98e436e9f09fd11bf55c1c..624af4da26e9f47110639a724769d0302cded52d 100644 --- a/Source/Plugins/SerialInput/SerialInput.h +++ b/Source/Plugins/SerialInput/SerialInput.h @@ -56,7 +56,7 @@ public: Adds all the new serial data that is available to the event data buffer. */ - void process (AudioSampleBuffer& buffer, MidiBuffer& events) override; + void process (AudioSampleBuffer& buffer) override; /** This should only be run by the ProcessorGraph, before acquisition will be started. @@ -89,6 +89,8 @@ public: /** Setter, that allows you to set the baudrate that will be used during acquisition */ void setBaudrate (int baudrate); +protected: + void createEventChannels() override; private: @@ -104,6 +106,9 @@ private: // List of baudrates that are available by default. static const int BAUDRATES[12]; + HeapBlock<unsigned char> dataBuffer; + int lastRecv; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SerialInput); }; diff --git a/Source/Processors/Channel/MetaData.cpp b/Source/Processors/Channel/MetaData.cpp index 2458f09bff8622b2cfad48961cba7c4e78630291..b4f7759985441784bc2eb866332655bd0b311709 100644 --- a/Source/Processors/Channel/MetaData.cpp +++ b/Source/Processors/Channel/MetaData.cpp @@ -337,74 +337,74 @@ MetaDataEventLock::MetaDataEventLock() {} //2-To define a fixed set of types that can be used, instead of a general instantiation. Trying to use this with other types //will throuw a linker error. -template void MetaDataValue::setValue<char>(char); -template void MetaDataValue::setValue<int8>(int8); -template void MetaDataValue::setValue<uint8>(uint8); -template void MetaDataValue::setValue<int16>(int16); -template void MetaDataValue::setValue<uint16>(uint16); -template void MetaDataValue::setValue<int32>(int32); -template void MetaDataValue::setValue<uint32>(uint32); -template void MetaDataValue::setValue<int64>(int64); -template void MetaDataValue::setValue<uint64>(uint64); -template void MetaDataValue::setValue<float>(float); -template void MetaDataValue::setValue<double>(double); - -template void MetaDataValue::getValue<char>(char&) const; -template void MetaDataValue::getValue<int8>(int8&) const; -template void MetaDataValue::getValue<uint8>(uint8&) const; -template void MetaDataValue::getValue<int16>(int16&) const; -template void MetaDataValue::getValue<uint16>(uint16&) const; -template void MetaDataValue::getValue<int32>(int32&) const; -template void MetaDataValue::getValue<uint32>(uint32&) const; -template void MetaDataValue::getValue<int64>(int64&) const; -template void MetaDataValue::getValue<uint64>(uint64&) const; -template void MetaDataValue::getValue<float>(float&) const; -template void MetaDataValue::getValue<double>(double&) const; - -template void MetaDataValue::setValue<char>(const char*); -template void MetaDataValue::setValue<int8>(const int8*); -template void MetaDataValue::setValue<uint8>(const uint8*); -template void MetaDataValue::setValue<int16>(const int16*); -template void MetaDataValue::setValue<uint16>(const uint16*); -template void MetaDataValue::setValue<int32>(const int32*); -template void MetaDataValue::setValue<uint32>(const uint32*); -template void MetaDataValue::setValue<int64>(const int64*); -template void MetaDataValue::setValue<uint64>(const uint64*); -template void MetaDataValue::setValue<float>(const float*); -template void MetaDataValue::setValue<double>(const double*); - -template void MetaDataValue::getValue<char>(char*) const; -template void MetaDataValue::getValue<int8>(int8*) const; -template void MetaDataValue::getValue<uint8>(uint8*) const; -template void MetaDataValue::getValue<int16>(int16*) const; -template void MetaDataValue::getValue<uint16>(uint16*) const; -template void MetaDataValue::getValue<int32>(int32*) const; -template void MetaDataValue::getValue<uint32>(uint32*) const; -template void MetaDataValue::getValue<int64>(int64*) const; -template void MetaDataValue::getValue<uint64>(uint64*) const; -template void MetaDataValue::getValue<float>(float*) const; -template void MetaDataValue::getValue<double>(double*) const; - -template void MetaDataValue::setValue<char>(const Array<char>&); -template void MetaDataValue::setValue<int8>(const Array<int8>&); -template void MetaDataValue::setValue<uint8>(const Array<uint8>&); -template void MetaDataValue::setValue<int16>(const Array<int16>&); -template void MetaDataValue::setValue<uint16>(const Array<uint16>&); -template void MetaDataValue::setValue<int32>(const Array<int32>&); -template void MetaDataValue::setValue<uint32>(const Array<uint32>&); -template void MetaDataValue::setValue<int64>(const Array<int64>&); -template void MetaDataValue::setValue<uint64>(const Array<uint64>&); -template void MetaDataValue::setValue<float>(const Array<float>&); -template void MetaDataValue::setValue<double>(const Array<double>&); - -template void MetaDataValue::getValue<char>(Array<char>&) const; -template void MetaDataValue::getValue<int8>(Array<int8>&) const; -template void MetaDataValue::getValue<uint8>(Array<uint8>&) const; -template void MetaDataValue::getValue<int16>(Array<int16>&) const; -template void MetaDataValue::getValue<uint16>(Array<uint16>&) const; -template void MetaDataValue::getValue<int32>(Array<int32>&) const; -template void MetaDataValue::getValue<uint32>(Array<uint32>&) const; -template void MetaDataValue::getValue<int64>(Array<int64>&) const; -template void MetaDataValue::getValue<uint64>(Array<uint64>&) const; -template void MetaDataValue::getValue<float>(Array<float>&) const; -template void MetaDataValue::getValue<double>(Array<double>&) const; \ No newline at end of file +template PLUGIN_API void MetaDataValue::setValue<char>(char); +template PLUGIN_API void MetaDataValue::setValue<int8>(int8); +template PLUGIN_API void MetaDataValue::setValue<uint8>(uint8); +template PLUGIN_API void MetaDataValue::setValue<int16>(int16); +template PLUGIN_API void MetaDataValue::setValue<uint16>(uint16); +template PLUGIN_API void MetaDataValue::setValue<int32>(int32); +template PLUGIN_API void MetaDataValue::setValue<uint32>(uint32); +template PLUGIN_API void MetaDataValue::setValue<int64>(int64); +template PLUGIN_API void MetaDataValue::setValue<uint64>(uint64); +template PLUGIN_API void MetaDataValue::setValue<float>(float); +template PLUGIN_API void MetaDataValue::setValue<double>(double); + +template PLUGIN_API void MetaDataValue::getValue<char>(char&) const; +template PLUGIN_API void MetaDataValue::getValue<int8>(int8&) const; +template PLUGIN_API void MetaDataValue::getValue<uint8>(uint8&) const; +template PLUGIN_API void MetaDataValue::getValue<int16>(int16&) const; +template PLUGIN_API void MetaDataValue::getValue<uint16>(uint16&) const; +template PLUGIN_API void MetaDataValue::getValue<int32>(int32&) const; +template PLUGIN_API void MetaDataValue::getValue<uint32>(uint32&) const; +template PLUGIN_API void MetaDataValue::getValue<int64>(int64&) const; +template PLUGIN_API void MetaDataValue::getValue<uint64>(uint64&) const; +template PLUGIN_API void MetaDataValue::getValue<float>(float&) const; +template PLUGIN_API void MetaDataValue::getValue<double>(double&) const; + +template PLUGIN_API void MetaDataValue::setValue<char>(const char*); +template PLUGIN_API void MetaDataValue::setValue<int8>(const int8*); +template PLUGIN_API void MetaDataValue::setValue<uint8>(const uint8*); +template PLUGIN_API void MetaDataValue::setValue<int16>(const int16*); +template PLUGIN_API void MetaDataValue::setValue<uint16>(const uint16*); +template PLUGIN_API void MetaDataValue::setValue<int32>(const int32*); +template PLUGIN_API void MetaDataValue::setValue<uint32>(const uint32*); +template PLUGIN_API void MetaDataValue::setValue<int64>(const int64*); +template PLUGIN_API void MetaDataValue::setValue<uint64>(const uint64*); +template PLUGIN_API void MetaDataValue::setValue<float>(const float*); +template PLUGIN_API void MetaDataValue::setValue<double>(const double*); + +template PLUGIN_API void MetaDataValue::getValue<char>(char*) const; +template PLUGIN_API void MetaDataValue::getValue<int8>(int8*) const; +template PLUGIN_API void MetaDataValue::getValue<uint8>(uint8*) const; +template PLUGIN_API void MetaDataValue::getValue<int16>(int16*) const; +template PLUGIN_API void MetaDataValue::getValue<uint16>(uint16*) const; +template PLUGIN_API void MetaDataValue::getValue<int32>(int32*) const; +template PLUGIN_API void MetaDataValue::getValue<uint32>(uint32*) const; +template PLUGIN_API void MetaDataValue::getValue<int64>(int64*) const; +template PLUGIN_API void MetaDataValue::getValue<uint64>(uint64*) const; +template PLUGIN_API void MetaDataValue::getValue<float>(float*) const; +template PLUGIN_API void MetaDataValue::getValue<double>(double*) const; + +template PLUGIN_API void MetaDataValue::setValue<char>(const Array<char>&); +template PLUGIN_API void MetaDataValue::setValue<int8>(const Array<int8>&); +template PLUGIN_API void MetaDataValue::setValue<uint8>(const Array<uint8>&); +template PLUGIN_API void MetaDataValue::setValue<int16>(const Array<int16>&); +template PLUGIN_API void MetaDataValue::setValue<uint16>(const Array<uint16>&); +template PLUGIN_API void MetaDataValue::setValue<int32>(const Array<int32>&); +template PLUGIN_API void MetaDataValue::setValue<uint32>(const Array<uint32>&); +template PLUGIN_API void MetaDataValue::setValue<int64>(const Array<int64>&); +template PLUGIN_API void MetaDataValue::setValue<uint64>(const Array<uint64>&); +template PLUGIN_API void MetaDataValue::setValue<float>(const Array<float>&); +template PLUGIN_API void MetaDataValue::setValue<double>(const Array<double>&); + +template PLUGIN_API void MetaDataValue::getValue<char>(Array<char>&) const; +template PLUGIN_API void MetaDataValue::getValue<int8>(Array<int8>&) const; +template PLUGIN_API void MetaDataValue::getValue<uint8>(Array<uint8>&) const; +template PLUGIN_API void MetaDataValue::getValue<int16>(Array<int16>&) const; +template PLUGIN_API void MetaDataValue::getValue<uint16>(Array<uint16>&) const; +template PLUGIN_API void MetaDataValue::getValue<int32>(Array<int32>&) const; +template PLUGIN_API void MetaDataValue::getValue<uint32>(Array<uint32>&) const; +template PLUGIN_API void MetaDataValue::getValue<int64>(Array<int64>&) const; +template PLUGIN_API void MetaDataValue::getValue<uint64>(Array<uint64>&) const; +template PLUGIN_API void MetaDataValue::getValue<float>(Array<float>&) const; +template PLUGIN_API void MetaDataValue::getValue<double>(Array<double>&) const; \ No newline at end of file diff --git a/Source/Processors/Events/Events.cpp b/Source/Processors/Events/Events.cpp index fccc10e97eadfff130860662fc832acce5494c92..d54570d7c17c3eb5e10190823e6dd91d3971a335 100644 --- a/Source/Processors/Events/Events.cpp +++ b/Source/Processors/Events/Events.cpp @@ -294,7 +294,7 @@ bool Event::createChecks(const EventChannel* channelInfo, EventChannel::EventCha bool Event::createChecks(const EventChannel* channelInfo, EventChannel::EventChannelTypes eventType, uint16 channel, const MetaDataValueArray& metaData) { if (!channelInfo) return false; - if (channelInfo->getChannelType() != EventChannel::TTL) return false; + if (channelInfo->getChannelType() != eventType) return false; if ((channel < 0) || (channel >= channelInfo->getNumChannels())) return false; if (!compareMetaData(channelInfo, metaData)) return nullptr; return true; @@ -681,7 +681,7 @@ BinaryEventPtr BinaryEvent::createBinaryEvent(const EventChannel* channelInfo, u return nullptr; } - if (!createChecks(channelInfo, EventChannel::TTL, channel, metaData)) + if (!createChecks(channelInfo, type, channel, metaData)) { jassertfalse; return nullptr; @@ -1019,24 +1019,24 @@ float* SpikeEvent::SpikeBuffer::operator[](const int index) } //Template definitions -template BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, uint16); - -template BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, const MetaDataValueArray&, uint16); -template BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, const MetaDataValueArray&, uint16); \ No newline at end of file +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, uint16); + +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, const MetaDataValueArray&, uint16); +template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, const MetaDataValueArray&, uint16); \ No newline at end of file