#undef DEBUG_GPS #include "M5Atom.h" #include "GPSAnalyse.h" #include "fsutils.h" #include #include #include #include "config.h" #include #include #include #include WiFiUDP Udp; const IPAddress destination(192, 168, 8, 200); const unsigned int rxport = 54321; // listen port const unsigned int txport = 12345; // send to port //char payload[512]; String payload = ""; GPSAnalyse GPS; Metro banggps(2000); Metro bangimu(33); // 30 fps Metro banglog(1000); bool sdready = false; bool recording = false; String outfn; typedef struct sGps { float lat; float lon; String utc; } tGps; typedef struct sImu { // accelerometer float aX = 0.0f; float aY = 0.0f; float aZ = 0.0f; // gyroscope float gX = 0.0f; float gY = 0.0f; float gZ = 0.0f; // angles float pitch = 0.0f; float roll = 0.0f; float yaw = 0.0f; float temp = 0.0f; } tImu; unsigned long mselapsed; tGps gpssample; tImu imusample; String filename_make_sequential() { char fn[24]; for (int n = 1; n < 1000; n++) { sprintf(fn, "/wavesample__%.3d.csv", n); if ( SD.exists(fn) ) { continue; } else { break; } } return String(fn); } bool sample_write(String filename) { File of = SD.open(filename, FILE_APPEND); if(of) { of.print( mselapsed ); of.print(", "); of.print(gpssample.lat); of.print(", "); of.print(gpssample.lon); // of.print(", "); // of.print(gpssample.utc); of.print(", "); of.print(imusample.aX); of.print(", "); of.print(imusample.aY); of.print(", "); of.print(imusample.aZ); of.print(", "); of.print(imusample.gX); of.print(", "); of.print(imusample.gY); of.print(", "); of.print(imusample.gZ); of.print(", "); of.print(imusample.pitch); of.print(", "); of.print(imusample.roll); of.print(", "); of.print(imusample.yaw); of.print(", "); of.print(imusample.temp); of.println(); // EOL of.close(); } else { Serial.println("Failed to write sample to SD card"); return false; } return true; } bool sdcard_init() { Serial.print("SDcard init..."); SPI.begin(23, 33, 19, -1); if( !SD.begin(-1, SPI) ) { Serial.println("SD card mount failed"); return false; } uint8_t cardType = SD.cardType(); if(cardType == CARD_NONE){ Serial.println("No SD card attached"); return false; } Serial.print("SD Card Type: "); if(cardType == CARD_MMC){ Serial.println("MMC"); } else if(cardType == CARD_SD){ Serial.println("SDSC"); } else if(cardType == CARD_SDHC){ Serial.println("SDHC"); } else { Serial.println("UNKNOWN"); } uint64_t cardSize = SD.cardSize() / (1024 * 1024); Serial.printf("SD Card Size: %lluMB\n", cardSize); dir_list(SD, "/", 0); return true; } void setup(){ M5.begin(true, false, true); M5.IMU.Init(); delay(100); // connect to existing wifi access point as client if( wifi_connect_as_client(WIFI_SSID, WIFI_PASSWORD) ) { // print debugging information wifi_print_mode(); wifi_print_ip(); // print our known ip address } else { Serial.print("Failed to connect to wifi "); Serial.print( WIFI_SSID ); Serial.println(); } Udp.begin(rxport); Serial.print("Listening on port "); Serial.println(rxport); sdready = sdcard_init(); delay(500); outfn = filename_make_sequential(); Serial1.begin(9600,SERIAL_8N1,22,-1); GPS.setTaskName("GPS"); GPS.setTaskPriority(2); GPS.setSerialPtr(Serial1); GPS.start(); M5.dis.fillpix(0x000000); } void gps_loop() { GPS.upDate(); gpssample.lat = GPS.s_GNRMC.Latitude; gpssample.lon = GPS.s_GNRMC.Longitude; gpssample.utc = GPS.s_GNRMC.Utc; } void imu_loop() { //Stores the triaxial gyroscope data of the inertial sensor to the relevant variable M5.IMU.getGyroData(&imusample.gX,&imusample.gY,&imusample.gZ); M5.IMU.getAccelData(&imusample.aX,&imusample.aY,&imusample.aZ); // accelero M5.IMU.getAhrsData(&imusample.pitch,&imusample.roll,&imusample.yaw); // attitude M5.IMU.getTempData(&imusample.temp); // temperature } void sample_debug() { Serial.print( outfn ); Serial.print(", "); Serial.print( mselapsed ); Serial.print(", "); Serial.print(gpssample.lat); Serial.print(", "); Serial.print(gpssample.lon); // Serial.print(", "); // Serial.print(gpssample.utc); Serial.print(", "); Serial.print(imusample.aX); Serial.print(", "); Serial.print(imusample.aY); Serial.print(", "); Serial.print(imusample.aZ); Serial.print(", "); Serial.print(imusample.gX); Serial.print(", "); Serial.print(imusample.gY); Serial.print(", "); Serial.print(imusample.gZ); Serial.print(", "); Serial.print(imusample.pitch); Serial.print(", "); Serial.print(imusample.roll); Serial.print(", "); Serial.print(imusample.yaw); Serial.print(", "); Serial.print(imusample.temp); Serial.println(); // EOL } void sample_osc_dispatch() { payload = ""; payload.concat(mselapsed); payload.concat(", "); payload.concat(gpssample.lat); payload.concat(", "); payload.concat(gpssample.lon); payload.concat(", "); payload.concat(imusample.aX); payload.concat(", "); payload.concat(imusample.aY); payload.concat(", "); payload.concat(imusample.aZ); payload.concat(", "); payload.concat(imusample.gX); payload.concat(", "); payload.concat(imusample.gY); payload.concat(", "); payload.concat(imusample.gZ); payload.concat(", "); payload.concat(imusample.pitch); payload.concat(", "); payload.concat(imusample.roll); payload.concat(", "); payload.concat(imusample.yaw); // sprintf(payload, "%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s\0", // mselapsed, // dtostrf(gpssample.lat), // dtostrf(gpssample.lon), // dtostrf(imusample.aX), // dtostrf(imusample.aY), // dtostrf(imusample.aZ), // dtostrf(imusample.gX), // dtostrf(imusample.gY), // dtostrf(imusample.gZ), // dtostrf(imusample.pitch), // dtostrf(imusample.roll), // dtostrf(imusample.yaw), // dtostrf(imusample.temp) // ); //Serial.println( payload ); // these two lines craft the message (with an address and a parameter) OSCMessage out("/wavesampler/sample"); // out.add( payload ); out.add(1.0f*mselapsed); out.add(gpssample.lat); out.add(gpssample.lon); out.add(imusample.aX); out.add(imusample.aY); out.add(imusample.aZ); out.add(imusample.gX); out.add(imusample.gY); out.add(imusample.gZ); out.add(imusample.pitch); out.add(imusample.roll); out.add(imusample.yaw); // these 4 lines that follow send out the message Udp.beginPacket(destination, txport); out.send(Udp); Udp.endPacket(); out.empty(); } void osc_route_sample(OSCMessage &msg, int addrOffset ) { if( msg.match("/sample/start") ) { outfn = filename_make_sequential(); Serial.print("() Start recording to file "); Serial.print(outfn); Serial.println("..."); recording = true; } else if( msg.match("/sample/stop") ) { Serial.println("[] STOP recording..."); recording = false; } } void osc_message_pump() { OSCMessage in; int size; if( (size = Udp.parsePacket()) > 0) { // parse incoming OSC message while(size--) { in.fill( Udp.read() ); } if(!in.hasError()) { // if we had never received a message before, make sure we set the flag to avoid triggering 'demo mode' //if(!msgReceived) { msgReceived = true; } // Serial.print("<< osc message received"); in.route("/sample", osc_route_sample); } } // if } void loop() { // M5.dis.fillpix(0x000000); osc_message_pump(); if(banggps.check()) { gps_loop(); } if(bangimu.check()) { imu_loop(); if( recording ) { sample_write( outfn ); } //sample_osc_dispatch(); } // if(banglog.check()) { // sample_debug(); // } mselapsed = millis(); }