Started to seperate AVR specific code from SSS7 core
This commit is contained in:
parent
27a6338585
commit
5da22fff03
|
@ -1,9 +1,9 @@
|
||||||
#include "sss7.h"
|
#include "sss7.h"
|
||||||
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include <util/crc16.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
|
||||||
volatile enum sss7State sss7_state;
|
volatile enum sss7State sss7_state;
|
||||||
|
|
||||||
uint8_t sss7_rx_buffer[SSS7_RX_BUFFER_COUNT][SSS7_PAYLOAD_SIZE];
|
uint8_t sss7_rx_buffer[SSS7_RX_BUFFER_COUNT][SSS7_PAYLOAD_SIZE];
|
||||||
|
@ -18,6 +18,7 @@ volatile uint8_t sss7_tx_failed;
|
||||||
uint8_t sss7_tx_last_byte;
|
uint8_t sss7_tx_last_byte;
|
||||||
uint8_t sss7_tx_last_ack;
|
uint8_t sss7_tx_last_ack;
|
||||||
|
|
||||||
|
|
||||||
void sss7_init(void) {
|
void sss7_init(void) {
|
||||||
sss7_state = SSS7_IDLE;
|
sss7_state = SSS7_IDLE;
|
||||||
|
|
||||||
|
@ -33,20 +34,34 @@ void sss7_init(void) {
|
||||||
PORTB |= (1 << PB2) | (1 << PB3);
|
PORTB |= (1 << PB2) | (1 << PB3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline uint8_t sss7_payload_crc(uint8_t buffer[SSS7_PAYLOAD_SIZE]) {
|
static inline uint8_t sss7_payload_crc(uint8_t buffer[SSS7_PAYLOAD_SIZE]) {
|
||||||
uint8_t crc = 0;
|
uint8_t crc = 0;
|
||||||
for(uint8_t i = 0; i < SSS7_PAYLOAD_SIZE; i++) {
|
|
||||||
crc = _crc_ibutton_update(crc, buffer[i]);
|
for(uint8_t byte = 0; byte < SSS7_PAYLOAD_SIZE; byte++) {
|
||||||
|
crc = crc ^ buffer[byte];
|
||||||
|
for (uint8_t bit = 0; bit < 8; bit++)
|
||||||
|
{
|
||||||
|
if (crc & 0x01) {
|
||||||
|
crc = (crc >> 1) ^ 0x8C;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
crc >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void sss7_send_byte(uint8_t byte) {
|
static inline void sss7_send_byte(uint8_t byte) {
|
||||||
sss7_tx_last_ack = 0;
|
sss7_tx_last_ack = 0;
|
||||||
sss7_tx_last_byte = byte;
|
sss7_tx_last_byte = byte;
|
||||||
UDR = byte;
|
uart_put_byte(byte);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sss7_send(uint8_t msg[SSS7_PAYLOAD_SIZE]) {
|
void sss7_send(uint8_t msg[SSS7_PAYLOAD_SIZE]) {
|
||||||
// Check that we can send, because we will overwritte the buffer
|
// Check that we can send, because we will overwritte the buffer
|
||||||
if(sss7_state != SSS7_IDLE) {
|
if(sss7_state != SSS7_IDLE) {
|
||||||
|
@ -66,8 +81,8 @@ void sss7_send(uint8_t msg[SSS7_PAYLOAD_SIZE]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ISR(USART_RXC_vect) {
|
void sss7_process_rx(void) {
|
||||||
uint8_t byte = UDR;
|
uint8_t byte = uart_get_byte();
|
||||||
uint8_t crc = 0;
|
uint8_t crc = 0;
|
||||||
|
|
||||||
switch(sss7_state) {
|
switch(sss7_state) {
|
||||||
|
@ -121,8 +136,8 @@ ISR(USART_RXC_vect) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(USART_TXC_vect) {
|
|
||||||
|
|
||||||
|
void sss7_process_tx(void) {
|
||||||
if(sss7_tx_last_ack) {
|
if(sss7_tx_last_ack) {
|
||||||
uint8_t byte;
|
uint8_t byte;
|
||||||
switch(sss7_state) {
|
switch(sss7_state) {
|
||||||
|
@ -155,9 +170,9 @@ ISR(USART_TXC_vect) {
|
||||||
sss7_tx_failed = 1;
|
sss7_tx_failed = 1;
|
||||||
sss7_state = SSS7_IDLE;
|
sss7_state = SSS7_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sss7_get_received(uint8_t msg[SSS7_PAYLOAD_SIZE]) {
|
void sss7_get_received(uint8_t msg[SSS7_PAYLOAD_SIZE]) {
|
||||||
if(sss7_has_received()) {
|
if(sss7_has_received()) {
|
||||||
memcpy(msg, sss7_rx_buffer[sss7_rx_oldest_buffer], SSS7_PAYLOAD_SIZE);
|
memcpy(msg, sss7_rx_buffer[sss7_rx_oldest_buffer], SSS7_PAYLOAD_SIZE);
|
||||||
|
|
|
@ -24,6 +24,10 @@ extern volatile uint8_t sss7_tx_failed;
|
||||||
extern uint8_t sss7_rx_active_buffer;
|
extern uint8_t sss7_rx_active_buffer;
|
||||||
extern uint8_t sss7_rx_oldest_buffer;
|
extern uint8_t sss7_rx_oldest_buffer;
|
||||||
|
|
||||||
|
void sss7_process_rx(void);
|
||||||
|
void sss7_process_tx(void);
|
||||||
|
|
||||||
|
|
||||||
void sss7_init(void);
|
void sss7_init(void);
|
||||||
|
|
||||||
static inline uint8_t sss7_can_send(void) {
|
static inline uint8_t sss7_can_send(void) {
|
||||||
|
@ -40,8 +44,6 @@ static inline uint8_t sss7_has_received(void) {
|
||||||
return sss7_rx_oldest_buffer < sss7_rx_active_buffer;
|
return sss7_rx_oldest_buffer < sss7_rx_active_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void sss7_get_received(uint8_t msg[SSS7_PAYLOAD_SIZE]);
|
void sss7_get_received(uint8_t msg[SSS7_PAYLOAD_SIZE]);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include <util/crc16.h>
|
||||||
|
|
||||||
#include "sss7.h"
|
#include "sss7.h"
|
||||||
|
|
||||||
|
@ -23,3 +24,12 @@ void uart_init(void) {
|
||||||
|
|
||||||
UCSRB |= (1 << TXCIE) | (1 << RXCIE); // enable tx and rx interrupts
|
UCSRB |= (1 << TXCIE) | (1 << RXCIE); // enable tx and rx interrupts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ISR(USART_RXC_vect) {
|
||||||
|
sss7_process_rx();
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(USART_TXC_vect) {
|
||||||
|
sss7_process_tx();
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _UART_H_
|
#ifndef _UART_H_
|
||||||
#define _UART_H_
|
#define _UART_H_
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
#define BAUD 9600UL
|
#define BAUD 9600UL
|
||||||
|
|
||||||
|
@ -17,4 +17,13 @@
|
||||||
|
|
||||||
void uart_init(void);
|
void uart_init(void);
|
||||||
|
|
||||||
|
static inline uint8_t uart_get_byte(void) {
|
||||||
|
uint8_t byte = UDR;
|
||||||
|
return byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void uart_put_byte(uint8_t byte) {
|
||||||
|
UDR = byte;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue