/*file:SoftwareSPI.cpp
 * author:julianh2o
 * edited:ahmet
 * edit? add 8-16 bit function and automatic chip select(remove select and deseclt command)
 */
#include "SoftwareSPI.h"
#define bit_len8 8
#define bit_len16 16
SoftwareSPI::SoftwareSPI(byte pin_sck, byte pin_mosi, byte pin_miso, byte pin_cs) {
    _pin_sck = pin_sck;
    _pin_mosi = pin_mosi;
    _pin_miso = pin_miso;
    _pin_cs = pin_cs;
}
void SoftwareSPI::begin() {
    pinMode(_pin_cs, OUTPUT);
    pinMode(_pin_sck, OUTPUT);
    pinMode(_pin_mosi, OUTPUT);
    pinMode(_pin_miso, INPUT);
}
//==================8 BIT TRANSFER===========================
byte SoftwareSPI::transfer8(byte b) {
    byte rec8 = 0;
    digitalWrite(_pin_cs,LOW);
   
    for (int i = 0; i < bit_len8; i++) {
        digitalWrite(_pin_mosi, bitRead(b, 7-i)); //MSB first
        digitalWrite(_pin_sck, HIGH);
        bitWrite(rec8, 7-i, digitalRead(_pin_miso));
        digitalWrite(_pin_sck, LOW);
    }
    digitalWrite(_pin_cs,HIGH);
    return rec8;
}
//==================8 BIT TRANSFER===========================
//==================16 BIT TRANSFER===========================
byte SoftwareSPI::transfer16(byte b) {
    byte rec16 = 0;
    digitalWrite(_pin_cs,LOW);
   
    for (int i = 0; i < bit_len16; i++) {
        digitalWrite(_pin_mosi, bitRead(b, 15-i)); //MSB first
        digitalWrite(_pin_sck, HIGH);
        bitWrite(rec16, 15-i, digitalRead(_pin_miso));
        digitalWrite(_pin_sck, LOW);
    }
    digitalWrite(_pin_cs,HIGH);
    return rec16;
}
//==================16 BIT TRANSFER===========================
/*
void SoftwareSPI::select() {  //REMOVE
    digitalWrite(_pin_cs,LOW);
}
*/
/*
void SoftwareSPI::deselect() {  //REMOVE
    digitalWrite(_pin_cs,HIGH);
}
*/