Skip to content

Commit

Permalink
using the SPI anstraction for the LedController #22
Browse files Browse the repository at this point in the history
 The LedController now uses the SPI abstraction layer.
 Everything should work as before but the code is not
 tested on real hardwawre yet.

 Next up is getting this working on a raspberry pi.
  • Loading branch information
noah1510 committed May 30, 2021
1 parent 2ca539e commit a63e706
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 62 deletions.
9 changes: 9 additions & 0 deletions src/LedController_template.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,15 @@ namespace sakurajin {
*/
void initConf() noexcept;

/**
* \~english
* @brief the generic SPI handler, which handles all of the data transmission.
*
* \~german
* @brief Der generische SPI handler, der all die Datenübertragung handhabt.
*/
genericSPI SPI_handler;

public:
/**
* \~english
Expand Down
8 changes: 6 additions & 2 deletions src/SPIAbstraction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@
#include <SPI.h>

bool sakurajin::SPIconfiguration::isValid(){
if (SCLK == 0 || MOSI == 0 || MISO == 0) {
if (SCLK == 0) {
return false;
}

return true;
}

sakurajin::genericSPI::genericSPI(){};

sakurajin::genericSPI::genericSPI(const sakurajin::SPIconfiguration& _conf):config{_conf}{
if (config.useHardwareSPI) {
#if ABSTRATION_PLATFORM == 1
Expand Down Expand Up @@ -62,7 +66,7 @@ void sakurajin::genericSPI::beginTransaction(uint64_t pinNum){
inTransaction = true;
}

void sakurajin::genericSPI::writeByte(byte data){
void sakurajin::genericSPI::sendByte(byte data){
if(!inTransaction){return;};

if(!config.useHardwareSPI){
Expand Down
4 changes: 2 additions & 2 deletions src/SPIAbstraction.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#pragma once

#include "ArdiunoAbstraction.hpp"
#include <SPI.h>

namespace sakurajin{
class SPIconfiguration{
Expand All @@ -42,13 +41,14 @@ namespace sakurajin{
bool inTransaction = false;
uint64_t currentTransactionPin = 0;
public:
genericSPI();
genericSPI(const SPIconfiguration& _config);
~genericSPI();

void initSSPin(uint64_t pinNum);

void beginTransaction(uint64_t SSPin);
void writeByte(byte data);
void sendByte(byte data);
void endTransaction();

bool isValid() const;
Expand Down
34 changes: 11 additions & 23 deletions src/implementations/LedController_core.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,48 +86,36 @@ void sakurajin::LedController<columns,rows>::init(const sakurajin::controller_co
initConf();
initSPI();

if(!SPI_handler.isValid()){return;}

initilized = true;
refreshSegments();
}

template <size_t columns, size_t rows>
void sakurajin::LedController<columns,rows>::initConf() noexcept {
if (conf.useHardwareSpi) {
conf.SPI_CLK = SCK;
conf.SPI_MOSI = MOSI;
}

resetBuffers();
}

template <size_t columns, size_t rows>
void sakurajin::LedController<columns,rows>::initSPI() noexcept {
pinMode(conf.SPI_MOSI, OUTPUT);
pinMode(conf.SPI_CLK, OUTPUT);

if(conf.virtual_multi_row) {
pinMode(conf.SPI_CS,OUTPUT);
digitalWrite(conf.SPI_CS,LOW);
} else {
for(unsigned int i = 0; i < rows; i++) {
pinMode(conf.row_SPI_CS[i],OUTPUT);
digitalWrite(conf.row_SPI_CS[i],LOW);
}
}
sakurajin::SPIconfiguration spi_conf{};
spi_conf.MOSI = conf.SPI_MOSI;
spi_conf.SCLK = conf.SPI_CLK;
spi_conf.useHardwareSPI = conf.useHardwareSpi;
spi_conf.transferSpeed = conf.spiTransferSpeed;

if (conf.useHardwareSpi) {
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.begin();
}
SPI_handler = sakurajin::SPIconfiguration{spi_conf};

if(conf.virtual_multi_row) {
digitalWrite(conf.SPI_CS,HIGH);
SPI_handler.initSSPin(conf.SPI_CS);
} else {
for(unsigned int i = 0; i < rows; i++) {
digitalWrite(conf.row_SPI_CS[i],HIGH);
SPI_handler.initSSPin(conf.row_SPI_CS[i]);
}
}

}

template <size_t columns, size_t rows>
Expand Down
47 changes: 12 additions & 35 deletions src/implementations/LedController_low_level.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,56 +34,33 @@ void sakurajin::LedController<columns,rows>::spiTransfer(unsigned int segment, b

if(conf.virtual_multi_row && conf.SPI_CS != 0) {
auto cs = conf.SPI_CS;
digitalWrite(cs, LOW);

if (conf.useHardwareSpi) {
SPI.beginTransaction(SPISettings(conf.spiTransferSpeed, MSBFIRST, SPI_MODE0));
}
//begin the transaction to the cs pin
SPI_handler.beginTransaction(cs);

for (int i = maxbytes; i > 0; i--) {
if (conf.useHardwareSpi) {
SPI.transfer(spidata[i-1]);
} else {
shiftOut(conf.SPI_MOSI, conf.SPI_CLK, MSBFIRST, spidata[i-1]);
}
SPI_handler.sendByte(spidata[i-1]);
}

//end the spi transfer if hardware should be used
if (conf.useHardwareSpi) {
SPI.endTransaction();
}

// latch the data onto the display
digitalWrite(cs, HIGH);
//end the spi transfer
SPI_handler.endTransaction();

} else {
for(unsigned int r = 0; r < rows ; r++) {

//enable the line
auto cs = conf.row_SPI_CS[r];
digitalWrite(cs, LOW);

//init the spi transfer if hardware should be used
if (conf.useHardwareSpi) {
SPI.beginTransaction(SPISettings(conf.spiTransferSpeed, MSBFIRST, SPI_MODE0));
}

//begin the transaction to the cs pin
SPI_handler.beginTransaction(cs);

// Now shift out the data
for (int i = columns*2; i > 0; i--) {
if (conf.useHardwareSpi) {
SPI.transfer(spidata[r*columns*2+i-1]);
} else {
shiftOut(conf.SPI_MOSI, conf.SPI_CLK, MSBFIRST, spidata[r*columns*2+i-1]);
}
}

//end the spi transfer if hardware should be used
if (conf.useHardwareSpi) {
SPI.endTransaction();
SPI_handler.sendByte(spidata[r*columns*2+i-1]);
}

// latch the data onto the display
digitalWrite(cs, HIGH);
//end the spi transfer
SPI_handler.endTransaction();
}
}
}
Expand Down

0 comments on commit a63e706

Please sign in to comment.