| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | 
							- //rbuf.c
 
- #include "rbuf.h"
 
- //#include <avr/interrupt.h>
 
- void rbuf_ini(uint8_t* ptr, uint8_t l)
 
- {
 
- 	ptr[0] = l;
 
- 	ptr[1] = 0;
 
- 	ptr[2] = 0;
 
- }
 
- //lock/unlock macros
 
- //#define _lock() uint8_t _sreg = SREG; cli();
 
- //#define _unlock() SREG = _sreg;
 
- #define _lock()
 
- #define _unlock()
 
- //put single byte to buffer
 
- int rbuf_put(uint8_t* ptr, uint8_t b)
 
- {
 
- //#ifdef _NO_ASM
 
- 	_lock();                         //lock
 
- 	uint8_t buf_w = ptr[1];          //get write index
 
- 	uint8_t buf_r = ptr[2];          //get read index
 
- 	_unlock();                       //unlock
 
- 	ptr[4 + buf_w] = b;              //store byte to buffer
 
- 	buf_w++;                         //incerment write index
 
- 	uint8_t buf_l = ptr[0];          //get length
 
- 	if (buf_w >= buf_l) buf_w = 0;   //rotate write index
 
- 	if (buf_w == buf_r) return -1;   //return -1 to signal buffer full
 
- 	ptr[1] = buf_w;                  //store write index
 
- 	return 0;                        //return 0 to signal success
 
- //#else //_NO_ASM
 
- // TODO - optimized assembler version
 
- //	asm("movw r26, r24");
 
- //	asm("ld r18, X+");
 
- //	asm("cli");
 
- //	asm("ld r19, X+");
 
- //	asm("ld r20, X");
 
- //	asm("cp r19, r18");
 
- //	asm("brne .-6");*/
 
- //#endif //_NO_ASM
 
- }
 
- //get single byte from buffer
 
- int rbuf_get(uint8_t* ptr)
 
- {
 
- //#ifdef _NO_ASM
 
- 	_lock();                         //lock
 
- 	uint8_t buf_w = ptr[1];          //get write index
 
- 	uint8_t buf_r = ptr[2];          //get read index
 
- 	_unlock();                       //unlock
 
- 	if (buf_r == buf_w) return -1;   //return -1 to signal buffer empty
 
- 	int ret = ptr[4 + buf_r];        //get byte from buffer
 
- 	buf_r++;                         //increment read index
 
- 	uint8_t buf_l = ptr[0];          //get length
 
- 	if (buf_r >= buf_l) buf_r = 0;   //rotate read index
 
- 	ptr[2] = buf_r;                  //store read index
 
- 	return ret;                      //return byte (0-255)
 
- //	return 0;                        //return 0 to signal success
 
- //#else //_NO_ASM
 
- // TODO - optimized assembler version
 
- //#endif //_NO_ASM
 
- }
 
 
  |