-
Notifications
You must be signed in to change notification settings - Fork 22
/
slimproto.h
286 lines (215 loc) · 6.89 KB
/
slimproto.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
#ifndef slimproto_h
#define slimproto_h
//#define ADAFRUIT_VS1053
#ifdef ESP32
#define RINGBFSIZ 100000
#else
#define RINGBFSIZ 20000
#endif
#include "config.h"
#include <Arduino.h>
#include "stRingBuffer.h"
#include <math.h>
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#ifdef VS1053_MODULE
#ifdef ADAFRUIT_VS1053
#include <Adafruit_VS1053.h>
#else
#include <VS1053.h>
#endif
#endif //VS1053_MODULE
#ifdef I2S_DAC_MODULE
#include "AudioFileSourceICYStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioGeneratorFLAC.h"
#include "AudioOutputI2SNoDAC.h"
#endif
struct __attribute__((packed)) StrmStructDef
{
byte command;
byte autostart;
byte formatbyte;
byte pcmsamplesize;
byte pcmsamplerate;
byte pcmchannels;
byte pcmendian;
byte threshold;
byte spdif_enable;
byte trans_period;
byte trans_type;
byte flags;
byte output_threshold;
byte RESERVED;
u32_t replay_gain;
byte server_port[2];
byte server_ip[4];
};
struct __attribute__((packed)) audg_packet {
char opcode[4];
u32_t old_gainL; // unused
u32_t old_gainR; // unused
u8_t adjust;
u8_t preamp; // unused
u32_t gainL;
u32_t gainR;
// squence ids - unused
};
class responseBase
{
public :
responseBase(WiFiClient * pClient);
~responseBase();
virtual void sendResponse() = 0;
protected :
struct stResponse{
byte command[4];
long sizeResponse = 1;
};
WiFiClient * vcClient;
stResponse vcResponse;
};
class reponseHelo : public responseBase {
public :
reponseHelo(WiFiClient * pClient);
void sendResponse();
private :
// H E L 0 { SIZE } {ID} {REV} { MAC ADDRESS } { UUID }{ WLAN CHANNEL} { BYTE RECEIVED ??? }{LANGUAGE}
// const unsigned char helo[] = {0x48,0x45,0x4c,0x4f ,0x00,0x00,0x00,0x24,0x08, 0x0b ,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x4e};
/*
struct HELO_packet {
char opcode[4] = {0x48,0x45,0x4c,0x4f};
u32_t length;
u8_t deviceid = 0x08;
u8_t revision = 0x0b;
u8_t mac[6] = {0x00,0x00,0x00,0x00,0x00,0x01};
u8_t uuid[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
u16_t wlan_channellist = 0;
u32_t bytes_received_H, bytes_received_L = 0;
char lang[2] = {0x45,0x4e};
// u8_t capabilities[];
};
*/
struct __attribute__((packed)) stResponse
{
byte command[4] = {0x48,0x45,0x4c,0x4f}; // HELO
long sizeResponse ;
char diviceID = 0x08;
char firmwareRevision = 0x0b;
byte macAddr[6] = {0x00,0x00,0x00,0x00,0x00,0x01};
byte uuid[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
byte wlanChannel[2] = {0x00,0x00};
byte receivedData[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
byte language[2] = {0x45,0x4e};
char capabilites[92] = "Model=squeezeesp,ModelName=SqueezeEsp,Firmware=7,ogg,flc,pcm,mp3,SampleRate=44100,HasPreAmp";
};
stResponse vcResponse;
};
class reponseSTAT : public responseBase {
public :
reponseSTAT(WiFiClient * pClient);
void sendResponse();
private :
struct __attribute__((packed)) STAT_packet {
char opcode[4] = {0x53,0x54,0x41,0x54}; // STAT
u32_t sizeResponse;
//u32_t event;
char event[4];
u8_t num_crlf;
u8_t mas_initialized;
u8_t mas_mode;
u32_t stream_buffer_size;
u32_t stream_buffer_fullness;
u32_t bytes_received_H;
u32_t bytes_received_L;
u16_t signal_strength;
u32_t jiffies;
u32_t output_buffer_size;
u32_t output_buffer_fullness;
u32_t elapsed_seconds;
u16_t voltage;
u32_t elapsed_milliseconds;
u32_t server_timestamp;
u16_t error_code;
};
public :
STAT_packet vcResponse;
};
typedef struct StrmStructDef StrmStruct;
typedef struct audg_packet AudgStruct;
class slimproto
{
public:
#ifdef VS1053_MODULE
#ifdef ADAFRUIT_VS1053
slimproto(String pAdrLMS, WiFiClient pClient, Adafruit_VS1053 * pPlayer);
#else
slimproto(String pAdrLMS,WiFiClient * pClient, VS1053 * pPlayer);
#endif
#endif
slimproto(String pAdrLMS, WiFiClient * pClient);
~slimproto();
/**
* Read message from socket and push them in a local buffer
**/
int HandleMessages();
int HandleAudio();
private:
stRingBuffer * vcRingBuffer;
//stRingBuffer * vcCommandRingBuf;
String vcAdrLMS;
int _pin;
String vcBufferInput;
int vcCommandSize;
// uint8_t* ringbuf ; // Ringbuffer for VS1053
unsigned long StartTimeCurrentSong = 0;
unsigned long EndTimeCurrentSong = 0;
uint32_t ByteReceivedCurrentSong = 0;
unsigned long TimeCounter = 0;
unsigned long LastStatMsg = 0;
void HandleCommand(byte pCommand [], int pSize);
void HandleStrmQCmd(byte pCommand [], int pSize);
void HandleStrmTCmd(byte pCommand [], int pSize);
void HandleStrmSCmd(byte pCommand [], int pSize);
void HandleStrmPCmd(byte pCommand [], int pSize);
void HandleStrmUCmd(byte pCommand [], int pSize);
void HandleAudgCmd(byte pCommand [], int pSize);
void ExtractCommand(byte * pBuf, int pSize);
void ByteArrayCpy(byte * pDst, byte * pSrv, int pSize);
void PrintByteArray(byte * psrc, int pSize);
void PrintByteArray(String psrc, int pSize);
void PrintHex8(uint8_t *data, uint8_t length);
u32_t unpackN(u32_t *src);
u16_t unpackn(u16_t *src);
WiFiClient * vcClient; // Client to handle control messages
WiFiClient vcStreamClient; // Client to handle audio stream
/*
#define VS1053_CS D1 (1)
#define VS1053_DCS D0 (3)
#define VS1053_DREQ D3 (5)
*/
#ifdef VS1053_MODULE
#ifdef ADAFRUIT_VS1053
Adafruit_VS1053 * vcplayer;
#else
VS1053 * vcplayer;
#endif
#endif
#ifdef I2S_DAC_MODULE
AudioGenerator * vcDacAudioGen = 0;
AudioFileSourceICYStream * vcDacFile = 0;
AudioFileSourceBuffer * vcDacBuff = 0;
AudioOutputI2S * vcDacOut = 0;
#endif
enum player_status {
StopStatus,
PlayStatus,
PauseStatus
};
player_status vcPlayerStat = StopStatus ; /* 0 = stop , 1 = play , 2 = pause */
};
#endif