bosko lekovic
/
IO_board
IO plocana FRDM K64
Diff: SPIprotokol/IOspiConnect.cpp
- Revision:
- 7:4aa3dac73b66
- Child:
- 15:3429cdc6e5f4
diff -r 12b2660d7dff -r 4aa3dac73b66 SPIprotokol/IOspiConnect.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SPIprotokol/IOspiConnect.cpp Sun Mar 21 18:20:15 2021 +0100 @@ -0,0 +1,105 @@ +#include "IOspiConnect.h" +#include "mbed.h" +#include "IOspitelegram.h" + + +#include "Pinovi.h" + + + +static DigitalOut tast(IO_TELEGRAM_TAS_PIN,0); + + +/****************************** C_spiConnect ******************************************* */ + C_spiConnect::C_spiConnect( ): /*C_gpioSpi()*/ C_slaveSpi() // C_gpioSpi() + { byteCount = 0; clear_bitCount(); } + + void C_spiConnect::spiByteTransfer( char *tx, char rx) + { *tx = push_byte(rx); } + + void C_spiConnect::make_TxTelegram( char txcmnd, char rxcmnd, char data) + { c_tx.make_telegram( txcmnd, rxcmnd, data); } + + char C_spiConnect::push_byte( char b ) + { + char spiWriteData = 0x66; + + if(byteCount != 3 ) bytecountTimeout(); + + if(!tast) + { + c_rx.set_byte(byteCount++, b); + + if(byteCount == 2) // priprema adresnog bajta predajnog telegrama + { + c_tx.set_address( ); + spiWriteData = c_tx.get_byte( 0 ); // IOadresa + } + else if(byteCount == 3) // predajnog bajta komande read-a telegrama + { + c_tx.set_readCommand(c_rx.get_readCommand()); + c_tx.set_writeCommand( 0 ); + spiWriteData = c_tx.get_byte( 1 ); // IOadresa + } + else if(byteCount == 4) // analiza celog predajnog telegrama + { + +loguj_telegram( "prijem = ", c_rx.get_telegram() ); + + if( c_rx.check_sum() ) // provera ispravnosti + { + if( c_rx.check_addressValidy( )) // da li je pojedinacna ili grupna adresa validna + { + if( c_rx.get_readCommand( )) // da li ima upit za citanje ? + { + if( !c_rx.check_groupAddressValidy() ) // ako ima, da li je pojedinacna adresa ispravna + { + + // pakujemo odgovor na upit + char readCommandResult = do_readCommand( c_rx.get_readCommand(), c_rx.get_data() ); + c_tx.set_data( readCommandResult); + c_tx.set_sum(); + spiWriteData = c_tx.get_data(); + tast = 1; + +loguj_telegram( "priprema predaje = ", c_tx.get_telegram() ); + + } + else c_rx.do_readGroupCommand( c_rx.get_readCommand() ); + } // treba vremenska zastita tastovanja !!! + + if( c_rx.get_writeCommand() ) // da li ima upis ? + do_writeCommand( c_rx.get_writeCommand(), c_rx.get_data() ); + } + } + else { byteCount = 0; clear_bitCount(); loguj_poruku((const char*)"checksum wrong\n\r"); } + + byteCount = 0; + } // buteCount == 4 + else if(byteCount > 4 ) { byteCount = 0; clear_bitCount(); loguj_poruku((const char*)"broj bajtova > 4\n\r");} + + } + else /* Predaja tast = 1 */ + { + if( byteCount++ == 0 ) spiWriteData = c_tx.get_byte( 3 ); // byteCount krenuo od nule + else + { + spiWriteData = 0x0; + + if(byteCount > 3) + { + tast = 0; +// spiWriteData = 0x7; + byteCount = 0; + loguj_telegram( "predaja = ", c_tx.get_telegram() ); + } + } + } + + + + // loguj_string_broj( "predajni bajt:", spiWriteData); + return spiWriteData; + } + +/************************************************************************* */