#include "SPI_DMX.h" #define SPI_FREQHz (8.0*8.0e5) #define SPI_BYTEus ((8.0e6/SPI_FREQHz)*1.6) //weird translation factor idk #define DMX_BITus 4 #define BREAKus (25*DMX_BITus) #define MABus (3*DMX_BITus) #define STARTus (DMX_BITus) #define STOPus (2*DMX_BITus) #define BY_HIGH 0x00 #define BY_LOW 0xFF SPI_DMX::SPI_DMX(unsigned char serial_port) { this->serial_port = serial_port; for(int i = 0; i < BREAKus/SPI_BYTEus; i++) { this->message[i] = BY_LOW; } for(int i = BREAKus/SPI_BYTEus; i < (BREAKus+MABus)/SPI_BYTEus; i++) { this->message[i] = BY_HIGH; } wiringPiSPISetup(serial_port,SPI_FREQHz); printf("%f\n",SPI_FREQHz); } SPI_DMX::~SPI_DMX() { } void SPI_DMX::TX_Bytes(unsigned char* tx_buffer, unsigned char tx_size) { //unsigned int SPIbits = (BREAKus+MABus+(size*(STARTus+8*DMX_BITus+STOPus)))/SPI_BITus; //unsigned char message[SPIbits]; int messind = (BREAKus+MABus)/SPI_BYTEus; printf("%i\n",messind); for(int b = 0; b < tx_size; b++) { for(int i = 0; i < STARTus/SPI_BYTEus; i++) { message[messind++] = BY_LOW; } for(int i = 0; i < 8; i++) { unsigned char txbit = tx_buffer[b]; txbit = ~((((txbit >> i) & 0x01) ^ 0x01) * 0xFF); //NEEDS TO BE ADJUSTED IF LOGIC LEVEL IS REVERSED for(int i = 0; i < DMX_BITus/SPI_BYTEus; i++) { message[messind++] = txbit; } } for(int i = 0; i < STOPus/SPI_BYTEus; i++) { message[messind++] = BY_HIGH; } } printf("%i\n",messind); /*messind = 0; for(int i = 0; i < 8; i++) { unsigned char txbit = tx_buffer[0]; txbit = ((txbit >> i) & 0x01) * 0xFF; for(int i = 0; i < DMX_BITus/SPI_BYTEus; i++) { message[messind++] = txbit; } printf("%u %u %f %i \n",tx_buffer[0],txbit,DMX_BITus/SPI_BYTEus,messind); } */ wiringPiSPIDataRW(this->serial_port, message, messind-1); }