1
0
mirror of https://github.com/elua/elua.git synced 2025-01-08 20:56:17 +08:00
elua/inc/buf.h

70 lines
1.3 KiB
C
Raw Normal View History

// eLua "char device" buffering system
#ifndef __BUF_H__
#define __BUF_H__
#include "type.h"
// [TODO] the buffer data type is currently u8, is this OK?
typedef u8 t_buf_data;
// IDs of "bufferable" devices
enum
{
BUF_ID_UART = 0,
- Buffer refactored to handle multibyte data. Code which was previously using buffer has been updated to work with the changes. API has also changed in accordance: int buf_set(unsigned resid, unsigned resnum, u8 logsize, size_t dsize); int buf_is_enabled( unsigned resid, unsigned resnum ); unsigned buf_get_size( unsigned resid, unsigned resnum ); unsigned buf_get_count( unsigned resid, unsigned resnum ); int buf_write( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); int buf_read( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); Essentially buf_rx_cb and buf_get_char have been renamed to buf_write and buf_read. For these, one now passes a pointer to where the data is coming from or going to, and a dsize parameter indicating how many bytes should be copied. Also, buf_set takes this same dsize parameter, and keeps it in the struct. This allows us to ensure that when data is read or written the number of bytes matches the buffer element size. I thought about maintaining compatibility functions to provide the original buf_rx_cb and buf_get_byte API calls, however there weren't a large number of uses of buf, so it wasn't hard to convert things. One caveat: BUF_MOD_INCR assumes that byte counts for alternate type sizes will be powers of 2. Also, BUF_SIZE_xx's are assumed to refer to element counts. - UART buffering enabled on LM3S This doesn't include switching the ADC code over to using these buffers quite yet. I'm open to comments on these modifications if theres a better or simpler approach. I've checked to make sure buffers work on LM3S, but I don't own any other platforms to make sure there aren't unintended side-effects.
2009-02-09 03:43:47 +00:00
BUF_ID_ADC = 1,
BUF_ID_FIRST = BUF_ID_UART,
- Buffer refactored to handle multibyte data. Code which was previously using buffer has been updated to work with the changes. API has also changed in accordance: int buf_set(unsigned resid, unsigned resnum, u8 logsize, size_t dsize); int buf_is_enabled( unsigned resid, unsigned resnum ); unsigned buf_get_size( unsigned resid, unsigned resnum ); unsigned buf_get_count( unsigned resid, unsigned resnum ); int buf_write( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); int buf_read( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); Essentially buf_rx_cb and buf_get_char have been renamed to buf_write and buf_read. For these, one now passes a pointer to where the data is coming from or going to, and a dsize parameter indicating how many bytes should be copied. Also, buf_set takes this same dsize parameter, and keeps it in the struct. This allows us to ensure that when data is read or written the number of bytes matches the buffer element size. I thought about maintaining compatibility functions to provide the original buf_rx_cb and buf_get_byte API calls, however there weren't a large number of uses of buf, so it wasn't hard to convert things. One caveat: BUF_MOD_INCR assumes that byte counts for alternate type sizes will be powers of 2. Also, BUF_SIZE_xx's are assumed to refer to element counts. - UART buffering enabled on LM3S This doesn't include switching the ADC code over to using these buffers quite yet. I'm open to comments on these modifications if theres a better or simpler approach. I've checked to make sure buffers work on LM3S, but I don't own any other platforms to make sure there aren't unintended side-effects.
2009-02-09 03:43:47 +00:00
BUF_ID_LAST = BUF_ID_ADC,
BUF_ID_TOTAL = BUF_ID_LAST - BUF_ID_FIRST + 1
};
// This structure describes a buffer
typedef struct
{
u8 logsize;
volatile u16 wptr, rptr, count;
t_buf_data *buf;
u8 logdsize;
} buf_desc;
// Buffer sizes (there are power of 2 to speed up modulo operations)
enum
{
BUF_SIZE_NONE = 0,
Fairly large number of changes in here to make adc work with lua's provided buf.c. The smoothing buffer is still kept separate from the main buffering system, but as samples come in via interrupt, they are placed into a "standard" elua buf. The size of this buf is configured according to whether one is grabbing a bunch of samples rapidly (burst), or singly in order to accommodate the expected number of incoming samples. If smoothing is enabled, incoming samples are claimed until the smoothing buffer is full, and then remaining samples are left in the main buffer until they are collected. This means that whether one is collecting single samples or samples at burst rate, and smoothing is enabled, the filter will only be providing samples that have enough history. Added a function to manually flush both smoothing and main buffers. This would be useful if you know your state has changed and you only want fresh samples that are going to be collected after a flush. Also, a lot of functionality moved into elua_adc.c and common.c (boundaries for what belongs where, might be evaluated), reducing the number of platform.c specific functions dramatically. Basic functionality seems to be working, but some more testing should be done. Also, given that there's now a dynamic buffer behind everything, a shift in the way sampling is handled could be done: sample and burst functions could be made to be non-blocking, and to never return anything except for errors. a separate getsamples function could be used for removing samples collected by either function from the buffer. Suggestions are welcome as it would be nice to keep usage paradigms stable after the 0.6 release.
2009-02-16 00:53:00 +00:00
BUF_SIZE_2,
BUF_SIZE_4,
BUF_SIZE_8,
BUF_SIZE_16,
BUF_SIZE_32,
BUF_SIZE_64,
BUF_SIZE_128,
BUF_SIZE_256,
BUF_SIZE_512,
BUF_SIZE_1024,
BUF_SIZE_2048,
BUF_SIZE_4096,
BUF_SIZE_8192,
BUF_SIZE_16384,
BUF_SIZE_32768
};
enum
{
BUF_DSIZE_U8 = 0,
BUF_DSIZE_U16,
BUF_DSIZE_U32
};
- Buffer refactored to handle multibyte data. Code which was previously using buffer has been updated to work with the changes. API has also changed in accordance: int buf_set(unsigned resid, unsigned resnum, u8 logsize, size_t dsize); int buf_is_enabled( unsigned resid, unsigned resnum ); unsigned buf_get_size( unsigned resid, unsigned resnum ); unsigned buf_get_count( unsigned resid, unsigned resnum ); int buf_write( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); int buf_read( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); Essentially buf_rx_cb and buf_get_char have been renamed to buf_write and buf_read. For these, one now passes a pointer to where the data is coming from or going to, and a dsize parameter indicating how many bytes should be copied. Also, buf_set takes this same dsize parameter, and keeps it in the struct. This allows us to ensure that when data is read or written the number of bytes matches the buffer element size. I thought about maintaining compatibility functions to provide the original buf_rx_cb and buf_get_byte API calls, however there weren't a large number of uses of buf, so it wasn't hard to convert things. One caveat: BUF_MOD_INCR assumes that byte counts for alternate type sizes will be powers of 2. Also, BUF_SIZE_xx's are assumed to refer to element counts. - UART buffering enabled on LM3S This doesn't include switching the ADC code over to using these buffers quite yet. I'm open to comments on these modifications if theres a better or simpler approach. I've checked to make sure buffers work on LM3S, but I don't own any other platforms to make sure there aren't unintended side-effects.
2009-02-09 03:43:47 +00:00
// Buffer API
int buf_set(unsigned resid, unsigned resnum, u8 logsize, u8 logdsize);
int buf_is_enabled( unsigned resid, unsigned resnum );
unsigned buf_get_size( unsigned resid, unsigned resnum );
unsigned buf_get_count( unsigned resid, unsigned resnum );
Fairly large number of changes in here to make adc work with lua's provided buf.c. The smoothing buffer is still kept separate from the main buffering system, but as samples come in via interrupt, they are placed into a "standard" elua buf. The size of this buf is configured according to whether one is grabbing a bunch of samples rapidly (burst), or singly in order to accommodate the expected number of incoming samples. If smoothing is enabled, incoming samples are claimed until the smoothing buffer is full, and then remaining samples are left in the main buffer until they are collected. This means that whether one is collecting single samples or samples at burst rate, and smoothing is enabled, the filter will only be providing samples that have enough history. Added a function to manually flush both smoothing and main buffers. This would be useful if you know your state has changed and you only want fresh samples that are going to be collected after a flush. Also, a lot of functionality moved into elua_adc.c and common.c (boundaries for what belongs where, might be evaluated), reducing the number of platform.c specific functions dramatically. Basic functionality seems to be working, but some more testing should be done. Also, given that there's now a dynamic buffer behind everything, a shift in the way sampling is handled could be done: sample and burst functions could be made to be non-blocking, and to never return anything except for errors. a separate getsamples function could be used for removing samples collected by either function from the buffer. Suggestions are welcome as it would be nice to keep usage paradigms stable after the 0.6 release.
2009-02-16 00:53:00 +00:00
int buf_write( unsigned resid, unsigned resnum, t_buf_data *data );
int buf_read( unsigned resid, unsigned resnum, t_buf_data *data );
void buf_flush( unsigned resid, unsigned resnum );
#endif