diff --git a/server/modelbahn-cgi.cc b/server/modelbahn-cgi.cc index 0f51855..5787a37 100644 --- a/server/modelbahn-cgi.cc +++ b/server/modelbahn-cgi.cc @@ -55,6 +55,7 @@ int main (int argc, char **argv) { i = u.ReadTimeout(buffer, BUFFERSIZE-1, 1000); buffer[i] = 0; fprintf (logf, "read from server %d bytes\n", i); +// fprintf (logf, "%s\n", buffer); printf ("%s", buffer); } while (i == BUFFERSIZE-1); u.Close(); diff --git a/server/network.cc b/server/network.cc index 557e974..1ebd98f 100644 --- a/server/network.cc +++ b/server/network.cc @@ -267,6 +267,7 @@ int Network::ClientLoop(UNIX *client) { jsonout.AddObject(je); } s = jsonout.ToString(); + // debug (0, "%s:%d ---> send:\n\n\n%s\n\n\n", __FILE__, __LINE__, s.c_str()); client->Write((char*)s.c_str(), strlen(s.c_str())); result = 1; } diff --git a/server/sensor.cc b/server/sensor.cc index 184bc88..93864e9 100644 --- a/server/sensor.cc +++ b/server/sensor.cc @@ -109,6 +109,42 @@ Sensor Sensors::GetSensorFromJSON(JSONParse *j) { }; +int Sensors::Get(string name, Sensor *dest) { + int i; + + if (dest == NULL) return 0; + + Lock(); + for (i = 0; i < max; i++) if (sensors[i].name[0] != 0) + if (name.compare(sensors[i].name) == 0) { + (*dest) = sensors[i]; + UnLock(); + return 1; + } + UnLock(); + + return 0; +}; + + +int Sensors::Get(int idx, Sensor *dest) { + int i; + + if (dest == NULL) return 0; + + Lock(); + for (i = 0; i < max; i++) if (sensors[i].name[0] != 0) + if (idx == i) { + (*dest) = sensors[i]; + UnLock(); + return 1; + } + UnLock(); + + return 0; +}; + + int Sensors::Change(Sensor *se) { int i; int ifree = -1; @@ -133,6 +169,7 @@ int Sensors::Change(Sensor *se) { } changed = 1; + UnLock(); return 1; diff --git a/server/sensor.h b/server/sensor.h index 160e76b..8054378 100644 --- a/server/sensor.h +++ b/server/sensor.h @@ -35,6 +35,8 @@ class Sensors { void ClearChanged() { changed = 0; }; int Change(Sensor *se); + int Get(int idx, Sensor *dest); + int Get(string name, Sensor *dest); int Delete(string name); JSONParse GetJSON(string name); diff --git a/server/server.cc b/server/server.cc index 3d1b9a0..9e86f48 100644 --- a/server/server.cc +++ b/server/server.cc @@ -59,25 +59,26 @@ Server::~Server() { }; + +// +// server thread will cycle as long as running is set to true +// most important in each cycle there will be void Server::ThreadProcess() { int i = 0; while (running) { interfaces.Loop(); turnouts.Loop(); - debug (0, "%s:%d mode:%d data_reset.step:%d data_reset.idx:%d", __FILE__, __LINE__, mode, data_reset.mr_step, data_reset.mr_idx); - // // startup process if (mode == SMODE_STARTUP) { - SetModeReset(); + SetModeReset(); // currently there is not much to do. } // // reset all internal data - else if (mode == SMODE_RESET) { - SetModeManual(); - } + else if (mode == SMODE_RESET) + CycleModeReset(); // // mode manual @@ -133,34 +134,101 @@ bool Server::IsChanged() { // // Set Mode Auto void Server::SetModeAuto() { - debug (0, "%s:%d * Mode Auto", __FILE__, __LINE__); + debug (0, "%s:%d * Set Mode Auto", __FILE__, __LINE__); status_text = "Mode Auto"; } // // Set Mode Manual void Server::SetModeManual() { - debug (0, "%s:%d * Mode Manual", __FILE__, __LINE__); + debug (0, "%s:%d * Set Mode Manual", __FILE__, __LINE__); + mode = SMODE_MANUAL; status_text = "Mode Manual"; } + +// +// run a single cycle in reset mode +// each step will only reset one single step. +void Server::CycleModeReset() { + JSONParse json; + list elements; + list::iterator iter; + json.Clear(); + + debug (0, "* CycleModeReset Step:%d", data_reset.mr_step); + + if (data_reset.mr_step == SMRESET_STEP_INIT) { + // + // init reset + data_reset.mr_step++; + } + else if (data_reset.mr_step == SMRESET_STEP_INTERFACES) { + // + // reset interfaces + data_reset.mr_step++; + } + else if (data_reset.mr_step == SMRESET_STEP_LOCOMOTIVES) { + // + // reset locomotives + data_reset.mr_step++; + } + else if (data_reset.mr_step == SMRESET_STEP_SENSORS) { + // + // reset sensors + // all can be done in one single cycle. + // + int i; // index of sensor + int oldflags; // old flags + Sensor sensor; // sensor data + + for (i = 0; sensors.Get(i, &sensor) == 1; i++) { + oldflags = sensor.flags; + sensor.flags &= ~(SENSOR_F_ACTIVE); + debug (0, "* Reset Sensor: '%s' (%d -> %d)", sensor.name, oldflags, sensor.flags); + if (oldflags != sensor.flags) // only update if needed + sensors.Change(&sensor); + } + + sensors.GetJSONAll(&json); + data_reset.mr_step++; + } + else if (data_reset.mr_step == SMRESET_STEP_TURNOUTS) { + // + // reset turnouts + data_reset.mr_step++; + } + else { + SetModeManual(); + } + + // + // adding update data + elements = json.GetElements(); + for (iter = elements.begin(); iter != elements.end(); iter++) { + if (network) network->ChangeListPushToAll("{"+(*iter).GetString()+"}"); + } +} + + // // Set Mode Error // FIXME: maybe adding error text as parameter? void Server::SetModeError(string text) { - debug (0, "%s:%d * Mode Error :'%s'", __FILE__, __LINE__, text.c_str()); + debug (0, "%s:%d * Set Mode Error :'%s'", __FILE__, __LINE__, text.c_str()); status_text = "Error:'" + text + "'"; } // // Set Mode Reset void Server::SetModeReset() { - debug (0, "%s:%d * Reset Data", __FILE__, __LINE__); + debug (0, "%s:%d * Set Reset Data", __FILE__, __LINE__); status_text = "Mode Reset"; mode = SMODE_RESET; data_reset.mr_step = SMRESET_STEP_INIT; data_reset.mr_idx = -1; + data_reset.mr_lastelm = ""; gettimeofday(&data_reset.mr_timestamp, NULL); }; diff --git a/server/server.h b/server/server.h index fe6bf35..03da8de 100644 --- a/server/server.h +++ b/server/server.h @@ -52,6 +52,7 @@ struct s_ModeResetData{ int mr_step; // current step struct timeval mr_timestamp; // timestamp ( needed for times ) int mr_idx; // mode index + string mr_lastelm; // last element } typedef ModeResetData; @@ -124,6 +125,9 @@ public: void SetModeManual(); // Manual Mode void SetModeAuto(); // only allowed if Manual was set void SetModeError(string text); // will cut power and keep this mode, until reset or Mode Manual + + void CycleModeReset(); // one Cycle in mode reset + string GetStatus(); // return status ///////////////////////////////////////// diff --git a/server/session.cc b/server/session.cc index 965b6a0..81d4da1 100644 --- a/server/session.cc +++ b/server/session.cc @@ -171,8 +171,6 @@ JSONElement Session::ChangeListGet() { je.value += "]"; -// debug (0, "* Session::ChangeListGet string:'%s'", je.GetString().c_str()); - return je; } diff --git a/webinterface/serverinout.js b/webinterface/serverinout.js index 863493a..07900fd 100644 --- a/webinterface/serverinout.js +++ b/webinterface/serverinout.js @@ -99,17 +99,16 @@ function serverinout_defaultCallback(data) { // // valid data from server if (data.rid == randomID && data.sid == sessionID) { + // + // infoline + if (data.serverstatus) { + var text = document.getElementById("infoserver"); + text.innerHTML = data.serverstatus; + } // // loop through all the changes if (data.changes) { for (var i = 0; i < data.changes.length; i++) { - // - // infoline - if (data.serverstatus) { - var text = document.getElementById("infoserver"); - debug ("SERVER STATUS"); - text.innerHTML = data.serverstatus; - } // // railway changes