Skip to content
15 changes: 11 additions & 4 deletions src/Debug/debugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -653,8 +653,9 @@ void Debugger::dumpEvents(long start, long size) const {
CallbackHandler::event_begin() + end,
[this, &index, &end](const Event &e) {
this->channel->write(
R"({"topic": "%s", "payload": "%s"})",
e.topic.c_str(), e.payload.c_str());
R"({"topic": "%s", "group": %d, "payload": "%s"})",
e.topic.c_str(), static_cast<int>(e.group),
e.payload.c_str());
if (++index < end) {
this->channel->write(", ");
}
Expand Down Expand Up @@ -769,7 +770,8 @@ bool Debugger::handlePushedEvent(char *bytes) const {
if (*bytes != interruptPUSHEvent) return false;
auto parsed = nlohmann::json::parse(bytes + 1);
debug("handle pushed event: %s\n", bytes + 1);
auto *event = new Event(*parsed.find("topic"), *parsed.find("payload"));
auto *event = new Event(*parsed.find("topic"), *parsed.find("group"),
*parsed.find("payload"));
CallbackHandler::push_event(event);
this->notifyPushedEvent();
return true;
Expand Down Expand Up @@ -1409,6 +1411,10 @@ bool Debugger::saveState(Module *m, uint8_t *interruptData) {
topic[topicSize] = '\0';
program_state += topicSize;

// read group
uint8_t group_idx = read_B32(&program_state);
EventGroup group = static_cast<EventGroup>(group_idx);

// read payload
uint32_t payloadSize = read_B32(&program_state);
auto *payload =
Expand All @@ -1417,7 +1423,8 @@ bool Debugger::saveState(Module *m, uint8_t *interruptData) {
payload[payloadSize] = '\0';
program_state += payloadSize;

CallbackHandler::push_event(topic, payload, payloadSize);
CallbackHandler::push_event(topic, group, payload,
payloadSize);
free(topic);
}
break;
Expand Down
7 changes: 4 additions & 3 deletions src/Edward/proxy_supervisor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Event *parseJSON(char *buff) {
nlohmann::basic_json<> parsed = nlohmann::json::parse(buff);
printf("parseJSON: %s\n", parsed.dump().c_str());
std::string payload = *parsed.find("payload");
return new Event(*parsed.find("topic"), payload);
return new Event(*parsed.find("topic"), *parsed.find("group"), payload);
}

ProxySupervisor::ProxySupervisor(Channel *duplex, warduino::mutex *mutex) {
Expand Down Expand Up @@ -106,8 +106,9 @@ void ProxySupervisor::listenToSocket() {
debug("parseJSON: %s\n", parsed.dump().c_str());

if (isEvent(parsed)) {
CallbackHandler::push_event(new Event(
*parsed.find("topic"), *parsed.find("payload")));
CallbackHandler::push_event(
new Event(*parsed.find("topic"), *parsed.find("group"),
*parsed.find("payload")));
WARDuino::instance()->debugger->notifyPushedEvent();
}

Expand Down
40 changes: 37 additions & 3 deletions src/Primitives/arduino.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ int isr_index = 0;
/* Private macro to create an ISR for a specific pin*/
#define def_isr(pin) \
void isr_##pin() { \
CallbackHandler::push_event(INTERRUPT_TOPIC_PREFIX #pin, "", 0); \
CallbackHandler::push_event(INTERRUPT_TOPIC_PREFIX #pin, \
EventGroup::INTERRUPT_EVENT, "", 0); \
}

/* Common GPIO pins on ESP32 devices:*/
Expand Down Expand Up @@ -129,7 +130,7 @@ int resolve_isr(int pin) {
return -1;
}

#define NUM_GLOBALS 0
#define NUM_GLOBALS 5
#define ALL_GLOBALS NUM_GLOBALS

int global_index = 0;
Expand Down Expand Up @@ -523,6 +524,31 @@ def_prim(unsubscribe_interrupt, oneToNoneU32) {
return true;
}

// Interrupt masking

def_prim(mask_interrupts, twoToNoneU32) {
uint8_t discard = arg0.uint32;
uint8_t group = arg1.uint32;
debug("EMU: mask_interrupt(%u, %u) \n", discard, group);
pop_args(2);
uint32_t key = CallbackHandler::mask_interrupt(
static_cast<EventGroup>(group), discard);
pushUInt32(key);
return true;
}

def_prim(unmask_interrupts, oneToNoneU32) {
uint8_t key = arg0.uint32;
debug("EMU: unmask_interrupt(%u) \n", key);
pop_args(1);
CallbackHandler::unmask_interrupt(key);
return true;
}

def_glob(event_groups_all, I32, false, 0xffffffff);
def_glob(event_group_interrupt, I32, false, EventGroup::INTERRUPT_EVENT);
def_glob(event_group_mqtt, I32, false, EventGroup::MQTT_EVENT);

// MQTT MODULE

#include <PubSubClient.h>
Expand All @@ -541,7 +567,8 @@ def_prim(mqtt_init, threeToNoneU32) {
mqttClient.setServer(server, port);
mqttClient.setCallback([](const char *topic, const unsigned char *payload,
unsigned int length) {
CallbackHandler::push_event(topic, (const char *)payload, length);
CallbackHandler::push_event(topic, EventGroup::MQTT_EVENT,
(const char *)payload, length);
});

#if DEBUG
Expand Down Expand Up @@ -863,6 +890,13 @@ void install_primitives(Interpreter *interpreter) {
install_primitive(chip_ledc_attach);
install_primitive(chip_ledc_set_duty);

install_primitive(mask_interrupts);
install_primitive(unmask_interrupts);

install_global(event_groups_all);
install_global(event_group_interrupt);
install_global(event_group_mqtt);

dbg_info("INSTALLING ISRs\n");
install_isrs();
}
Expand Down
40 changes: 37 additions & 3 deletions src/Primitives/emulated.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#include "../WARDuino/CallbackHandler.h"
#include "primitives.h"

#define NUM_GLOBALS 0
#define NUM_GLOBALS 5
#define ALL_GLOBALS NUM_GLOBALS

int global_index = 0;
Expand Down Expand Up @@ -103,8 +103,8 @@ def_prim(test, oneToNoneU32) {
Callback c = Callback(m, topic, fidx);
CallbackHandler::add_callback(c);
auto *payload = reinterpret_cast<const unsigned char *>("TestPayload");
CallbackHandler::push_event(topic, reinterpret_cast<const char *>(payload),
11);
CallbackHandler::push_event(topic, EventGroup::INTERRUPT_EVENT,
reinterpret_cast<const char *>(payload), 11);
pop_args(1);
return true;
}
Expand Down Expand Up @@ -462,6 +462,31 @@ def_prim(chip_ledc_attach_pin, twoToNoneU32) {
return true;
}

// Interrupt masking

def_prim(mask_interrupts, twoToNoneU32) {
uint8_t discard = arg0.uint32;
uint8_t group = arg1.uint32;
debug("EMU: mask_interrupt(%u, %u) \n", discard, group);
pop_args(2);
uint32_t key = CallbackHandler::mask_interrupt(
static_cast<EventGroup>(group), discard);
pushUInt32(key);
return true;
}

def_prim(unmask_interrupts, oneToNoneU32) {
uint8_t key = arg0.uint32;
debug("EMU: unmask_interrupt(%u) \n", key);
pop_args(1);
CallbackHandler::unmask_interrupt(key);
return true;
}

def_glob(event_groups_all, I32, false, 0xffffffff);
def_glob(event_group_interrupt, I32, false, EventGroup::INTERRUPT_EVENT);
def_glob(event_group_mqtt, I32, false, EventGroup::MQTT_EVENT);

//------------------------------------------------------
// Installing all the primitives
//------------------------------------------------------
Expand Down Expand Up @@ -516,6 +541,15 @@ void install_primitives(Interpreter *interpreter) {
install_primitive(read_uart_sensor);
install_primitive(nxt_touch_sensor);
install_primitive(ev3_touch_sensor);

// Interrupt masking & disabling
install_primitive(mask_interrupts);
install_primitive(unmask_interrupts);
install_primitive(test);

install_global(event_groups_all);
install_global(event_group_interrupt);
install_global(event_group_mqtt);
}

Memory external_mem{};
Expand Down
35 changes: 34 additions & 1 deletion src/Primitives/idf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@
#include "../Memory/mem.h"
#include "../Utils/macros.h"
#include "../Utils/util.h"
#include "../WARDuino/CallbackHandler.h"
#include "driver/gpio.h"
#include "primitives.h"

#define NUM_GLOBALS 0
#define NUM_GLOBALS 5
#define ALL_GLOBALS NUM_GLOBALS

int global_index = 0;
Expand Down Expand Up @@ -76,6 +77,31 @@ def_prim(chip_digital_read, oneToOneU32) {
return true;
}

// Interrupt masking

def_prim(mask_interrupts, twoToNoneU32) {
uint8_t discard = arg0.uint32;
uint8_t group = arg1.uint32;
debug("EMU: mask_interrupt(%u, %u) \n", discard, group);
pop_args(2);
uint32_t key = CallbackHandler::mask_interrupt(
static_cast<EventGroup>(group), discard);
pushUInt32(key);
return true;
}

def_prim(unmask_interrupts, oneToNoneU32) {
uint8_t key = arg0.uint32;
debug("EMU: unmask_interrupt(%u) \n", key);
pop_args(1);
CallbackHandler::unmask_interrupt(key);
return true;
}

def_glob(event_groups_all, I32, false, 0xffffffff);
def_glob(event_group_interrupt, I32, false, EventGroup::INTERRUPT_EVENT);
def_glob(event_group_mqtt, I32, false, EventGroup::MQTT_EVENT);

//------------------------------------------------------
// Installing all the primitives
//------------------------------------------------------
Expand All @@ -85,6 +111,13 @@ void install_primitives(Interpreter *interpreter) {
install_primitive(chip_pin_mode);
install_primitive(chip_digital_write);
install_primitive(chip_digital_read);

install_primitive(mask_interrupts);
install_primitive(unmask_interrupts);

install_global(event_groups_all);
install_global(event_group_interrupt);
install_global(event_group_mqtt);
}

Memory external_mem = {0, 0, 0, nullptr};
Expand Down
35 changes: 34 additions & 1 deletion src/Primitives/zephyr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,12 @@
#include "../Memory/mem.h"
#include "../Utils/macros.h"
#include "../Utils/util.h"
#include "../WARDuino/CallbackHandler.h"
#include "Mindstorms/Motor.h"
#include "Mindstorms/uart_sensor.h"
#include "primitives.h"

#define NUM_GLOBALS 0
#define NUM_GLOBALS 5
#define ALL_GLOBALS NUM_GLOBALS

int global_index = 0;
Expand Down Expand Up @@ -501,6 +502,31 @@ def_prim(display_draw_string, sevenToNoneU32) {
}
#endif

// Interrupt masking

def_prim(mask_interrupts, twoToNoneU32) {
uint8_t discard = arg0.uint32;
uint8_t group = arg1.uint32;
debug("EMU: mask_interrupt(%u, %u) \n", discard, group);
pop_args(2);
uint32_t key = CallbackHandler::mask_interrupt(
static_cast<EventGroup>(group), discard);
pushUInt32(key);
return true;
}

def_prim(unmask_interrupts, oneToNoneU32) {
uint8_t key = arg0.uint32;
debug("EMU: unmask_interrupt(%u) \n", key);
pop_args(1);
CallbackHandler::unmask_interrupt(key);
return true;
}

def_glob(event_groups_all, I32, false, 0xffffffff);
def_glob(event_group_interrupt, I32, false, EventGroup::INTERRUPT_EVENT);
def_glob(event_group_mqtt, I32, false, EventGroup::MQTT_EVENT);

//------------------------------------------------------
// Installing all the primitives
//------------------------------------------------------
Expand All @@ -516,6 +542,13 @@ void install_primitives(Interpreter *interpreter) {
install_primitive(print_int);
install_primitive(abort);

install_primitive(mask_interrupts);
install_primitive(unmask_interrupts);

install_global(event_groups_all);
install_global(event_group_interrupt);
install_global(event_group_mqtt);

#ifdef CONFIG_BOARD_STM32L496G_DISCO
install_primitive(drive_motor);
install_primitive(stop_motor);
Expand Down
Loading