Adding LinkIR C bindings

This commit is contained in:
Rodrigo Alfonso 2025-02-11 23:02:01 -03:00
parent 4f664002ba
commit 8b1de89179
3 changed files with 158 additions and 3 deletions

View File

@ -366,7 +366,4 @@ inline void LINK_IR_ISR_SERIAL() {
linkIR->_onSerial();
}
// TODO: C BINDINGS
// TODO: DOCUMENTATION (README)
#endif // LINK_IR_H

View File

@ -0,0 +1,95 @@
#include "C_LinkIR.h"
#include "../LinkIR.hpp"
extern "C" {
C_LinkIRHandle C_LinkIR_createDefault() {
return new LinkIR();
}
C_LinkIRHandle C_LinkIR_create(u8 primaryTimerId, u8 secondaryTimerId) {
return new LinkIR(primaryTimerId, secondaryTimerId);
}
void C_LinkIR_destroy(C_LinkIRHandle handle) {
delete static_cast<LinkIR*>(handle);
}
bool C_LinkIR_activate(C_LinkIRHandle handle) {
return static_cast<LinkIR*>(handle)->activate();
}
void C_LinkIR_deactivate(C_LinkIRHandle handle) {
static_cast<LinkIR*>(handle)->deactivate();
}
void C_LinkIR_sendNEC(C_LinkIRHandle handle, u8 address, u8 command) {
static_cast<LinkIR*>(handle)->sendNEC(address, command);
}
bool C_LinkIR_receiveNEC(C_LinkIRHandle handle,
u8* address,
u8* command,
u32 startTimeout) {
u8 addr = 0, cmd = 0;
bool result =
static_cast<LinkIR*>(handle)->receiveNEC(addr, cmd, startTimeout);
*address = addr;
*command = cmd;
return result;
}
bool C_LinkIR_parseNEC(C_LinkIRHandle handle,
u16 pulses[],
u8* address,
u8* command) {
u8 addr = 0, cmd = 0;
bool result = static_cast<LinkIR*>(handle)->parseNEC(pulses, addr, cmd);
*address = addr;
*command = cmd;
return result;
}
void C_LinkIR_send(C_LinkIRHandle handle, u16 pulses[]) {
static_cast<LinkIR*>(handle)->send(pulses);
}
bool C_LinkIR_receive(C_LinkIRHandle handle,
u16 pulses[],
u32 maxEntries,
u32 startTimeout,
u32 signalTimeout) {
return static_cast<LinkIR*>(handle)->receive(pulses, maxEntries, startTimeout,
signalTimeout);
}
void C_LinkIR_setLight(C_LinkIRHandle handle, bool on) {
static_cast<LinkIR*>(handle)->setLight(on);
}
bool C_LinkIR_isEmittingLight(C_LinkIRHandle handle) {
return static_cast<LinkIR*>(handle)->isEmittingLight();
}
bool C_LinkIR_isDetectingLight(C_LinkIRHandle handle) {
return static_cast<LinkIR*>(handle)->isDetectingLight();
}
C_LinkIR_Config C_LinkIR_getConfig(C_LinkIRHandle handle) {
C_LinkIR_Config config;
auto instance = static_cast<LinkIR*>(handle);
config.primaryTimerId = instance->config.primaryTimerId;
config.secondaryTimerId = instance->config.secondaryTimerId;
return config;
}
void C_LinkIR_setConfig(C_LinkIRHandle handle, C_LinkIR_Config config) {
auto instance = static_cast<LinkIR*>(handle);
instance->config.primaryTimerId = config.primaryTimerId;
instance->config.secondaryTimerId = config.secondaryTimerId;
}
void C_LinkIR_onSerial(C_LinkIRHandle handle) {
static_cast<LinkIR*>(handle)->_onSerial();
}
}

63
lib/c_bindings/C_LinkIR.h Normal file
View File

@ -0,0 +1,63 @@
#ifndef C_BINDINGS_LINK_IR_H
#define C_BINDINGS_LINK_IR_H
#ifdef __cplusplus
extern "C" {
#endif
#include <tonc_core.h>
typedef void* C_LinkIRHandle;
#define C_LINK_IR_DEFAULT_PRIMARY_TIMER_ID 2
#define C_LINK_IR_DEFAULT_SECONDARY_TIMER_ID 3
typedef struct {
u8 primaryTimerId;
u8 secondaryTimerId;
} C_LinkIR_Config;
C_LinkIRHandle C_LinkIR_createDefault();
C_LinkIRHandle C_LinkIR_create(u8 primaryTimerId, u8 secondaryTimerId);
void C_LinkIR_destroy(C_LinkIRHandle handle);
bool C_LinkIR_activate(C_LinkIRHandle handle);
void C_LinkIR_deactivate(C_LinkIRHandle handle);
void C_LinkIR_sendNEC(C_LinkIRHandle handle, u8 address, u8 command);
bool C_LinkIR_receiveNEC(C_LinkIRHandle handle,
u8* address,
u8* command,
u32 startTimeout);
bool C_LinkIR_parseNEC(C_LinkIRHandle handle,
u16 pulses[],
u8* address,
u8* command);
void C_LinkIR_send(C_LinkIRHandle handle, u16 pulses[]);
bool C_LinkIR_receive(C_LinkIRHandle handle,
u16 pulses[],
u32 maxEntries,
u32 startTimeout,
u32 signalTimeout);
void C_LinkIR_setLight(C_LinkIRHandle handle, bool on);
bool C_LinkIR_isEmittingLight(C_LinkIRHandle handle);
bool C_LinkIR_isDetectingLight(C_LinkIRHandle handle);
C_LinkIR_Config C_LinkIR_getConfig(C_LinkIRHandle handle);
void C_LinkIR_setConfig(C_LinkIRHandle handle, C_LinkIR_Config config);
void C_LinkIR_onSerial(C_LinkIRHandle handle);
extern C_LinkIRHandle cLinkIR;
inline void C_LINK_IR_ISR_SERIAL() {
C_LinkIR_onSerial(cLinkIR);
}
#ifdef __cplusplus
}
#endif
#endif // C_BINDINGS_LINK_IR_H