adding sensor reset button

origin
steffen 6 years ago
parent 3ffbeee7f0
commit f493c40816

@ -55,6 +55,7 @@ int main (int argc, char **argv) {
i = u.ReadTimeout(buffer, BUFFERSIZE-1, 1000); i = u.ReadTimeout(buffer, BUFFERSIZE-1, 1000);
buffer[i] = 0; buffer[i] = 0;
fprintf (logf, "read from server %d bytes\n", i); fprintf (logf, "read from server %d bytes\n", i);
// fprintf (logf, "%s\n", buffer);
printf ("%s", buffer); printf ("%s", buffer);
} while (i == BUFFERSIZE-1); } while (i == BUFFERSIZE-1);
u.Close(); u.Close();

@ -267,6 +267,7 @@ int Network::ClientLoop(UNIX *client) {
jsonout.AddObject(je); jsonout.AddObject(je);
} }
s = jsonout.ToString(); 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())); client->Write((char*)s.c_str(), strlen(s.c_str()));
result = 1; result = 1;
} }

@ -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 Sensors::Change(Sensor *se) {
int i; int i;
int ifree = -1; int ifree = -1;
@ -133,6 +169,7 @@ int Sensors::Change(Sensor *se) {
} }
changed = 1; changed = 1;
UnLock(); UnLock();
return 1; return 1;

@ -35,6 +35,8 @@ class Sensors {
void ClearChanged() { changed = 0; }; void ClearChanged() { changed = 0; };
int Change(Sensor *se); int Change(Sensor *se);
int Get(int idx, Sensor *dest);
int Get(string name, Sensor *dest);
int Delete(string name); int Delete(string name);
JSONParse GetJSON(string name); JSONParse GetJSON(string name);

@ -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() { void Server::ThreadProcess() {
int i = 0; int i = 0;
while (running) { while (running) {
interfaces.Loop(); interfaces.Loop();
turnouts.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 // startup process
if (mode == SMODE_STARTUP) { if (mode == SMODE_STARTUP) {
SetModeReset(); SetModeReset(); // currently there is not much to do.
} }
// //
// reset all internal data // reset all internal data
else if (mode == SMODE_RESET) { else if (mode == SMODE_RESET)
SetModeManual(); CycleModeReset();
}
// //
// mode manual // mode manual
@ -133,34 +134,101 @@ bool Server::IsChanged() {
// //
// Set Mode Auto // Set Mode Auto
void Server::SetModeAuto() { void Server::SetModeAuto() {
debug (0, "%s:%d * Mode Auto", __FILE__, __LINE__); debug (0, "%s:%d * Set Mode Auto", __FILE__, __LINE__);
status_text = "Mode Auto"; status_text = "Mode Auto";
} }
// //
// Set Mode Manual // Set Mode Manual
void Server::SetModeManual() { 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"; 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<JSONElement> elements;
list<JSONElement>::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 // Set Mode Error
// FIXME: maybe adding error text as parameter? // FIXME: maybe adding error text as parameter?
void Server::SetModeError(string text) { 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 + "'"; status_text = "Error:'" + text + "'";
} }
// //
// Set Mode Reset // Set Mode Reset
void Server::SetModeReset() { void Server::SetModeReset() {
debug (0, "%s:%d * Reset Data", __FILE__, __LINE__); debug (0, "%s:%d * Set Reset Data", __FILE__, __LINE__);
status_text = "Mode Reset"; status_text = "Mode Reset";
mode = SMODE_RESET; mode = SMODE_RESET;
data_reset.mr_step = SMRESET_STEP_INIT; data_reset.mr_step = SMRESET_STEP_INIT;
data_reset.mr_idx = -1; data_reset.mr_idx = -1;
data_reset.mr_lastelm = "";
gettimeofday(&data_reset.mr_timestamp, NULL); gettimeofday(&data_reset.mr_timestamp, NULL);
}; };

@ -52,6 +52,7 @@ struct s_ModeResetData{
int mr_step; // current step int mr_step; // current step
struct timeval mr_timestamp; // timestamp ( needed for times ) struct timeval mr_timestamp; // timestamp ( needed for times )
int mr_idx; // mode index int mr_idx; // mode index
string mr_lastelm; // last element
} typedef ModeResetData; } typedef ModeResetData;
@ -124,6 +125,9 @@ public:
void SetModeManual(); // Manual Mode void SetModeManual(); // Manual Mode
void SetModeAuto(); // only allowed if Manual was set 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 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 string GetStatus(); // return status
///////////////////////////////////////// /////////////////////////////////////////

@ -171,8 +171,6 @@ JSONElement Session::ChangeListGet() {
je.value += "]"; je.value += "]";
// debug (0, "* Session::ChangeListGet string:'%s'", je.GetString().c_str());
return je; return je;
} }

@ -99,17 +99,16 @@ function serverinout_defaultCallback(data) {
// //
// valid data from server // valid data from server
if (data.rid == randomID && data.sid == sessionID) { 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 // loop through all the changes
if (data.changes) { if (data.changes) {
for (var i = 0; i < data.changes.length; i++) { 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 // railway changes

Loading…
Cancel
Save