diff --git a/Source/FsLink.cpp b/Source/FsLink.cpp index a1a0ef6..aac0ef8 100644 --- a/Source/FsLink.cpp +++ b/Source/FsLink.cpp @@ -9,6 +9,7 @@ #define TWO_PWR_16 (65536.0) #define TWO_PWR_32 (TWO_PWR_16*TWO_PWR_16) +#define TIMER_INTEVAL_MS 100 const char* FsLink::linkStateString[] = {"Init", "Disconnected", "Connected", "Paused", "Recording"}; const char* FsLink::flightStateString[] = {"Init", "Suspend", "Ground", "Take off", "Enroute", "Touch down"}; @@ -23,7 +24,7 @@ FsLink::FsLink(const char *pDocRoot) , m_kmlUpdateInterval(10) , m_kmlUpdateCount(0) { - startTimer(100); + startTimer(TIMER_INTEVAL_MS); } FsLink::FsLink(const FsLink& orig) @@ -45,6 +46,11 @@ void FsLink::setKml(IKml *pKml) m_pKml = pKml; } +void FsLink::setUpdateInterval(double seconds) +{ + m_kmlUpdateInterval = (int)(1000*seconds/TIMER_INTEVAL_MS + 0.5); +} + bool FsLink::open() { unsigned long result; @@ -310,7 +316,7 @@ void FsLink::timerCallback() else { m_pKml->update(m_flightData); - m_pKml->export(m_pKml->getPath()); + m_pKml->exportKml(m_pKml->getPath()); m_kmlUpdateCount = m_kmlUpdateInterval; } diff --git a/Source/FsLink.hpp b/Source/FsLink.hpp index 301bf53..1c6aaf8 100644 --- a/Source/FsLink.hpp +++ b/Source/FsLink.hpp @@ -42,6 +42,7 @@ public: virtual ~FsLink(); void addListener(IFsLinkListener *pListener); void setKml(IKml *pKml); + void setUpdateInterval(double seconds); private: ListenerList m_listeners; diff --git a/Source/HttpServer.cpp b/Source/HttpServer.cpp index a738444..c0e1c63 100644 --- a/Source/HttpServer.cpp +++ b/Source/HttpServer.cpp @@ -1,8 +1,9 @@ #include "HttpServer.hpp" -HttpServer::HttpServer(const char *pDocDir) +HttpServer::HttpServer(int port, const char *pDocDir) : Thread("Http") +, m_port(port) , m_docDir(pDocDir) { startThread(); @@ -51,16 +52,19 @@ const char* HttpServer::getDocName(char *buffer, int buflen) } pDocname[i] = 0; + if (i==0) + return nullptr; + return docBuffer; } void HttpServer::run() { char buffer[1024]; + char docname[1024]; ScopedPointer listenSock = new StreamingSocket(); - listenSock->bindToPort(5001); - listenSock->createListener(5001); + listenSock->createListener(m_port); while(!threadShouldExit()) { @@ -76,13 +80,15 @@ void HttpServer::run() pDoc = getDocName(buffer, numRead); if (!pDoc) { - pSock->close(); - continue; + pDoc = docname; + sprintf(docname, "%s\\FsTrack\\welcome.htm", m_docDir); + } + else + { + m_listeners.call(&IHttpListener::onUpdate, pDoc); } } - m_listeners.call(&IHttpListener::onUpdate, pDoc); - ScopedPointer file = new juce::File(pDoc); if (!file) continue; diff --git a/Source/HttpServer.hpp b/Source/HttpServer.hpp index 28ad220..1a3f09c 100644 --- a/Source/HttpServer.hpp +++ b/Source/HttpServer.hpp @@ -7,11 +7,12 @@ class HttpServer : public juce::Thread { public: - HttpServer(const char *pDocDir); + HttpServer(int port, const char *pDocDir); ~HttpServer(void); void addListener(IHttpListener *pListener); private: + int m_port; const char *m_docDir; ListenerList m_listeners; diff --git a/Source/IKml.hpp b/Source/IKml.hpp index 768fe44..b1ab841 100644 --- a/Source/IKml.hpp +++ b/Source/IKml.hpp @@ -20,7 +20,8 @@ struct IKml virtual const char* getPath() = 0; virtual void update(FlightData const &flightData) = 0; - virtual void export(const char *pPath) = 0; + virtual void exportKml(const char *pPath) = 0; + virtual void exportKmz(const char *pPath) = 0; }; #endif /* IKML_HPP */ diff --git a/Source/Kml.cpp b/Source/Kml.cpp index 9421123..7206153 100644 --- a/Source/Kml.cpp +++ b/Source/Kml.cpp @@ -62,13 +62,13 @@ void Kml::destroy() void Kml::update(FlightData const &flightData) { + const ScopedLock sl (m_lock); updatePlane(flightData); updatePath(flightData); } void Kml::updatePlane(FlightData const &flightData) { - const ScopedLock sl (m_lock); char temp_str[1024]; XmlElement *pDoc = kml->getChildByName("Document"); @@ -241,19 +241,36 @@ void Kml::updatePath(FlightData const &flightData) } } -void Kml::export(const char *pPath) +void Kml::exportKml(const char *pPath) { + const ScopedLock sl (m_lock); + if (pPath && kml) { - const ScopedLock sl (m_lock); - File file(pPath); kml->writeToFile(file, StringRef("")); } } -void Kml::onUpdate(const char *pPath) +void Kml::exportKmz(const char *pPath) { - export(pPath); + // ToDo: add Compression if available in Juce + const ScopedLock sl (m_lock); + + if (pPath && kml) + { + File file(pPath); + + file.deleteFile(); + ScopedPointer pStream = file.createOutputStream(); + + kml->writeToStream(*pStream, StringRef("")); + pStream = nullptr; + } +} + +void Kml::onUpdate(const char *pPath) +{ + exportKmz(pPath); } diff --git a/Source/Kml.hpp b/Source/Kml.hpp index 4c80a5a..2a63541 100644 --- a/Source/Kml.hpp +++ b/Source/Kml.hpp @@ -23,7 +23,8 @@ private: void destroy(); const char* getPath(); void update(FlightData const &flightData); - void export(const char *pPath); + void exportKml(const char *pPath); + void exportKmz(const char *pPath); void updatePlane(FlightData const &flightData); void updatePath(FlightData const &flightData); void onUpdate(const char *pPath); diff --git a/Source/Main.cpp b/Source/Main.cpp index edb648e..f7ae2ba 100644 --- a/Source/Main.cpp +++ b/Source/Main.cpp @@ -7,6 +7,8 @@ ============================================================================== */ +#include +#include #include "../JuceLibraryCode/JuceHeader.h" #include "MainComponent.h" @@ -29,7 +31,6 @@ public: (void)commandLine; // This method is where you should put your application's initialisation code.. - mainWindow = new MainWindow(); } @@ -68,7 +69,11 @@ public: Colours::lightgrey, DocumentWindow::allButtons) { - setContentOwned (new MainComponent(), true); + PWSTR path; + SHGetKnownFolderPath(FOLDERID_Profile, 0, NULL, &path); + + static String pathStr(path); + setContentOwned (new MainComponent(pathStr), true); centreWithSize (getWidth(), getHeight()); setVisible (true); diff --git a/Source/MainComponent.cpp b/Source/MainComponent.cpp index bb47346..55978a0 100644 --- a/Source/MainComponent.cpp +++ b/Source/MainComponent.cpp @@ -27,7 +27,7 @@ //[/MiscUserDefs] //============================================================================== -MainComponent::MainComponent () +MainComponent::MainComponent (String const &homeDir) { addAndMakeVisible (m_fsuipcStatus = new Label ("FSUIP Status", TRANS("Unknown"))); @@ -45,6 +45,12 @@ MainComponent::MainComponent () m_flightStatus->setColour (TextEditor::textColourId, Colours::black); m_flightStatus->setColour (TextEditor::backgroundColourId, Colour (0x00000000)); + addAndMakeVisible (m_kmlUpdInterval_s = new Slider ("KML Update Interval")); + m_kmlUpdInterval_s->setRange (0.1, 10, 0.1); + m_kmlUpdInterval_s->setSliderStyle (Slider::LinearHorizontal); + m_kmlUpdInterval_s->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + m_kmlUpdInterval_s->addListener (this); + //[UserPreSize] //[/UserPreSize] @@ -53,14 +59,21 @@ MainComponent::MainComponent () //[Constructor] You can add your own custom stuff here.. - m_kml = new Kml("C:\\Users\\jens"); + static String workDir(homeDir + String("\\FsTrack")); - m_fsLink = new FsLink("C:\\Users\\jens"); + File file(workDir); + file.createDirectory(); + + m_kml = new Kml(workDir.getCharPointer()); + + m_fsLink = new FsLink(workDir.getCharPointer()); m_fsLink->addListener(this); m_fsLink->setKml(m_kml); - m_httpServer = new HttpServer("C:\\Users\\jens"); + m_httpServer = new HttpServer(5001, workDir.getCharPointer()); m_httpServer->addListener(m_kml); + + m_kmlUpdInterval_s->setValue(1.0, juce::NotificationType::sendNotification); //[/Constructor] } @@ -71,6 +84,7 @@ MainComponent::~MainComponent() m_fsuipcStatus = nullptr; m_flightStatus = nullptr; + m_kmlUpdInterval_s = nullptr; //[Destructor]. You can add your own custom destruction code here.. @@ -98,10 +112,27 @@ void MainComponent::resized() { m_fsuipcStatus->setBounds (16, 256, 150, 24); m_flightStatus->setBounds (216, 256, 150, 24); + m_kmlUpdInterval_s->setBounds (16, 216, 184, 24); //[UserResized] Add your own custom resize handling here.. //[/UserResized] } +void MainComponent::sliderValueChanged (Slider* sliderThatWasMoved) +{ + //[UsersliderValueChanged_Pre] + //[/UsersliderValueChanged_Pre] + + if (sliderThatWasMoved == m_kmlUpdInterval_s) + { + //[UserSliderCode_m_kmlUpdInterval_s] -- add your slider handling code here.. + m_fsLink->setUpdateInterval(sliderThatWasMoved->getValue()); + //[/UserSliderCode_m_kmlUpdInterval_s] + } + + //[UsersliderValueChanged_Post] + //[/UsersliderValueChanged_Post] +} + //[MiscUserCode] You can add your own definitions of your custom methods or any other code here... @@ -128,7 +159,7 @@ void MainComponent::onDataChanged(IFsLink &obj) BEGIN_JUCER_METADATA @@ -142,6 +173,10 @@ BEGIN_JUCER_METADATA edBkgCol="0" labelText="Unknown" editableSingleClick="0" editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font" fontsize="15" bold="0" italic="0" justification="33"/> + END_JUCER_METADATA diff --git a/Source/MainComponent.h b/Source/MainComponent.h index 97295ee..85cabf3 100644 --- a/Source/MainComponent.h +++ b/Source/MainComponent.h @@ -38,11 +38,12 @@ //[/Comments] */ class MainComponent : public Component, - public IFsLinkListener + public IFsLinkListener, + public SliderListener { public: //============================================================================== - MainComponent (); + MainComponent (String const &homeDir); ~MainComponent(); //============================================================================== @@ -51,6 +52,7 @@ public: void paint (Graphics& g); void resized(); + void sliderValueChanged (Slider* sliderThatWasMoved); @@ -68,6 +70,7 @@ private: //============================================================================== ScopedPointer