[DEV] continue integration of the media player with zeus

This commit is contained in:
Edouard DUPIN 2017-01-04 22:53:46 +01:00
parent 24e7c0efc8
commit 84c9ca1cdc
15 changed files with 217 additions and 83 deletions

View File

@ -304,3 +304,25 @@ void appl::GateWay::onPropertyChangeServicePort() {
void appl::GateWay::onPropertyChangeServiceMax() {
}
// Check if it take a long time without activity to kill itself ...
bool appl::GateWay::checkIsAlive(const echrono::Duration& _timeout) {
// if no roueter, no delay to check
if (*propertyRouterNo == true) {
return true;
}
// If no router ==> dead
if (m_routerClient == nullptr) {
return false;
}
// check only for smallest time-out : 1 second.
if (_timeout > echrono::seconds(1)) {
echrono::Steady now = echrono::Steady::now();
echrono::Steady lastTransmission = m_routerClient->getLastTransmission();
if ((now - lastTransmission) >= _timeout) {
APPL_INFO("Detect timeout ... last transmission=" << lastTransmission);
return false;
}
}
return true;
}

View File

@ -54,6 +54,8 @@ namespace appl {
uint16_t getId();
bool serviceExist(const std::string& _service);
uint16_t serviceClientIdGet(const std::string& _service);
// Check if it take a long time without activity to kill itself ...
bool checkIsAlive(const echrono::Duration& _timeout);
};
}

View File

@ -403,4 +403,20 @@ void appl::RouterInterface::clean() {
}
++it;
}
}
}
echrono::Steady appl::RouterInterface::getLastTransmission() {
auto receive = m_interfaceWeb.getLastTimeReceive();
auto send = m_interfaceWeb.getLastTimeSend();
if (receive >= send) {
if (receive == 0) {
return echrono::Steady::now();
}
return receive;
}
if (send == 0) {
return echrono::Steady::now();
}
return send;
}

View File

@ -40,6 +40,7 @@ namespace appl {
bool isAlive();
void send(const ememory::SharedPtr<zeus::Message>& _data);
void clean();
echrono::Steady getLastTransmission();
};
}

View File

@ -136,6 +136,7 @@ int main(int _argc, const char *_argv[]) {
// The default service port is 1985
m_client.propertyPort.set(1985);
#endif
uint32_t routerDisconnectionDelay = 30;
for (int32_t iii=0; iii<_argc ; ++iii) {
std::string data = _argv[iii];
if (etk::start_with(data, "--user=") == true) {
@ -146,6 +147,8 @@ int main(int _argc, const char *_argv[]) {
basicGateway.propertyRouterIp.set(std::string(&data[12]));
} else if (etk::start_with(data, "--router-port=") == true) {
basicGateway.propertyRouterPort.set(etk::string_to_uint16_t(std::string(&data[14])));
} else if (etk::start_with(data, "--router-delay=") == true) {
routerDisconnectionDelay = etk::string_to_uint32_t(std::string(&data[15]));
} else if (etk::start_with(data, "--service-ip=") == true) {
basicGateway.propertyServiceIp.set(std::string(&data[13]));
#ifdef GATEWAY_ENABLE_LAUNCHER
@ -174,11 +177,12 @@ int main(int _argc, const char *_argv[]) {
APPL_PRINT(" " << _argv[0] << " [options]");
APPL_PRINT(" --user=XXX Name of the user that we are connected.");
APPL_PRINT(" --no-router Router connection disable ==> this enable the direct donnection of external client like on the router");
APPL_PRINT(" --router-ip=XXX Router connection IP (default: 1.7.0.0.1)");
APPL_PRINT(" --router-port=XXX Router connection PORT (default: 1984)");
APPL_PRINT(" --service-ip=XXX Service connection IP (default: 1.7.0.0.1)");
APPL_PRINT(" --service-port=XXX Service connection PORT (default: 1985)");
APPL_PRINT(" --service-max=XXX Service Maximum IO (default: 15)");
APPL_PRINT(" --router-ip=XXX Router connection IP (default: " << basicGateway.propertyRouterIp.get() << ")");
APPL_PRINT(" --router-port=XXX Router connection PORT (default: " << basicGateway.propertyRouterPort.get() << ")");
APPL_PRINT(" --service-ip=XXX Service connection IP (default: " << basicGateway.propertyServiceIp.get() << ")");
APPL_PRINT(" --service-port=XXX Service connection PORT (default: " << basicGateway.propertyServicePort.get() << ")");
APPL_PRINT(" --service-max=XXX Service Maximum IO (default: " << basicGateway.propertyServiceMax.get() << ")");
APPL_PRINT(" --router-delay=XXX Delay before disconnect from the router (default: " << routerDisconnectionDelay << ")");
#ifdef GATEWAY_ENABLE_LAUNCHER
APPL_PRINT(" specific for internal launcher:");
APPL_PRINT(" --base-path=XXX base path to search data (default: 'USERDATA:')");
@ -193,13 +197,19 @@ int main(int _argc, const char *_argv[]) {
basicGateway.start();
#ifdef GATEWAY_ENABLE_LAUNCHER
if (services.size() == 0) {
bool routerAlive = true;
#endif
while (true) {
while (routerAlive == true) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
basicGateway.cleanIO();
routerAlive = basicGateway.checkIsAlive(echrono::seconds(routerDisconnectionDelay));
if (routerAlive == false) {
APPL_WARNING("Router is Dead or Timeout");
}
}
#ifdef GATEWAY_ENABLE_LAUNCHER
} else {
bool routerAlive = true;
std::vector<ememory::SharedPtr<PlugginAccess>> listElements;
for (auto &it: services) {
ememory::SharedPtr<PlugginAccess> tmp = ememory::makeShared<PlugginAccess>(it);
@ -215,7 +225,8 @@ int main(int _argc, const char *_argv[]) {
it->publish(m_client);
}
uint32_t iii = 0;
while(m_client.isAlive() == true) {
while ( m_client.isAlive() == true
&& routerAlive == true) {
m_client.pingIsAlive();
m_client.displayConnectedObject();
m_client.cleanDeadObject();
@ -223,8 +234,14 @@ int main(int _argc, const char *_argv[]) {
it->peridic_call();
}
basicGateway.cleanIO();
std::this_thread::sleep_for(std::chrono::seconds(1));
APPL_INFO("service in waiting ... " << iii << "/inf");
routerAlive = basicGateway.checkIsAlive(echrono::seconds(routerDisconnectionDelay));
if (routerAlive == false) {
APPL_WARNING("Router is Dead or Timeout");
} else {
elog::flush();
std::this_thread::sleep_for(std::chrono::seconds(1));
APPL_INFO("service in waiting ... " << iii << "/inf");
}
iii++;
}
for (auto &it: listElements) {
@ -241,5 +258,6 @@ int main(int _argc, const char *_argv[]) {
APPL_INFO("==================================");
APPL_INFO("== ZEUS gateway stop ==");
APPL_INFO("==================================");
elog::flush();
return 0;
}

View File

@ -191,6 +191,7 @@ int main(int _argc, const char *_argv[]) {
for (auto &it: listElements) {
it->uninit();
}
elog::flush();
return 0;
}

View File

@ -55,82 +55,16 @@ appl::Windows::Windows():
void appl::Windows::init() {
ewol::widget::Windows::init();
load_db();
std::string composition = std::string("");
composition += "<wslider name='view-selection' fill='true,true' expand='true,true'>\n";
composition += " <PopUp name='ws-name-connect' >\n";
composition += " <sizer mode='vert' fill='true,true' expand='false,false' lock='true,true' addmode='invert' min-size='45,10%'>\n";
composition += " <label>login</label>\n";
composition += " <entry name='connect-login' fill='true,false' expand='true,false'/>\n";
composition += " <label>password</label>\n";
composition += " <entry name='connect-password' fill='true,false' expand='true,false'/>\n";
composition += " <button name='connect-bt' toggle='false' fill='false,false' expand='true,false' gravity='right'>\n";
composition += " <label>Connect</label>\n";
composition += " </button>\n";
composition += " </sizer>\n";
composition += " </PopUp>\n";
composition += " <sizer mode='vert' name='ws-name-list' fill='true,true' expand='true,true' addmode='invert'>\n";
composition += " <button name='bt-film-picture' expand='true,false' fill='true,true'>\n";
composition += " <label>Films</label>\n";
composition += " </button>\n";
composition += " <button name='bt-film-draw' expand='true,false' fill='true,true'>\n";
composition += " <label>Annimated films</label>\n";
composition += " </button>\n";
composition += " <button name='bt-tv-picture' expand='true,false' fill='true,true'>\n";
composition += " <label>TV Show</label>\n";
composition += " </button>\n";
composition += " <button name='bt-tv-draw' expand='true,false' fill='true,true'>\n";
composition += " <label>Annimated TV Show</label>\n";
composition += " </button>\n";
composition += " <button name='bt-theater' expand='true,false' fill='true,true'>\n";
composition += " <label>Teather</label>\n";
composition += " </button>\n";
composition += " <button name='bt-one-man-show' expand='true,false' fill='true,true'>\n";
composition += " <label>One-man show</label>\n";
composition += " </button>\n";
composition += " <button name='bt-courses' expand='true,false' fill='true,true'>\n";
composition += " <label>Courses</label>\n";
composition += " </button>\n";
composition += " <spacer fill='true,true' expand='true,true'/>\n";
composition += " </sizer>\n";
composition += " <ListViewer name='ws-name-list-viewer' fill='true,true' expand='true,true'/>\n";
composition += " <sizer mode='vert' name='ws-name-player' fill='true,true' expand='true,true'>\n";
composition += " <sizer mode='hori' fill='true,true' expand='true,true'>\n";
composition += " <button name='bt-previous'>\n";
composition += " <label>\n";
composition += " previous\n";
composition += " </label>\n";
composition += " </button>\n";
composition += " <button name='bt-play' toggle='true'>\n";
composition += " <label>play</label>\n";
composition += " <label>pause</label>\n";
composition += " </button>\n";
composition += " <button name='bt-next'>\n";
composition += " <label>\n";
composition += " Next\n";
composition += " </label>\n";
composition += " </button>\n";
composition += " <label name='lb-fps'/>\n";
composition += " <label name='lb-time'/>\n";
composition += " <button name='bt-back'>\n";
composition += " <label>\n";
composition += " back\n";
composition += " </label>\n";
composition += " </button>\n";
composition += " </sizer>\n";
composition += " <slider name='progress-bar' expand='true,false' fill='true' step='0.01' min='0'/>\n";
composition += " <VideoDisplay name='displayer' expand='true' fill='true'/>\n";
composition += " </sizer>\n";
composition += "</wslider>\n";
m_composer = ewol::widget::Composer::create();
if (m_composer == nullptr) {
APPL_CRITICAL(" An error occured ... in the windows creatrion ...");
return;
}
m_composer->loadFromString(composition);
m_composer->loadFromFile("DATA:gui.xml");
setSubWidget(m_composer);
m_listViewer = ememory::dynamicPointerCast<appl::widget::ListViewer>(m_composer->getSubObjectNamed("ws-name-list-viewer"));
m_listViewer->signalSelect.connect(sharedFromThis(), &appl::Windows::onCallbackSelectMedia);
subBind(ewol::widget::Button, "bt-previous", signalPressed, sharedFromThis(), &appl::Windows::onCallbackPrevious);
subBind(ewol::widget::Button, "bt-play", signalValue, sharedFromThis(), &appl::Windows::onCallbackPlay);
@ -337,3 +271,19 @@ void appl::Windows::onCallbackSelectSourses() {
m_listViewer->searchElements("courses");
}
void appl::Windows::onCallbackSelectMedia(const uint32_t& _value) {
ewol::propertySetOnObjectNamed("view-selection", "select", "ws-name-player");
ememory::SharedPtr<appl::widget::VideoDisplay> tmpDisp = ememory::dynamicPointerCast<appl::widget::VideoDisplay>(getSubObjectNamed("displayer"));
if (tmpDisp != nullptr) {
// stop previous (if needed)
tmpDisp->stop();
// Set new file:
tmpDisp->setZeusMedia(m_clientProp, _value);
tmpDisp->play();
echrono::Duration time = tmpDisp->getDuration();
APPL_DEBUG("duration = " << time << " " << etk::to_string(time.toSeconds()));
propertySetOnWidgetNamed("progress-bar", "value", "0");
propertySetOnWidgetNamed("progress-bar", "max", etk::to_string(time.toSeconds()));
}
}

View File

@ -49,6 +49,7 @@ namespace appl {
void onCallbackSelectTeather();
void onCallbackSelectOneManShow();
void onCallbackSelectSourses();
void onCallbackSelectMedia(const uint32_t& _value);
};
}

View File

@ -25,9 +25,12 @@
#include <etk/stdTools.hpp>
#include <ejson/ejson.hpp>
appl::widget::ListViewer::ListViewer() {
appl::widget::ListViewer::ListViewer() :
signalSelect(this, "select", "Select a media to view") {
addObjectType("appl::widget::ListViewer");
propertyCanFocus.setDirectCheck(true);
// Limit event at 1:
setMouseLimit(1);
}
void appl::widget::ListViewer::init() {
@ -319,6 +322,8 @@ void appl::ElementDisplayed::generateDisplay(vec2 _startPos, vec2 _size) {
m_draw.setColor(m_bgColor);
m_draw.rectangleWidth(_size);
m_pos = _startPos;
m_size = _size;
// --------------------------------------------
// -- Display text...
// --------------------------------------------
@ -364,3 +369,48 @@ void appl::ElementDisplayed::generateDisplay(vec2 _startPos, vec2 _size) {
m_image.print(vec2(_size.y(), _size.y())-vec2(20,20));
}
bool appl::widget::ListViewer::onEventInput(const ewol::event::Input& _event) {
APPL_VERBOSE("Event on BT : " << _event);
vec2 relativePos = relativePosition(_event.getPos());
int32_t findId = -1;
for (size_t iii=0; iii<m_listDisplay.size(); ++iii) {
if (m_listDisplay[iii] == nullptr) {
continue;
}
if( relativePos.x() < m_listDisplay[iii]->m_pos.x()
|| relativePos.y() < m_listDisplay[iii]->m_pos.y()
|| relativePos.x() > m_listDisplay[iii]->m_pos.x() + m_listDisplay[iii]->m_size.x()
|| relativePos.y() > m_listDisplay[iii]->m_pos.y() + m_listDisplay[iii]->m_size.y() ) {
continue;
}
findId = iii;
break;
}
if (findId == -1) {
return false;
}
if (_event.getId() == 1) {
if(_event.getStatus() == gale::key::status::pressSingle) {
APPL_WARNING("Select element : " << findId << " " << m_listDisplay[findId]->m_idCurentElement);
ememory::SharedPtr<appl::ElementProperty> prop = m_listDisplay[findId]->m_property;
if (prop != nullptr) {
std::string fullTitle;
if (prop->m_serie != "") {
fullTitle += prop->m_serie + "-";
}
if (prop->m_saison != "") {
fullTitle += "s" + prop->m_saison + "-";
}
if (prop->m_episode != "") {
fullTitle += "e" + prop->m_episode + "-";
}
fullTitle += prop->m_title;
APPL_WARNING("info element : " << prop->m_id << " title: " << fullTitle);
signalSelect.emit(prop->m_id);
}
return true;
}
}
return false;
}

View File

@ -42,6 +42,8 @@ namespace appl {
ememory::SharedPtr<appl::ElementProperty> m_property;
int32_t m_idCurentElement;
etk::Color<float> m_bgColor;
vec2 m_pos;
vec2 m_size;
protected:
ewol::compositing::Image m_image;
ewol::compositing::Text m_text;
@ -63,6 +65,8 @@ namespace appl {
class ListViewer : public ewol::widget::WidgetScrolled {
protected:
ewol::compositing::Text m_text;
public:
esignal::Signal<uint32_t> signalSelect; //!< when select a media to view
protected:
ememory::SharedPtr<ClientProperty> m_clientProp; //!< Generic entrypoint on the Client
@ -85,6 +89,7 @@ namespace appl {
m_clientProp = _prop;
}
void searchElements(std::string _filter);
bool onEventInput(const ewol::event::Input& _event) override;
};
}
}

View File

@ -62,6 +62,7 @@ namespace appl {
void onRegenerateDisplay() override;
public:
void setFile(const std::string& _fileName);
void setZeusMedia(ememory::SharedPtr<ClientProperty> _property, uint32_t _mediaId) { };
protected:
bool m_isPalying;
public:

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wslider name="view-selection" fill="true,true" expand="true,true">
<PopUp name="ws-name-connect" >
<sizer mode="vert" fill="true,true" expand="false,false" lock="true,true" addmode="invert" min-size="45,10%">
<label>login</label>
<entry name="connect-login" fill="true,false" expand="true,false"/>
<label>password</label>
<entry name="connect-password" fill="true,false" expand="true,false"/>
<button name="connect-bt" toggle="false" fill="false,false" expand="true,false" gravity="right">
<label>Connect</label>
</button>
</sizer>
</PopUp>
<sizer mode="vert" name="ws-name-list" fill="true,true" expand="true,true" addmode="invert">
<button name="bt-film-picture" expand="true,false" fill="true,true">
<label>Films</label>
</button>
<button name="bt-film-draw" expand="true,false" fill="true,true">
<label>Annimated films</label>
</button>
<button name="bt-tv-picture" expand="true,false" fill="true,true">
<label>TV Show</label>
</button>
<button name="bt-tv-draw" expand="true,false" fill="true,true">
<label>Annimated TV Show</label>
</button>
<button name="bt-theater" expand="true,false" fill="true,true">
<label>Teather</label>
</button>
<button name="bt-one-man-show" expand="true,false" fill="true,true">
<label>One-man show</label>
</button>
<button name="bt-courses" expand="true,false" fill="true,true">
<label>Courses</label>
</button>
<spacer fill="true,true" expand="true,true"/>
</sizer>
<ListViewer name="ws-name-list-viewer" fill="true,true" expand="true,true"/>
<sizer mode="vert" name="ws-name-player" fill="true,true" expand="true,true">
<sizer mode="hori" fill="true,true" expand="true,true">
<button name="bt-previous">
<label>
previous
</label>
</button>
<button name="bt-play" toggle="true">
<label>play</label>
<label>pause</label>
</button>
<button name="bt-next">
<label>
Next
</label>
</button>
<label name="lb-fps"/>
<label name="lb-time"/>
<button name="bt-back">
<label>
back
</label>
</button>
</sizer>
<slider name="progress-bar" expand="true,false" fill="true" step="0.01" min="0"/>
<VideoDisplay name="displayer" expand="true" fill="true"/>
</sizer>
</wslider>

View File

@ -59,5 +59,6 @@ int main(int _argc, const char *_argv[]) {
APPL_INFO("==================================");
APPL_INFO("== ZEUS router stop ==");
APPL_INFO("==================================");
elog::flush();
return 0;
}

View File

@ -324,7 +324,7 @@ bool zeus::Client::isAlive() {
}
void zeus::Client::pingIsAlive() {
if (std::chrono::steady_clock::now() - m_interfaceWeb->getLastTimeSend() >= std::chrono::seconds(30)) {
if (echrono::Steady::now() - m_interfaceWeb->getLastTimeSend() >= echrono::seconds(30)) {
m_interfaceWeb->ping();
}
}

View File

@ -254,7 +254,7 @@ namespace zeus {
* @param[in]
* @return
*/
const std::chrono::steady_clock::time_point& getLastTimeReceive() {
const echrono::Steady& getLastTimeReceive() {
return m_connection.getLastTimeReceive();
}
/**
@ -262,7 +262,7 @@ namespace zeus {
* @param[in]
* @return
*/
const std::chrono::steady_clock::time_point& getLastTimeSend() {
const echrono::Steady& getLastTimeSend() {
return m_connection.getLastTimeSend();
}
private: