mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef CRUNCH_H
 | |
| #define CRUNCH_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #include <stdint.h>
 | |
| 
 | |
| /* To save bandwidth, we compress the byte stream from the sampler when
 | |
|  * sending it over USB. The encoding used is:
 | |
|  * 
 | |
|  * 0nnn.nnnn: value 0x00..0x7f
 | |
|  * 11nn.nnnn: value 0x80 then 0x00..0x3f
 | |
|  * 10n      : value 0x80|n
 | |
|  *
 | |
|  * The end of the buffer is terminated with zeroes, which are ignored
 | |
|  * (not written to the output).
 | |
|  * 
 | |
|  * This saves ~40%, which gets us in under the bandwidth cap.
 | |
|  */
 | |
|     
 | |
| typedef struct crunch_state_t
 | |
| {
 | |
|     const uint8_t* inputptr;
 | |
|     uint32_t inputlen;
 | |
|     uint8_t* outputptr;
 | |
|     uint32_t outputlen;
 | |
|     uint32_t fifo;
 | |
|     uint8_t fifolen;
 | |
| 	bool haspending;
 | |
| 	uint8_t pendingbyte;
 | |
| }
 | |
| crunch_state_t;
 | |
| 
 | |
| /* Crunches as much as possible and then stops. */
 | |
| extern void crunch(crunch_state_t* state);
 | |
| extern void donecrunch(crunch_state_t* state);
 | |
| 
 | |
| /* Uncrunches as much as possible and then stops. */
 | |
| extern void uncrunch(crunch_state_t* state);
 | |
| extern void doneuncrunch(crunch_state_t* state);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 |