Skip to content

File syn_dmx512.h

File List > proto > syn_dmx512.h

Go to the documentation of this file

#ifndef SYN_DMX512_H
#define SYN_DMX512_H

#include "../common/syn_defs.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#define SYN_DMX512_MAX_CHANNELS 512U
#define SYN_DMX512_START_CODE_NULL 0x00U 
#define SYN_DMX512_BAUD_RATE 250000UL

typedef enum {
    SYN_DMX512_STATE_WAIT_BREAK = 0,
    SYN_DMX512_STATE_WAIT_START,
    SYN_DMX512_STATE_READ_SLOTS,
} SYN_DMX512_RxState;

typedef struct {
    uint8_t channels[SYN_DMX512_MAX_CHANNELS]; 
    uint16_t num_channels;                     
    uint8_t start_code;                        
} SYN_DMX512_Master;

typedef struct {
    uint8_t rx_channels[SYN_DMX512_MAX_CHANNELS]; 
    uint16_t start_address;                       
    uint16_t footprint;                           
    SYN_DMX512_RxState rx_state;                  
    uint16_t current_slot;                        
    uint8_t start_code;                           
    bool frame_complete;                          
} SYN_DMX512_Slave;

void syn_dmx512_master_init(SYN_DMX512_Master *master, uint16_t num_channels);

SYN_Status syn_dmx512_master_set_channel(SYN_DMX512_Master *master, uint16_t channel,
                                         uint8_t value);

uint8_t syn_dmx512_master_get_channel(const SYN_DMX512_Master *master, uint16_t channel);

size_t syn_dmx512_master_build_frame(const SYN_DMX512_Master *master, uint8_t *out_buf,
                                     size_t max_len);

void syn_dmx512_slave_init(SYN_DMX512_Slave *slave, uint16_t start_address, uint16_t footprint);

void syn_dmx512_slave_rx_break(SYN_DMX512_Slave *slave);

void syn_dmx512_slave_rx_byte(SYN_DMX512_Slave *slave, uint8_t byte);

uint8_t syn_dmx512_slave_get_channel(const SYN_DMX512_Slave *slave, uint16_t offset);

bool syn_dmx512_slave_is_updated(SYN_DMX512_Slave *slave);

#ifdef __cplusplus
}
#endif

#endif /* SYN_DMX512_H */