usbcan_gpio: both USB interfaces works; start adding GPIO functions

This commit is contained in:
Edward Emelianov
2026-03-07 14:37:42 +03:00
parent 760bec420b
commit fb8b93b0fe
9 changed files with 55 additions and 23 deletions

View File

@@ -19,6 +19,8 @@
#include <stm32f0.h>
#include "ringbuffer.h"
#define CHK(b) do{if(!b) return -1;}while(0)
static int datalen(ringbuffer *b){
if(b->tail >= b->head) return (b->tail - b->head);
else return (b->length - b->head + b->tail);
@@ -26,7 +28,9 @@ static int datalen(ringbuffer *b){
// stored data length
int RB_datalen(ringbuffer *b){
if(!b || b->busy) return -1;
CHK(b);
if(0 == datalen(b)) return 0; // don't block for empty RO operations
if(b->busy) return -1;
b->busy = 1;
int l = datalen(b);
b->busy = 0;
@@ -34,7 +38,7 @@ int RB_datalen(ringbuffer *b){
}
static int hasbyte(ringbuffer *b, uint8_t byte){
if(!b || b->head == b->tail) return -1; // no data in buffer
if(b->head == b->tail) return -1; // no data in buffer
int startidx = b->head;
if(b->head > b->tail){ //
for(int found = b->head; found < b->length; ++found)
@@ -53,7 +57,8 @@ static int hasbyte(ringbuffer *b, uint8_t byte){
* @return index if found, -1 if none or busy
*/
int RB_hasbyte(ringbuffer *b, uint8_t byte){
if(!b || b->busy) return -1;
CHK(b);
if(b->busy) return -1;
b->busy = 1;
int ret = hasbyte(b, byte);
b->busy = 0;
@@ -91,7 +96,10 @@ static int read(ringbuffer *b, uint8_t *s, int len){
* @return bytes read or -1 if busy
*/
int RB_read(ringbuffer *b, uint8_t *s, int len){
if(!b || b->busy || !s || len < 1) return -1;
CHK(b);
if(!s || len < 1) return -1;
if(0 == datalen(b)) return 0;
if(b->busy) return -1;
b->busy = 1;
int r = read(b, s, len);
b->busy = 0;
@@ -124,7 +132,10 @@ static int readto(ringbuffer *b, uint8_t byte, uint8_t *s, int len){
* @return amount of bytes written (negative, if len<data in buffer or buffer is busy)
*/
int RB_readto(ringbuffer *b, uint8_t byte, uint8_t *s, int len){
if(!b || b->busy) return -1;
CHK(b);
if(!s || len < 1) return -1;
if(0 == datalen(b)) return 0;
if(b->busy) return -1;
b->busy = 1;
int n = 0;
if(s && len > 0){
@@ -137,7 +148,9 @@ int RB_readto(ringbuffer *b, uint8_t byte, uint8_t *s, int len){
}
int RB_datalento(ringbuffer *b, uint8_t byte){
if(!b || b->busy) return -1;
CHK(b);
if(0 == datalen(b)) return 0;
if(b->busy) return -1;
b->busy = 1;
int n = lento(b, byte);
b->busy = 0;
@@ -167,7 +180,10 @@ static int write(ringbuffer *b, const uint8_t *str, int l){
* @return amount of bytes written or -1 if busy
*/
int RB_write(ringbuffer *b, const uint8_t *str, int l){
if(!b || b->busy || !str || l < 1) return -1;
CHK(b);
if(!str || l < 1) return -1;
if(b->length - datalen(b) < 2) return 0;
if(b->busy) return -1;
b->busy = 1;
int w = write(b, str, l);
b->busy = 0;
@@ -176,10 +192,12 @@ int RB_write(ringbuffer *b, const uint8_t *str, int l){
// just delete all information in buffer `b`
int RB_clearbuf(ringbuffer *b){
if(!b || b->busy) return -1;
CHK(b);
if(b->busy) return -1;
b->busy = 1;
b->head = 0;
b->tail = 0;
bzero(b->data, b->length);
b->busy = 0;
return 1;
}