# Script Simple

This example showcases how to setup the [Script](https://docs.luxonis.com/software-v3/depthai/depthai-components/nodes/script.md)
node.

This example requires the DepthAI v3 API, see [installation instructions](https://docs.luxonis.com/software-v3/depthai.md).

## Pipeline

### examples/script_simple.pipeline.json

```json
{"pipeline": {"connections": [{"node1Id": 3, "node1Output": "out", "node1OutputGroup": "", "node2Id": 0, "node2Input": "in", "node2InputGroup": "io"}, {"node1Id": 0, "node1Output": "out", "node1OutputGroup": "io", "node2Id": 4, "node2Input": "in", "node2InputGroup": ""}], "globalProperties": {"calibData": null, "cameraTuningBlobSize": null, "cameraTuningBlobUri": "", "leonCssFrequencyHz": 700000000.0, "leonMssFrequencyHz": 700000000.0, "pipelineName": null, "pipelineVersion": null, "sippBufferSize": 18432, "sippDmaBufferSize": 16384, "xlinkChunkSize": -1}, "nodes": [[4, {"alias": "", "id": 4, "ioInfo": [[["", "in"], {"blocking": true, "group": "", "id": 3, "name": "in", "queueSize": 3, "type": 3, "waitForMessage": false}]], "logLevel": 3, "name": "XLinkOut", "parentId": -1, "properties": {"maxFpsLimit": -1.0, "metadataOnly": false, "streamName": "__x_0_out"}}], [3, {"alias": "", "id": 3, "ioInfo": [[["", "out"], {"blocking": false, "group": "", "id": 2, "name": "out", "queueSize": 8, "type": 0, "waitForMessage": false}]], "logLevel": 3, "name": "XLinkIn", "parentId": -1, "properties": {"maxDataSize": 5242880, "numFrames": 8, "streamName": "__x_0_io_in"}}], [0, {"alias": "", "id": 0, "ioInfo": [[["io", "out"], {"blocking": false, "group": "io", "id": 1, "name": "out", "queueSize": 8, "type": 0, "waitForMessage": false}], [["io", "in"], {"blocking": true, "group": "io", "id": 0, "name": "in", "queueSize": 8, "type": 3, "waitForMessage": false}]], "logLevel": 3, "name": "Script", "parentId": -1, "properties": {"processor": 1, "scriptName": "<script>", "scriptUri": "asset:__script"}}]]}}
```

## Source code

#### Python

```python
import depthai as dai
import time

# Create pipeline
pipeline = dai.Pipeline()
script = pipeline.create(dai.node.Script)
inputQueue = script.inputs["in"].createInputQueue()
outputQueue = script.outputs["out"].createOutputQueue()

script.setScript(
    """
    while True:
        message = node.inputs["in"].get()
        # Or alternatively:
        # message = node.io["in"].get()
        node.warn("I received a message!")
        node.outputs["out"].send(message)
        # Or alternatively:
        # node.io["out"].send(message)
"""
)

pipeline.start()
with pipeline:
    while pipeline.isRunning():
        message = dai.ImgFrame()
        print("Sending a message")
        inputQueue.send(message)
        output = outputQueue.get()
        print("Received a message")
        time.sleep(1)
```

#### C++

```cpp
#include <atomic>
#include <chrono>
#include <csignal>
#include <iostream>
#include <memory>
#include <thread>

#include "depthai/depthai.hpp"

// Global flag for graceful shutdown
std::atomic<bool> quitEvent(false);

// Signal handler
void signalHandler(int signum) {
    quitEvent = true;
}

int main() {
    // Set up signal handlers
    signal(SIGTERM, signalHandler);
    signal(SIGINT, signalHandler);

    try {
        // Create pipeline
        dai::Pipeline pipeline;

        // Create script node
        auto script = pipeline.create<dai::node::Script>();

        // Set the script content
        script->setScript(R"(
            while True:
                message = node.inputs["in"].get()
                # Or alternatively:
                # message = node.io["in"].get()
                node.warn("I received a message!")
                node.outputs["out"].send(message)
                # Or alternatively:
                # node.io["out"].send(message)
        )");

        // Create input and output queues
        auto inputQueue = script->inputs["in"].createInputQueue();
        auto outputQueue = script->outputs["out"].createOutputQueue();

        // Start pipeline
        pipeline.start();

        // Main loop
        while(pipeline.isRunning() && !quitEvent) {
            // Create and send a message
            auto message = std::make_shared<dai::ImgFrame>();
            std::cout << "Sending a message" << std::endl;
            inputQueue->send(message);

            // Receive the message
            auto output = outputQueue->get<dai::ImgFrame>();
            std::cout << "Received a message" << std::endl;

            // Sleep for 1 second
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }

        // Cleanup
        pipeline.stop();
        pipeline.wait();

    } catch(const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}
```

### Need assistance?

Head over to [Discussion Forum](https://discuss.luxonis.com/) for technical support or any other questions you might have.
