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);
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();

@ -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;
}

@ -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;

@ -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);

@ -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<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
// 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);
};

@ -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
/////////////////////////////////////////

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

@ -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

Loading…
Cancel
Save