最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

ubuntu - Undefined reference error in multi environment Platformio project - Stack Overflow

programmeradmin0浏览0评论

OS: Ubuntu 22.04.4 LTS

PlatformIO: Core 6.1.16, Home 3.4.4

I have following src folder structure in my PlatformIO project:

-src
--arduino
---main.cpp
--esp32
---essentials.cpp
---main.cpp

the content of all the three files is as follows:

arduino/main.cpp:

#include<Arduino.h>
#define aggregationCount 10
#define sensorPin 5
#define devicePin 6
#define esp Serial1

String messageFromEsp, messageToEsp;

void setup(){
  pinMode(sensorPin,INPUT);
  pinMode(devicePin,OUTPUT);
  // Serial.begin(9600);
  esp.begin(9600);
  Serial.begin(9600);
  while(!Serial){}
  Serial.println("Serial began");
}
void loop(){
  if(esp.available()){
    messageFromEsp = messageToEsp = "";
    messageFromEsp = esp.readStringUntil('\n');
    Serial.print("esp:");
    Serial.println(messageFromEsp);
    if(messageFromEsp.indexOf("giveReading") == 0){
      messageToEsp = "reading:" + String(digitalRead(sensorPin));
      esp.println(messageToEsp);
      Serial.print("sent:");
      Serial.println(messageToEsp);
    }
    else if(messageFromEsp.indexOf("turnDeviceOn") == 0){
      digitalWrite(devicePin,HIGH);
      messageToEsp = "deviceIs:" + String("ON");
      esp.println(messageToEsp);
      Serial.print("sent:");
      Serial.println(messageToEsp);
    }
    else if(messageFromEsp.indexOf("turnDeviceOff") == 0){
      digitalWrite(devicePin,LOW);
      messageToEsp = "deviceIs:" + String("OFF");
      esp.println(messageToEsp);
      Serial.print("sent:");
      Serial.println(messageToEsp);
    }
    else{
      esp.println("invalid command");
    }
    while(esp.available())esp.read();
  }
}

esp32/essentials.cpp

#define ssid "Gondals"
#define password "GondalsRouter"
#define askArdTimeout 3000
#define arduino Serial2

ESPTelnet telnet;

IPAddress myIp(192,168,10,55);
IPAddress subnet(255,255,255,0);
IPAddress gateway(192,168,10,1);
IPAddress dns(192,168,10,1);

String message;

void onTelnetConnect(String ip);
void onTelnetDisconnect(String ip);
void onTelnetInput(String input);
void setupOTA();
void setupTelnet();

//helpingFunctions
void print(String inMessage){
  Serial.println(inMessage);
  telnet.println(inMessage);
}
String askArduino(String inMessage){
  // while(arduino.available())arduino.read();
  print("sent:" + inMessage);
  arduino.flush();
  arduino.println(inMessage);
  unsigned long int start = millis();
  while((!arduino.available()) && ((millis() - start) < askArdTimeout)){}

  message = "";
  message = arduino.readStringUntil('\n');
  print("message:" + message);
  // while(arduino.available())arduino.read();
  return message;
}

void onTelnetConnect(String ip){
  print("telnet connected from ip: " + ip);
}
void onTelnetDisconnect(String ip){
  print("telnet disconnected from ip: "+ip);
}
void onTelnetInput(String input){
  print("input received: "+input);
}
void setupOTA(){

  ArduinoOTA.onStart([]() {
    print("OTA Update started");
  });
  ArduinoOTA.onEnd([]() {
    print("OTA Update ended");
  });
  ArduinoOTA.onError([](ota_error_t error){
    print("OTA Error["+String(error)+"]");
    if (error == OTA_AUTH_ERROR) print("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) print("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) print("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) print("Receive Failed");
    else if (error == OTA_END_ERROR) print("End Failed");
  });

  ArduinoOTA.begin();
  print("OTA ready");
}
void setupTelnet(){
  if(telnet.begin(55555)){
    print("telnet began");
  }
  else{
    print("error in telnet");
  }
  telnet.onConnect(onTelnetConnect);
  telnet.onDisconnect(onTelnetDisconnect);
  telnet.onInputReceived(onTelnetInput);
}

esp32/main.cpp

#include <Arduino.h>
#include<ArduinoOTA.h>
#include<ESPTelnet.h>
#include"essentials.h"
#include<freertos/FreeRTOS.h>
#include<freertos/task.h>
// #include<ACS712.h>
#define aggregationCount 10
#define sensorPin 5
#define devicePin 6

enum status {OFF, ON, INVALID};
status deviceStatus = OFF, reading = OFF;
int result = 0, aggregation = 0;

int param = 5;
unsigned long int start = millis();

status changeDevState(status deviceStatus){
  String message = deviceStatus ? askArduino("turnDeviceOff") : askArduino("turnDeviceOn");
  print(String("ardResp:" + message));

  if(message.indexOf("deviceIs:" == 0)){
    message = message.substring(9);
    if(message.indexOf("ON") == 0)return ON;
    else if(message.indexOf("OFF") == 0)return OFF;
  }
  else print("invalid response");
  return INVALID;
}
void turnTheDevice(status statusIn){
  if(statusIn) deviceStatus = changeDevState(ON);
  else deviceStatus = changeDevState(OFF);

  if(deviceStatus)print("device ON");
  else print("device OFF");
}
status getReading(){
  message = "";
  message = askArduino("giveReading");
  print("ardResp:" + message);

  if(message.indexOf("reading:" == 0)){
    message = message.substring(8);
    if(message[0] == '0')return OFF;
    else if(message[0] == '1')return ON;
  }
  else print("invalid response");
  return INVALID;
}
void services(void *pvParamters){
  while(1){
    telnet.loop();ArduinoOTA.handle();
  }
}
void setup() {
  Serial.begin(9600);
  arduino.begin(9600);
  pinMode(2, OUTPUT);

  WiFi.mode(WIFI_AP_STA);
  //wireless services initializations
  if(!WiFi.config(myIp,gateway,subnet,dns)){
    print("static ip config failed");
  }
  WiFi.begin(ssid,password);
  while(WiFi.status() != WL_CONNECTED){
    digitalWrite(2, LOW);print(".");delay(500);
    digitalWrite(2, HIGH);print(".");delay(500);
    print(String(WiFi.status()));
  }

  setupTelnet();
  setupOTA();
  xTaskCreate(services,"services",4096,NULL,1,NULL);
}
void loop(){
  while(1){
    if(deviceStatus == OFF){
      do{
        reading = getReading();
        print(String(reading));
        delay(500);
      }while(!(reading == 1));
      
      turnTheDevice(ON);
    }
    else if(deviceStatus == ON){
      print("inside deviceON");
      result = 0;
      for(int m=0,end=aggregationCount*2;m<end;m++){
        reading = getReading();
        if((reading == 0) || (reading == 1)){
          result += reading;
        }
        delay(500);
        print(String(reading));
      }
      aggregation = (result*100)/(aggregationCount*2);
      print("aggregation:" + String(aggregation));
      if(aggregation < 25){
        turnTheDevice(OFF);
      }
    }
  }
}

and finally, the platformio.ini contents:

[env:megaatmega1280]
platform = atmelavr
board = megaatmega1280
framework = arduino
build_src_filter =  +<arduino/*> -<esp32/*>

and the error I am being faced with is:

/tmp/ccCoYnv2.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0xe0): undefined reference to `setup'
<artificial>:(.text.startup+0xe8): undefined reference to `loop'
collect2: error: ld returned 1 exit status
*** [.pio/build/megaatmega1280/firmware.elf] Error 1

What can be the issue?

发布评论

评论列表(0)

  1. 暂无评论