Files
snapclient/components/protocol/protocol.c
Carlos 7b24787e73 - major change, use lwip netconn instead of socket API to reduce RAM footprint
o flac works, opus and pcm are untested and not working
- improve on resyncing issues
- add wifi logger component submodule
- optimize stack sizes
2021-10-16 22:07:37 +02:00

234 lines
6.8 KiB
C

// MADIF protocol handler
// Read incomming messeage from queue and do the work
// Protocol description
/*
0 Interface functions
Scan clients on i2c bus.
Get host system (ESP32, RPI, Cypress)
Select audio source (Snapcast, RTPrx, Bluetooth, Signal generator)
Enable DSP processing
1 Device communication I2C
2 GPIO manipulation
3 Audio generator
4 Telemetri subsystem
5 Test function
6 RTPrx module
7 DSP processor configuration
*/
#include "esp_log.h"
#include "esp_system.h"
#include "esp_types.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "stdint.h"
//#include "MerusAudio.h"
#include "dsp_processor.h"
#include "i2s.h"
#include "protocol.h"
#include "rtprx.h"
extern enum dspFlows dspFlow;
xQueueHandle prot_queue;
// Protcol format
// Byte 0 1 2 3 4 ...
// Cont: Function length subCommand data <data> ...
enum audio_sources
{
SNAPCAST,
RTPRX,
BLUETOOTH,
SIGNALGENERATOR
};
static const char TAG[] = "PROT";
static uint8_t audio_source;
extern uint8_t muteCH[4];
void
protocolHandlerTask (void *pvParameter)
{
audio_source = 1;
ESP_LOGI (TAG, "Protocol handler started");
while (1)
{
uint8_t *msg;
xQueueReceive (prot_queue, &msg, portMAX_DELAY);
// ESP_LOGI(TAG,"Recieved message %d length %d",*(msg),*(msg+1));
switch (*msg)
{
case 0: // Interface functions
switch (*(msg + 2))
{
case 0:
{
ESP_LOGI (TAG, "Change Source to : %d\n", (int)*(msg + 3));
if (audio_source != *(msg + 3))
{
if (audio_source == SNAPCAST)
{
i2s_custom_zero_dma_buffer (0);
// Not implemnted do nothing
}
else if (audio_source == RTPRX)
{
ESP_LOGI (TAG, "Stop RTPrx");
rtp_rx_stop ();
}
else if (audio_source == BLUETOOTH)
{ // Not implemnted do nothing
}
else if (audio_source == SIGNALGENERATOR)
{ // signalgenerator_stop();
ESP_LOGI (TAG, "Stop generator");
}
}
audio_source = *(msg + 3);
switch (audio_source)
{
case SNAPCAST:
break;
case RTPRX:
{
ESP_LOGI (TAG, "Start RTPrx");
rtp_rx_start ();
}
break;
case BLUETOOTH:
break;
// case SIGNALGENERATOR : { ESP_LOGI(TAG,"Start signal ");
// signalgenerator_start();
// }
// break;
default:
break;
}
}
break;
case 1:
{
ESP_LOGI (TAG, "Measure system PVDD");
}
break;
case 2:
{
ESP_LOGI (TAG, "Scan i2s bus...");
}
break;
default:
break;
}
break;
case 1: // Device communication // Fuse and otp decoding
switch (*(msg + 2))
{
case 0: // Byte read
{
uint8_t value = 0; // ma_read_byte( *(msg+3), *(msg+4),
// (*(msg+5)<<8)+*(msg+6) ) ;
printf ("Value read : %d\n", value);
// return value to sender
break;
}
case 1:
{ // Byte write
// ma_write_byte(*(msg+3),*(msg+4),(*(msg+5)<<8)+*(msg+6),*(msg+7)
// );
printf ("i2c_write : \n");
break;
}
case 3:
{
uint8_t l = (*(msg + 1) - 7);
uint8_t *writebuf;
// ESP_LOGI(TAG,"I2C write block : %d\n",*(msg+7));
writebuf = malloc (l);
for (int8_t i = 0; i < l; i++)
writebuf[i] = *(msg + 7 + i);
// ma_write(*(msg+3),*(msg+4),(*(msg+5)<<8)+*(msg+6),writebuf,l);
break;
}
default:
break;
}
break;
case 2: // GPIO
break;
/*case 3 : // Signal Generator
switch (*(msg+2)) {
case 0: // Stop generator
signalgenerator_stop();
ESP_LOGI(TAG, "Stop_SignalGenerator
:%d",*(msg+2)); break; case 1: // Start generator
signalgenerator_start();
ESP_LOGI(TAG, "Start_SignalGenerator
:%d",*(msg+2)); break; case 2: // Change Mode :
signalgenerator_mode(*(msg+3)); // cont,
sweep, burst ESP_LOGI(TAG, "SignalGenerator change mode
:%d",*(msg+3)); break; case 3: // Change Oscillator Type : // Sine,
tri, square, noise signalgenerator_osctype(*(msg+3)); ESP_LOGI(TAG,
"SignalGenerator change oscType :%d",*(msg+3)); break; case 4:
signalgenerator_freq(*(msg+3),*(msg+4),*(msg+5)); // freq int >> 4
break;
default : break;
}
break;
*/
case 4:
break;
case 5:
break;
case 6: // RTPrx
switch (*(msg + 2))
{
case 0: // Stop RX reciever
rtp_rx_stop ();
break;
case 1: // Start Rx reciever
rtp_rx_start ();
break;
default:
break;
}
break;
case 7: // DSP
switch (*(msg + 2))
{
case 0: // Bypass 0 or 1 or 2
dspFlow = (int)*(msg + 3);
break;
case 1: // Change Xover frequency
// dsp_set_xoverfreq(*(msg+3),*(msg+4));
break;
case 99:
{
uint8_t ch = *(msg + 3);
uint8_t state = *(msg + 4);
printf ("Mute %d %d\n", ch, state);
if ((ch <= 1) & (state <= 1))
{
muteCH[ch] = state;
}
}
break;
default:
break;
}
break;
default:
break;
}
free (msg);
}
}