diff --git a/controller/mixercontroller_w5100_pio/src/main.cpp b/controller/mixercontroller_w5100_pio/src/main.cpp index 5a6c1fc..4c88a85 100644 --- a/controller/mixercontroller_w5100_pio/src/main.cpp +++ b/controller/mixercontroller_w5100_pio/src/main.cpp @@ -19,6 +19,13 @@ boolean srRead(uint8_t pbit); void srWrite(uint8_t pbit, boolean state); void callback(char* topic, byte* payload, unsigned int length); void sendData(); +void srShiftOut(); +void setMuteInt(uint8_t i); +void setSelectionInt(uint8_t i); +boolean getSelection(uint8_t pbit); +boolean getMute(uint8_t pbit); +void setSelectionChannel(uint8_t i, boolean state); +void setMuteChannel(uint8_t i, boolean state); #define LEDPIN 9 //PB1 = D9 = Pin15 Adafruit_NeoPixel leds = Adafruit_NeoPixel(9, LEDPIN, NEO_GRB + NEO_KHZ800); @@ -27,7 +34,7 @@ uint8_t wheelpos=0; #include "Ethernet.h" #include "PubSubClient.h" -boolean useethernet=false; +boolean useethernet=true; //Ethernet and MQTT String ip = ""; @@ -37,8 +44,10 @@ uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x06}; EthernetClient ethClient; PubSubClient mqttClient; -#define PUBLISH_DELAY 10000 + long last_send=0; +#define MQTTRECONNECTDELAY 5000 +unsigned long last_mqttreconnectattempt=0; @@ -66,6 +75,10 @@ long last_button_released=0; //last time button has been released (for debounce) #define SRDATA PD2 //D2 = PD2 uint16_t srbits=0; +#define NUMSELECTCHANNELS 8 +#define NUMMUTECHANNELS 8 + + #include Encoder volEnc(PIN_ENCA,PIN_ENCB); float encoderMultiplier=4.0; @@ -135,6 +148,7 @@ void setup() { Serial.println("Starting"); leds.begin(); + leds.clear(); for(uint8_t i=0;i MQTTRECONNECTDELAY) { + Serial.println("Reconnecting to mqtt"); + reconnect(); + last_mqttreconnectattempt=loopmillis; + } } mqttClient.loop(); } @@ -347,6 +369,7 @@ void loop() { int _motormove=0; //negative: move left, positive: move right. abs value: speed. 0 <= abs(_motormove) <= 255 potidifference_integral+=potidifference*motorI; + potidifference_integral=constrain(potidifference_integral,-MOTORI_ANTIWINDUP,MOTORI_ANTIWINDUP); //constrain _motormove=potidifference*motorP+potidifference_integral; motorspeed=constrain(abs(_motormove), 0,255); if (poti_read<=POT_MIN && _motormove<0) { //stop motor if soft endstops reached and wants to turn that way @@ -436,10 +459,11 @@ void sendData() { void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; //add end of string character + String spayload = String((char*)payload); Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] ");//MQTT_BROKER - for (int i = 0; i < length; i++) { + for (unsigned int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); @@ -449,19 +473,112 @@ void callback(char* topic, byte* payload, unsigned int length) { //if (strncmp((const char*)payload, "ON", 2) == 0) { //} - if (strncmp((const char*)topic, "audiomixer/main/volume/set",sizeof(topic)) == 0) { + //if (strncmp((const char*)topic, "audiomixer/volume/set",sizeof(topic)) == 0) { + if (String(topic).equals("audiomixer/volume/set")){ + //Serial.println("republish"); - String s = String((char*)payload); - Serial.print("Stringreceived="); - Serial.println(s); - float _floatvalue = s.toFloat(); + float _floatvalue = spayload.toFloat(); + _floatvalue=constrain(_floatvalue,0.0,100.0); + Serial.print("Volume string="); + Serial.println(spayload); Serial.print("setvalue="); Serial.println(_floatvalue); poti_set=constrain(map(_floatvalue,0.0,100.0,POT_MIN,POT_MAX),POT_MIN,POT_MAX); //set new poti position poti_reachedposition=false; //aim for new position - mqttClient.publish("audiomixer/main/volume", payload, length ); + + char pub_payload[8]; // Buffer big enough for 7-character float + dtostrf(_floatvalue, 1, 2, pub_payload); + mqttClient.publish("audiomixer/volume", pub_payload); + + }else if (String(topic).equals("audiomixer/mute/set")) { //withouth range + Serial.print("Mute string="); Serial.println(spayload); + uint16_t ipayload=spayload.toInt(); + if (spayload.equalsIgnoreCase("false")) { + setMuteInt(0); //all unmuted + }else if (spayload.equalsIgnoreCase("true")) { + setMuteInt(pow(2,NUMMUTECHANNELS)-1); //all muted + }else if (ipayload>=0 && ipayload<((uint16_t)1<=0 && ipayload<((uint16_t)1<>8); shiftOut(SRDATA, SRCLOCK, MSBFIRST, srbits); @@ -497,3 +617,33 @@ uint32_t Wheel(byte WheelPos) { WheelPos -= 170; return leds.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } + +void setMuteInt(uint8_t i) { + uint16_t mask=(( (uint16_t)1<<(NUMMUTECHANNELS))-1 )<