MightyHat Sketch Compile Issues [SOLVED]

Started by G550_Pilot, May 04, 2020, 08:47:37 PM

G550_Pilot

Hey Everyone -

I have been running several mightyhats and needed to update one of my sketches and I am now getting an error trying to compile. I did the normal 'google search' route but did not come up with anything. I was hoping someone here has seen this before.

Thanks

Arduino: 1.8.12 (Mac OS X), Board: "MightyHat"

libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `readSerialLine(char*, char, unsigned char, unsigned int)'
libraries/RFM69/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `BYTEfromHEX(char, char)'
libraries/RFM69/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `validateHEXData(void*, unsigned char)'
libraries/RFM69/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `prepareSendBuffer(char*, unsigned char*, unsigned char, unsigned int)'
libraries/RFM69/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `PrintHex83(unsigned char*, unsigned char)'
libraries/RFM69/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board MightyHat.

G550_Pilot

OK, so I have tried the following to resolve this issue:

1) Moved to another OSX system
2) Reinstalled Arduino and reinstalled the LowPowerLabs libraries (although could not find the wireless libraries on github, just a windows exe so I reused the old ones that I had)
3) Installed Ubuntu 20.04LTS, installed Arduino, updated libraries and board defs. Still same error:

Arduino: 1.8.12 (Linux), Board: "MightyHat"

libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `readSerialLine(char*, char, unsigned char, unsigned int)'
libraries/RFM69_LowPowerLab/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `BYTEfromHEX(char, char)'
libraries/RFM69_LowPowerLab/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `validateHEXData(void*, unsigned char)'
libraries/RFM69_LowPowerLab/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `prepareSendBuffer(char*, unsigned char*, unsigned char, unsigned int)'
libraries/RFM69_LowPowerLab/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
libraries/WirelessHEX69/WirelessHEX69.cpp.o (symbol from plugin): In function `readSerialLine(char*, char, unsigned char, unsigned int)':
(.text+0x0): multiple definition of `PrintHex83(unsigned char*, unsigned char)'
libraries/RFM69_LowPowerLab/RFM69_OTA.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board MightyHat.

Felix

1.8.12 compiles fine on Windows.
The errors you get seem to indicate it doesnt like that you also have the old WirelessHEX69 library side by side with the new RFM69_OTA. Try removing wirelesshex69 and see if you make progress.

G550_Pilot

Actually I was just coming back here to post that I had success. But it took going back to your old Github branch for the wireless and seeing the note about using RFM69_OTA.h instead of WirelessHEX69.h which I had not done since it has been several years since having to update my MightyHats.

so changing this:
#include <WirelessHEX69.h>

to this:
#include <RFM69_OTA.h>


immediately solved the problem!


As a side note, as part of my troubleshooting, I downloaded your latest MightyHat.ino and I noticed it looks like it no longer looks for serial messages from the Pi. Is that correct, or am I just missing it somewhere? I use that to send data to the LCD screens so I was just wondering.

Thanks!


Felix

Latest sketch is like the old one + a bunch of other functionality.
Yes it looks for serial data from Pi.

G550_Pilot

#5
OK, I was taking a look at it and didn't see where. In the old sketch, I did this:

if (inputstr.equals("START_OK")) { sprintf(lcdbuff, "PFC\nStart OK!"); refreshLCD(); saveToHistory(lcdbuff, rssi); }

in this section:
void handleSerialInput()

Where would I put it in the new sketch?

I see this in the new sketch:

void handleSerialData()

but not sure how to add:
if (inputstr.equals("START_OK")) { sprintf(lcdbuff, "PFC\nStart OK!"); refreshLCD(); saveToHistory(lcdbuff, rssi); }

to it. My attempts failed :-)

Felix

You want something like this:

if (strcmp(data, "START_OK")==0) {
        Pbuff="";
        Pbuff << "START_OK";
        saveToHistory(buff, 0);
        refreshLCD();
}

G550_Pilot

Got it, and this would be in the:

void handleSerialData()

section?

Felix

I suppose so, where all other string comparisons are made.

G550_Pilot

Thanks, I'll play around with trying to make it work!

G550_Pilot

Hi Felix -

Sorry to be a bother. I tried a few different ways and I can't get it compile, can you give me an example in the current code below where exactly I would add in all of the serial stuff...? I would greatly appreciate it. C is not my best forte...

I have about 20 things I need to watch for to update the LCD.

Thanks :-)



if (strcmp(data, "START_OK")==0) {
        Pbuff="";
        Pbuff << "START_OK";
        saveToHistory(buff, 0);
        refreshLCD();
}



// here's the processing of single char/bytes as soon as they're coming from UART
void handleSerialData() {
  static char input_line[100]; //static = these get allocated ONCE!
  static byte input_pos = 0;
  if(Serial.available() > 0)
  {
    char inByte = Serial.read();
    switch (inByte)
    {
      case '\r':   //ignore carriage return
        break;

      case '\n':
        if (input_pos==0) break;       // ignore empty lines
        input_line[input_pos] = 0;     // null terminate the string
        DEBUG("DEBUG:handleSerialData:");
        DEBUGln(input_line);
        processCommand(input_line);        // fill up queue
        input_pos = 0; // reset buffer for next time
        break;

      default:
        // keep adding if not full ... allow for terminating byte
        if (input_pos < MAX_BUFFER_LENGTH-1) {
          input_line[input_pos] = inByte;
          input_pos++;
        } else {
          // if theres no EOL coming before MAX_BUFF_CHARS is exceeded we'll just terminate and send it, last char is then lost
          input_line[input_pos] = 0;    // null terminate the string
          DEBUG("DEBUG:MAX_BUFF_CHARS is exceeded - attempting to add (default): ");
          DEBUGln(input_line);
          processCommand(input_line);  //add to queue
          input_pos = 0; //reset buffer for next line
        }
        break;
    }
  }
}

Felix

Look for this piece of code:

  if (strcmp(data, "FREERAM")==0)
    Serial << F("FREERAM:") << freeRAM() << ':' << RAMSIZE << endl;
  if (strcmp(data, "REQUESTQUEUE")==0)
    printQueue(queue);
  if (strcmp(data, "SYSFREQ")==0)
    Serial << F("SYSFREQ:") << radio.getFrequency() << endl;
  if (strcmp(data, "UPTIME")==0)
    Serial << F("UPTIME:") << millis() << endl;
  if (strcmp(data, "BEEP")==0) Beep(5, false);
  if (strcmp(data, "BEEP2")==0) Beep(10, false);
  if (strcmp(data, "ENCRYPTKEY")==0)
#ifdef ENCRYPTKEY
    Serial << F("ENCRYPTKEY:") << ENCRYPTKEY << endl;
#else
    Serial << F("ENCRYPTKEY:NONE") << endl;
#endif


Add your code somewhere in there:

  if (strcmp(data, "FREERAM")==0)
    Serial << F("FREERAM:") << freeRAM() << ':' << RAMSIZE << endl;
  if (strcmp(data, "REQUESTQUEUE")==0)
    printQueue(queue);
  if (strcmp(data, "SYSFREQ")==0)
    Serial << F("SYSFREQ:") << radio.getFrequency() << endl;
  if (strcmp(data, "UPTIME")==0)
    Serial << F("UPTIME:") << millis() << endl;
  if (strcmp(data, "BEEP")==0) Beep(5, false);
  if (strcmp(data, "BEEP2")==0) Beep(10, false);
  if (strcmp(data, "ENCRYPTKEY")==0)
#ifdef ENCRYPTKEY
    Serial << F("ENCRYPTKEY:") << ENCRYPTKEY << endl;
#else
    Serial << F("ENCRYPTKEY:NONE") << endl;
#endif
  if (strcmp(data, "START_OK")==0) {
        Pbuff="";
        Pbuff << "START_OK";
        saveToHistory(buff, 0);
        refreshLCD();
  }

G550_Pilot