Skip to content

Commit 092c25f

Browse files
committed
[OpenEphysHttpServer] Add support for adding and deleting a processor
- OpenEphysHttpServer.h - PUT /api/processors/add - PUT /api/processors/delete - ProcessorList - Add helper function to get plugin description for an item in the list
1 parent 0dead8a commit 092c25f

3 files changed

Lines changed: 188 additions & 0 deletions

File tree

Source/UI/ProcessorList.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,36 @@ Array<String> ProcessorList::getItemList()
716716
return listOfProcessors;
717717
}
718718

719+
720+
Plugin::Description ProcessorList::getItemDescriptionfromList(const String& name)
721+
{
722+
723+
Plugin::Description description;
724+
725+
for (int i = 0; i < 5; i++)
726+
{
727+
int numSubItems = baseItem->getSubItem(i)->getNumSubItems();
728+
729+
ProcessorListItem* subItem = baseItem->getSubItem(i);
730+
731+
for(int j = 0; j < numSubItems ; j++)
732+
{
733+
if(name.equalsIgnoreCase(subItem->getSubItem(j)->getName()))
734+
{
735+
description.fromProcessorList = true;
736+
description.index = subItem->getSubItem(j)->index;
737+
description.name = subItem->getSubItem(j)->getName();
738+
description.type = subItem->getSubItem(j)->pluginType;
739+
description.processorType = subItem->getSubItem(j)->processorType;
740+
741+
break;
742+
}
743+
}
744+
}
745+
746+
return description;
747+
}
748+
719749
// ===================================================================
720750

721751
ProcessorListItem::ProcessorListItem(const String& name_,

Source/UI/ProcessorList.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ class ProcessorList : public Component,
9090
/** Get list of processors **/
9191
Array<String> getItemList();
9292

93+
Plugin::Description getItemDescriptionfromList(const String& processorName);
94+
9395
/** Set component bounds */
9496
void resized();
9597

Source/Utils/OpenEphysHttpServer.h

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include "../MainWindow.h"
3535
#include "../AccessClass.h"
36+
#include "../UI/ProcessorList.h"
3637

3738
#include "Utils.h"
3839

@@ -82,6 +83,8 @@ using json = nlohmann::json;
8283
* - GET /api/processors/<processor_id>/streams/<stream_index>/parameters/<parameter_name>
8384
* - PUT /api/processors/<processor_id>/streams/<stream_index>/parameters/<parameter_name>
8485
* - PUT /api/processors/<processor_id>/config
86+
* - PUT /api/processors/add
87+
* - PUT /api/processors/delete
8588
* - PUT /api/window
8689
*
8790
* All endpoints are JSON endpoints. The PUT endpoint expects two parameters: "channel" (an integer), and "value",
@@ -486,6 +489,159 @@ class OpenEphysHttpServer : juce::Thread {
486489
res.set_content(ret.dump(), "application/json");
487490
});
488491

492+
svr_->Put("/api/processors/delete", [this](const httplib::Request& req, httplib::Response& res) {
493+
494+
LOGD( "Received PUT request" );
495+
496+
json request_json;
497+
try {
498+
LOGD( "Trying to decode" );
499+
request_json = json::parse(req.body);
500+
LOGD( "Parsed" );
501+
}
502+
catch (json::exception& e) {
503+
LOGD( "Hit exception" );
504+
res.set_content(e.what(), "text/plain");
505+
res.status = 400;
506+
return;
507+
}
508+
509+
std::string procId;
510+
if (!request_json.contains("id")) {
511+
LOGD( "No 'id' element found." );
512+
res.set_content("Request must contain processor id.", "text/plain");
513+
res.status = 400;
514+
return;
515+
}
516+
else {
517+
procId = request_json["id"];
518+
LOGD( "Found a processor id." );
519+
}
520+
521+
auto processor = find_processor(procId);
522+
if (processor == nullptr) {
523+
LOGD( "Could not find processor" );
524+
res.status = 404;
525+
return;
526+
}
527+
528+
String return_msg;
529+
530+
if (!CoreServices::getAcquisitionStatus())
531+
{
532+
Array<GenericProcessor*> processorNodes;
533+
String processorName = processor->getDisplayName();
534+
535+
processorNodes.add(processor);
536+
graph_->deleteNodes(processorNodes);
537+
538+
return_msg = processorName + " [" + procId + "] deleted successfully";
539+
} else {
540+
return_msg = "Cannot delete processors while acquisition is active.";
541+
}
542+
543+
json ret;
544+
ret["info"] = return_msg.toStdString();
545+
res.set_content(ret.dump(), "application/json");
546+
});
547+
548+
549+
svr_->Put("/api/processors/add", [this](const httplib::Request& req, httplib::Response& res) {
550+
551+
LOGD( "Received PUT request" );
552+
553+
json request_json;
554+
try {
555+
LOGD( "Trying to decode" );
556+
request_json = json::parse(req.body);
557+
LOGD( "Parsed" );
558+
}
559+
catch (json::exception& e) {
560+
LOGD( "Hit exception" );
561+
res.set_content(e.what(), "text/plain");
562+
res.status = 400;
563+
return;
564+
}
565+
566+
std::string procName;
567+
if (!request_json.contains("name")) {
568+
LOGD( "No 'name' element found." );
569+
res.set_content("Request must contain processor name.", "text/plain");
570+
res.status = 400;
571+
return;
572+
}
573+
else {
574+
procName = request_json["name"];
575+
LOGD( "Found a processor name." );
576+
}
577+
578+
std::string sourceNodeId, destNodeId;
579+
if (!request_json.contains("source_id") && !request_json.contains("dest_id")) {
580+
LOGD( "No 'source_id' or 'dest_id' element found." );
581+
res.set_content("Request must contain source or destination processor node id.", "text/plain");
582+
res.status = 400;
583+
return;
584+
}
585+
else {
586+
if(request_json.contains("source_id"))
587+
sourceNodeId = request_json["source_id"];
588+
else
589+
destNodeId = request_json["dest_id"];
590+
591+
LOGD( "Found a source/dest node id." );
592+
}
593+
594+
595+
auto listOfProc = AccessClass::getProcessorList()->getItemList();
596+
bool foundProcessor = false;
597+
for(auto p : listOfProc)
598+
{
599+
if(p.equalsIgnoreCase(String(procName)))
600+
{
601+
foundProcessor = true;
602+
break;
603+
}
604+
}
605+
606+
if (!foundProcessor) {
607+
LOGD( "Could not find processor in the Processor List" );
608+
res.status = 404;
609+
return;
610+
}
611+
612+
String return_msg;
613+
614+
if (!CoreServices::getAcquisitionStatus())
615+
{
616+
auto description = AccessClass::getProcessorList()->getItemDescriptionfromList(procName);
617+
618+
GenericProcessor *sourceProcessor, *destProcessor;
619+
if(sourceNodeId.empty())
620+
{
621+
destProcessor = graph_->getProcessorWithNodeId(std::stoi(destNodeId));
622+
sourceProcessor = destProcessor->getSourceNode();
623+
sourceNodeId = std::to_string(sourceProcessor->getNodeId());
624+
}
625+
else
626+
{
627+
sourceProcessor = graph_->getProcessorWithNodeId(std::stoi(sourceNodeId));
628+
destProcessor = sourceProcessor->getDestNode();
629+
}
630+
631+
graph_->createProcessor(description,
632+
sourceProcessor,
633+
destProcessor);
634+
635+
return_msg = procName + " added after node " + sourceNodeId + " successfully";
636+
} else {
637+
return_msg = "Cannot add processors while acquisition is active.";
638+
}
639+
640+
json ret;
641+
ret["info"] = return_msg.toStdString();
642+
res.set_content(ret.dump(), "application/json");
643+
});
644+
489645
svr_->Put(R"(/api/processors/([0-9]+)/parameters/([A-Za-z0-9_\.\-]+))",
490646
[this](const httplib::Request& req, httplib::Response& res) {
491647
auto processor = find_processor(req.matches[1]);

0 commit comments

Comments
 (0)