// // circularQueue.h // // Author(s): // Robert Stiles, KK5VD, Copyright (C) 2013, 2015 // Dave Freese, W1HKJ, Copyright (C) 2013 // // This file is part of FLAMP. // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #ifndef flamp_circular_queue_h #define flamp_circular_queue_h #include #include #include #include #include #include "util.h" #include "crc16.h" #define CQUE_HOLD 1 #define CQUE_RESUME 0 #define CQUE_SLEEP_TIME 10 #define TIME_SET 1 #define TIME_COUNT 2 class CircQueException : public std::exception { public: CircQueException(int err_ = 0) : err(err_), msg(err_to_str(err_)) { } CircQueException(const char* msg_) : err(1), msg(msg_) { } CircQueException(int err_, const std::string& prefix) : err(err_), msg(std::string(prefix).append(": ").append(err_to_str(err_))) { } virtual ~CircQueException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { return strerror(e); } int err; std::string msg; }; class Circular_queue { private: pthread_t thread; pthread_mutex_t mutex; pthread_cond_t condition; char *buffer; int buffer_size; int bufferCount; int exit_thread; int index_mask; int read_index; int stalled; int write_index; Ccrc16 crcValidate; public: int inhibitDataOut; int thread_running; int (* matchFound)(void *); int (* readData)(void *); void * (* queueParser)(void *); public: Circular_queue(void); Circular_queue(int po2, int (*_matchFound)(void *), \ int (*_readDataFrom)(void *), void * (*_queueParser)(void *)); ~Circular_queue(); public: bool timeOut(time_t &timeValue, time_t seconds, int attribute); int adjustReadQueIndex(int count); int lookAhead(char *_buffer, int _size); int lookAheadCRC(char *_buffer, int _size, unsigned int *crcVal, int *reset); int lookAheadForCharacter(char character, int *found); int lookAheadToTerminator(char *_buffer, char terminator, int maxLen); int queueStalled() { return stalled; } int readQueData(int buffer_count); int thread_exit() { return exit_thread; } void addToQueue(char *_buffer, int _size); void addToQueueNullFiltered(char *_buffer, int _size); void resumeQueue(); void signal(void); void sleep(int seconds, int milliseconds); void startDataOut(); void stopDataOut(); void stopQueue(); void milliSleep(int milliseconds) { sleep(0, milliseconds); } void setUp(int po2, int (*_matchFound)(void *), \ int (*_readDataFrom)(void *), void * (*_queueParser)(void *)); }; #endif // flamp_circular_queue_h