Files
lumiax-controller/src/fifo.hpp
T
Korneliusz Osmenda a1ca76f42e Remove irqlock as it breaks bt stack ...
as we have one provider consumer pair it should be safeish
2022-08-30 18:21:06 +02:00

62 lines
1.3 KiB
C++

#ifndef FIFO_DEF_H_
#define FIFO_DEF_H_
#include <stdint.h>
#include <zephyr/sys/atomic.h>
#include <zephyr/irq.h>
template<size_t LEN,typename CNT=unsigned char>
class FIFO{
CNT data[LEN];
CNT* const data_end;
atomic_ptr_t wrptr;
atomic_ptr_t rdptr;
public:
FIFO() : data(), data_end(&data[LEN]), wrptr(data), rdptr(data){};
void clear()
{
atomic_ptr_set(&wrptr, data);
atomic_ptr_set(&rdptr, data);
}
inline intptr_t put(CNT val)
{
volatile CNT *tmwr = (volatile CNT *)atomic_ptr_get(&wrptr);
volatile CNT *tmrd = (volatile CNT *)atomic_ptr_get(&rdptr);
tmwr += 1;
if(tmwr == data_end)
tmwr = data;
if (tmwr == tmrd)
return 0;
*tmwr = val;
atomic_ptr_set(&wrptr,(void*)tmwr);
return 1;
}
inline intptr_t get(CNT* val)
{
volatile CNT *tmwr = (volatile CNT *)atomic_ptr_get(&wrptr);
volatile CNT *tmrd = (volatile CNT *)atomic_ptr_get(&rdptr);
if (tmwr == tmrd)
return 0;
tmrd += 1;
if(tmrd == data_end)
tmrd = data;
*val = *tmrd;
atomic_ptr_set(&rdptr,(void*)tmrd);
return 1;
}
inline intptr_t check()
{
volatile CNT *tmwr = (volatile CNT *)atomic_ptr_get(&wrptr);
volatile CNT *tmrd = (volatile CNT *)atomic_ptr_get(&rdptr);
int ret = (tmwr - tmrd);
if (ret < 0) ret +=LEN;
return ret;
}
};
#endif /* FIFO_H_ */