diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..033d1b9
Binary files /dev/null and b/.DS_Store differ
diff --git a/webserver/core/custom_layer.h b/webserver/core/custom_layer.h
deleted file mode 100755
index fbbd8c8..0000000
--- a/webserver/core/custom_layer.h
+++ /dev/null
@@ -1,64 +0,0 @@
-//-----------------------------------------------------------------------------
-// DISCLAIMER: EDDITING THIS FILE CAN BREAK YOUR OPENPLC RUNTIME! IF YOU DON'T
-// KNOW WHAT YOU'RE DOING, JUST DON'T DO IT. EDIT AT YOUR OWN RISK.
-//
-// PS: You can always restore original functionality if you broke something
-// in here by clicking on the "Restore Original Code" button above.
-//-----------------------------------------------------------------------------
-
-//-----------------------------------------------------------------------------
-// These are the ignored I/O vectors. If you want to override how OpenPLC
-// handles a particular input or output, you must put them in the ignored
-// vectors. For example, if you want to override %IX0.5, %IX0.6 and %IW3
-// your vectors must be:
-// int ignored_bool_inputs[] = {5, 6}; //%IX0.5 and %IX0.6 ignored
-// int ignored_int_inputs[] = {3}; //%IW3 ignored
-//
-// Every I/O on the ignored vectors will be skipped by OpenPLC hardware layer
-//-----------------------------------------------------------------------------
-int ignored_bool_inputs[] = {-1};
-int ignored_bool_outputs[] = {-1};
-int ignored_int_inputs[] = {-1};
-int ignored_int_outputs[] = {-1};
-
-//-----------------------------------------------------------------------------
-// This function is called by the main OpenPLC routine when it is initializing.
-// Hardware initialization procedures for your custom layer should be here.
-//-----------------------------------------------------------------------------
-void initCustomLayer()
-{
-}
-
-//-----------------------------------------------------------------------------
-// This function is called by OpenPLC in a loop. Here the internal input
-// buffers must be updated with the values you want. Make sure to use the mutex
-// bufferLock to protect access to the buffers on a threaded environment.
-//-----------------------------------------------------------------------------
-void updateCustomIn()
-{
- // Example Code - Overwritting %IW3 with a fixed value
- // If you want to have %IW3 constantly reading a fixed value (for example, 53)
- // you must add %IW3 to the ignored vectors above, and then just insert this
- // single line of code in this function:
- // if (int_input[3] != NULL) *int_input[3] = 53;
-}
-
-//-----------------------------------------------------------------------------
-// This function is called by OpenPLC in a loop. Here the internal output
-// buffers must be updated with the values you want. Make sure to use the mutex
-// bufferLock to protect access to the buffers on a threaded environment.
-//-----------------------------------------------------------------------------
-void updateCustomOut()
-{
- // Example Code - Sending %QW5 value over I2C
- // If you want to have %QW5 output to be sent over I2C instead of the
- // traditional output for your board, all you have to do is, first add
- // %QW5 to the ignored vectors, and then define a send_over_i2c()
- // function for your platform. Finally you can call send_over_i2c() to
- // send your %QW5 value, like this:
- // if (int_output[5] != NULL) send_over_i2c(*int_output[5]);
- //
- // Important observation: If your I2C pins are used by OpenPLC I/Os, you
- // must also add those I/Os to the ignored vectors, otherwise OpenPLC
- // will try to control your I2C pins and your I2C message won't work.
-}
diff --git a/webserver/core/custom_layer.original b/webserver/core/custom_layer.original
deleted file mode 100755
index ed0e944..0000000
--- a/webserver/core/custom_layer.original
+++ /dev/null
@@ -1,66 +0,0 @@
-#include "ladder.h"
-
-//-----------------------------------------------------------------------------
-// DISCLAIMER: EDDITING THIS FILE CAN BREAK YOUR OPENPLC RUNTIME! IF YOU DON'T
-// KNOW WHAT YOU'RE DOING, JUST DON'T DO IT. EDIT AT YOUR OWN RISK.
-//
-// PS: You can always restore original functionality if you broke something
-// in here by clicking on the "Restore Original Code" button above.
-//-----------------------------------------------------------------------------
-
-//-----------------------------------------------------------------------------
-// These are the ignored I/O vectors. If you want to override how OpenPLC
-// handles a particular input or output, you must put them in the ignored
-// vectors. For example, if you want to override %IX0.5, %IX0.6 and %IW3
-// your vectors must be:
-// int ignored_bool_inputs[] = {5, 6}; //%IX0.5 and %IX0.6 ignored
-// int ignored_int_inputs[] = {3}; //%IW3 ignored
-//
-// Every I/O on the ignored vectors will be skipped by OpenPLC hardware layer
-//-----------------------------------------------------------------------------
-int ignored_bool_inputs[] = {-1};
-int ignored_bool_outputs[] = {-1};
-int ignored_int_inputs[] = {-1};
-int ignored_int_outputs[] = {-1};
-
-//-----------------------------------------------------------------------------
-// This function is called by the main OpenPLC routine when it is initializing.
-// Hardware initialization procedures for your custom layer should be here.
-//-----------------------------------------------------------------------------
-void initCustomLayer()
-{
-}
-
-//-----------------------------------------------------------------------------
-// This function is called by OpenPLC in a loop. Here the internal input
-// buffers must be updated with the values you want. Make sure to use the mutex
-// bufferLock to protect access to the buffers on a threaded environment.
-//-----------------------------------------------------------------------------
-void updateCustomIn()
-{
- // Example Code - Overwritting %IW3 with a fixed value
- // If you want to have %IW3 constantly reading a fixed value (for example, 53)
- // you must add %IW3 to the ignored vectors above, and then just insert this
- // single line of code in this function:
- // if (int_input[3] != NULL) *int_input[3] = 53;
-}
-
-//-----------------------------------------------------------------------------
-// This function is called by OpenPLC in a loop. Here the internal output
-// buffers must be updated with the values you want. Make sure to use the mutex
-// bufferLock to protect access to the buffers on a threaded environment.
-//-----------------------------------------------------------------------------
-void updateCustomOut()
-{
- // Example Code - Sending %QW5 value over I2C
- // If you want to have %QW5 output to be sent over I2C instead of the
- // traditional output for your board, all you have to do is, first add
- // %QW5 to the ignored vectors, and then define a send_over_i2c()
- // function for your platform. Finally you can call send_over_i2c() to
- // send your %QW5 value, like this:
- // if (int_output[5] != NULL) send_over_i2c(*int_output[5]);
- //
- // Important observation: If your I2C pins are used by OpenPLC I/Os, you
- // must also add those I/Os to the ignored vectors, otherwise OpenPLC
- // will try to control your I2C pins and your I2C message won't work.
-}
\ No newline at end of file
diff --git a/webserver/core/hardware_layers/PiPLC.cpp b/webserver/core/hardware_layers/PiPLC.cpp
index 934154c..40bb9bd 100755
--- a/webserver/core/hardware_layers/PiPLC.cpp
+++ b/webserver/core/hardware_layers/PiPLC.cpp
@@ -86,31 +86,25 @@ void initializeHardware()
//set pins as input
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), inBufferPinMask[i]))
- {
- gpioSetMode(inBufferPinMask[i], PI_INPUT);
- gpioSetPullUpDown(inBufferPinMask[i], PI_PUD_UP); //pull up enabled
- }
+ gpioSetMode(inBufferPinMask[i], PI_INPUT);
+ gpioSetPullUpDown(inBufferPinMask[i], PI_PUD_UP); //pull up enabled
}
//set pins as output
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), outBufferPinMask[i]))
- gpioSetMode(outBufferPinMask[i], PI_OUTPUT);
+ gpioSetMode(outBufferPinMask[i], PI_OUTPUT);
}
//set PWM pins as output
for (int i = 0; i < MAX_ANALOG_OUT; i++)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), analogOutBufferPinMask[i])){
- gpioSetMode(analogOutBufferPinMask[i], PI_ALT5);
- gpioSetPWMrange(analogOutBufferPinMask[i], 1024);
- }
+ gpioSetMode(analogOutBufferPinMask[i], PI_ALT5);
+ gpioSetPWMrange(analogOutBufferPinMask[i], 1024);
}
// Modbus
- rpi_modbus_rts_pin = MODBUS_RTS;
+ setModbusRtsPin(MODBUS_RTS);
// I²C?
@@ -138,8 +132,7 @@ void updateBuffersIn()
//INPUT
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), inBufferPinMask[i]))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = !gpioRead(inBufferPinMask[i]);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = !gpioRead(inBufferPinMask[i]);
}
pthread_mutex_unlock(&bufferLock); //unlock mutex
@@ -157,15 +150,13 @@ void updateBuffersOut()
//OUTPUT
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), outBufferPinMask[i]))
- if (bool_output[i/8][i%8] != NULL) gpioWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) gpioWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
}
//ANALOG OUT (PWM)
for (int i = 0; i < MAX_ANALOG_OUT; i++)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) gpioPWM(analogOutBufferPinMask[i], (*int_output[i] / 64));
+ if (int_output[i] != NULL) gpioPWM(analogOutBufferPinMask[i], (*int_output[i] / 64));
}
pthread_mutex_unlock(&bufferLock); //unlock mutex
diff --git a/webserver/core/hardware_layers/fischertechnik.cpp b/webserver/core/hardware_layers/fischertechnik.cpp
index f08a7de..b17113f 100755
--- a/webserver/core/hardware_layers/fischertechnik.cpp
+++ b/webserver/core/hardware_layers/fischertechnik.cpp
@@ -164,13 +164,11 @@ void updateBuffersIn()
pthread_mutex_lock(&bufferLock);
for (i=0; i<8; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[0][i] != NULL) sendBytes[1] = sendBytes[1] | (*bool_output[0][i] << i); //write each bit
+ if (bool_output[0][i] != NULL) sendBytes[1] = sendBytes[1] | (*bool_output[0][i] << i); //write each bit
}
for (i=8; i<16; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[1][i%8] != NULL) sendBytes[2] = sendBytes[2] | (*bool_output[1][i%8] << (i-8)); //write each bit
+ if (bool_output[1][i%8] != NULL) sendBytes[2] = sendBytes[2] | (*bool_output[1][i%8] << (i-8)); //write each bit
}
pthread_mutex_unlock(&bufferLock);
@@ -182,14 +180,12 @@ void updateBuffersIn()
for (i=0; i<8; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[0][i] != NULL) *bool_input[0][i] = (recvBytes[0] >> i) & 0x01;
+ if (bool_input[0][i] != NULL) *bool_input[0][i] = (recvBytes[0] >> i) & 0x01;
//printf("%d\t", DiscreteInputBuffer0[i]);
}
for (i=8; i<16; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[1][i%8] != NULL) *bool_input[1][i%8] = (recvBytes[1] >> (i-8)) & 0x01;
+ if (bool_input[1][i%8] != NULL) *bool_input[1][i%8] = (recvBytes[1] >> (i-8)) & 0x01;
//printf("%d\t", DiscreteInputBuffer0[i]);
}
//printf("\n");
@@ -211,13 +207,11 @@ void updateBuffersOut()
pthread_mutex_lock(&bufferLock);
for (i=0; i<8; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[0][i] != NULL) sendBytes[1] = sendBytes[1] | (*bool_output[0][i] << i); //write each bit
+ if (bool_output[0][i] != NULL) sendBytes[1] = sendBytes[1] | (*bool_output[0][i] << i); //write each bit
}
for (i=8; i<16; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[1][i%8] != NULL) sendBytes[2] = sendBytes[2] | (*bool_output[1][i%8] << (i-8)); //write each bit
+ if (bool_output[1][i%8] != NULL) sendBytes[2] = sendBytes[2] | (*bool_output[1][i%8] << (i-8)); //write each bit
}
pthread_mutex_unlock(&bufferLock);
@@ -229,14 +223,12 @@ void updateBuffersOut()
for (i=0; i<8; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[0][i] != NULL) *bool_input[0][i] = (recvBytes[0] >> i) & 0x01;
+ if (bool_input[0][i] != NULL) *bool_input[0][i] = (recvBytes[0] >> i) & 0x01;
//printf("%d\t", DiscreteInputBuffer0[i]);
}
for (i=8; i<16; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[1][i%8] != NULL) *bool_input[1][i%8] = (recvBytes[1] >> (i-8)) & 0x01;
+ if (bool_input[1][i%8] != NULL) *bool_input[1][i%8] = (recvBytes[1] >> (i-8)) & 0x01;
//printf("%d\t", DiscreteInputBuffer0[i]);
}
//printf("\n");
diff --git a/webserver/core/hardware_layers/neuron.cpp b/webserver/core/hardware_layers/neuron.cpp
index 548e7ed..aa640df 100755
--- a/webserver/core/hardware_layers/neuron.cpp
+++ b/webserver/core/hardware_layers/neuron.cpp
@@ -309,9 +309,7 @@ void updateBuffersIn()
int i = 0;
while (digital_inputs[i][0] != '\0')
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = requestSYSFS(digital_inputs[i], "read");
-
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = requestSYSFS(digital_inputs[i], "read");
i++;
}
@@ -319,13 +317,12 @@ void updateBuffersIn()
i = 0;
while (analog_inputs[i][0] != '\0')
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL)
- {
- uint32_t value = (uint32_t)((float)requestSYSFS(analog_inputs[i], "read") * 6.5535);
- if (value > 65535) value = 65535;
- *int_input[i] = (uint16_t)value;
- }
+ if (int_input[i] != NULL)
+ {
+ uint32_t value = (uint32_t)((float)requestSYSFS(analog_inputs[i], "read") * 6.5535);
+ if (value > 65535) value = 65535;
+ *int_input[i] = (uint16_t)value;
+ }
i++;
}
@@ -346,15 +343,12 @@ void updateBuffersOut()
int i = 0;
while (digital_outputs[i][0] != '\0')
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
+ if (bool_output[i/8][i%8] != NULL)
{
- if (bool_output[i/8][i%8] != NULL)
- {
- if (*bool_output[i/8][i%8])
- requestSYSFS(digital_outputs[i], "write=1");
- else
- requestSYSFS(digital_outputs[i], "write=0");
- }
+ if (*bool_output[i/8][i%8])
+ requestSYSFS(digital_outputs[i], "write=1");
+ else
+ requestSYSFS(digital_outputs[i], "write=0");
}
i++;
}
@@ -363,16 +357,13 @@ void updateBuffersOut()
i = 0;
while (analog_outputs[i][0] != '\0')
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
+ if (int_output[i] != NULL)
{
- if (int_output[i] != NULL)
- {
- char value_fmt[100];
- char value[100];
- strcpy(value_fmt, "write=%f");
- sprintf(value, value_fmt, ((float)*int_output[i]/6.5535));
- requestSYSFS(analog_outputs[i], value);
- }
+ char value_fmt[100];
+ char value[100];
+ strcpy(value_fmt, "write=%f");
+ sprintf(value, value_fmt, ((float)*int_output[i]/6.5535));
+ requestSYSFS(analog_outputs[i], value);
}
i++;
}
diff --git a/webserver/core/hardware_layers/opi_zero2.cpp b/webserver/core/hardware_layers/opi_zero2.cpp
index c7ff46f..7070c89 100644
--- a/webserver/core/hardware_layers/opi_zero2.cpp
+++ b/webserver/core/hardware_layers/opi_zero2.cpp
@@ -73,25 +73,20 @@ void initializeHardware()
//set pins as input
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- {
- pinMode(inBufferPinMask[i], INPUT);
- }
+ pinMode(inBufferPinMask[i], INPUT);
}
//set pins as output
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- pinMode(outBufferPinMask[i], OUTPUT);
+ pinMode(outBufferPinMask[i], OUTPUT);
}
// pwmSetRange(1024);
// pwmSetClock(1);
// //set PWM pins as output
// for (int i = 0; i < MAX_ANALOG_OUT; i++)
// {
- // if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), analogOutBufferPinMask[i])) {
- // pinMode(analogOutBufferPinMask[i], PWM_OUTPUT);
+ // pinMode(analogOutBufferPinMask[i], PWM_OUTPUT);
// }
// }
@@ -117,8 +112,7 @@ void updateBuffersIn()
//INPUT
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = digitalRead(inBufferPinMask[i]);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = digitalRead(inBufferPinMask[i]);
}
pthread_mutex_unlock(&bufferLock); //unlock mutex
@@ -136,14 +130,12 @@ void updateBuffersOut()
//OUTPUT
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) digitalWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) digitalWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
}
//ANALOG OUT (PWM)
// for (int i = 0; i < MAX_ANALOG_OUT; i++)
// {
- // if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- // if (int_output[i] != NULL) pwmWrite(analogOutBufferPinMask[i], (*int_output[i] / 64));
+ // if (int_output[i] != NULL) pwmWrite(analogOutBufferPinMask[i], (*int_output[i] / 64));
// }
pthread_mutex_unlock(&bufferLock); //unlock mutex
diff --git a/webserver/core/hardware_layers/pixtend.cpp b/webserver/core/hardware_layers/pixtend.cpp
index b853500..d23c1e9 100755
--- a/webserver/core/hardware_layers/pixtend.cpp
+++ b/webserver/core/hardware_layers/pixtend.cpp
@@ -844,8 +844,7 @@ void updateBuffersIn()
//DIGITAL INPUT
for (int i = 0; i < MAX_DIG_IN; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigIn, i);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigIn, i);
}
//ANALOG IN
@@ -853,8 +852,7 @@ void updateBuffersIn()
analogInputs = &InputData.wAi0;
for (int i = 0; i < MAX_ANALOG_IN; i++)
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = analogInputs[i];
+ if (int_input[i] != NULL) *int_input[i] = analogInputs[i];
}
//unlock mutexes
@@ -878,13 +876,11 @@ void updateBuffersOut()
{
if (i < 6)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigOut, i, *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigOut, i, *bool_output[i/8][i%8]);
}
else
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byRelayOut, i-6, *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byRelayOut, i-6, *bool_output[i/8][i%8]);
}
}
@@ -897,13 +893,11 @@ void updateBuffersOut()
{
if (i < 2)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) analogOutputs[i] = (*int_output[i] / 64);
+ if (int_output[i] != NULL) analogOutputs[i] = (*int_output[i] / 64);
}
else
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) pwmOutputs[i-2] = *int_output[i];
+ if (int_output[i] != NULL) pwmOutputs[i-2] = *int_output[i];
}
}
diff --git a/webserver/core/hardware_layers/pixtend2l.cpp b/webserver/core/hardware_layers/pixtend2l.cpp
index ed5ff02..dbf2e08 100644
--- a/webserver/core/hardware_layers/pixtend2l.cpp
+++ b/webserver/core/hardware_layers/pixtend2l.cpp
@@ -630,22 +630,19 @@ void updateBuffersIn()
//Read input pins 0-7
if (i < 7)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigitalIn0, i);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigitalIn0, i);
}
else
{
//Read input pins 8-15
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigitalIn1, i-(MAX_DIG_IN/2));
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigitalIn1, i-(MAX_DIG_IN/2));
}
}
//GPIO INPUT
for (int i = MAX_DIG_IN; i < MAX_DIG_IN+MAX_GPIO_IN; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byGPIOIn, i-MAX_DIG_IN);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byGPIOIn, i-MAX_DIG_IN);
}
// uint8_t byFirmware;
@@ -666,49 +663,44 @@ void updateBuffersIn()
{
if (i < MAX_ANALOG_IN)
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = analogInputs[i];
+ if (int_input[i] != NULL) *int_input[i] = analogInputs[i];
}
if ((i >= MAX_ANALOG_IN) && ( i < MAX_ANALOG_IN+MAX_TEMP_IN))
{
- if (i == MAX_ANALOG_IN){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp0;
+ if (i == MAX_ANALOG_IN)
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp0;
}
- if (i == (MAX_ANALOG_IN+1)){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp1;
+ if (i == (MAX_ANALOG_IN+1))
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp1;
}
- if (i == (MAX_ANALOG_IN+2)){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp2;
+ if (i == (MAX_ANALOG_IN+2))
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp2;
}
- if (i == (MAX_ANALOG_IN+3)){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp3;
+ if (i == (MAX_ANALOG_IN+3))
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp3;
}
}
if ((i >= (MAX_ANALOG_IN+MAX_TEMP_IN)) && ( i < (MAX_ANALOG_IN+MAX_TEMP_IN+MAX_HUMID_IN)))
{
if (i == (MAX_ANALOG_IN+MAX_TEMP_IN))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid0;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid0;
}
if (i == ((MAX_ANALOG_IN+MAX_TEMP_IN)+1))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid1;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid1;
}
if (i == ((MAX_ANALOG_IN+MAX_TEMP_IN)+2))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid2;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid2;
}
if (i == ((MAX_ANALOG_IN+MAX_TEMP_IN)+3))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid3;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid3;
}
}
}
@@ -738,13 +730,11 @@ void updateBuffersOut()
{
if (i < MAX_DIG_OUT-4)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigitalOut0, i, *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigitalOut0, i, *bool_output[i/8][i%8]);
}
else
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigitalOut1, i - (MAX_DIG_OUT-4), *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigitalOut1, i - (MAX_DIG_OUT-4), *bool_output[i/8][i%8]);
}
}
}
@@ -754,8 +744,7 @@ void updateBuffersOut()
{
if ((i >= MAX_DIG_OUT) && (i < (MAX_DIG_OUT+MAX_REL_OUT)))
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byRelayOut, i-MAX_DIG_OUT, *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byRelayOut, i-MAX_DIG_OUT, *bool_output[i/8][i%8]);
}
}
@@ -764,8 +753,7 @@ void updateBuffersOut()
{
if ((i >= MAX_DIG_OUT+MAX_REL_OUT) && (i < (MAX_DIG_OUT+MAX_REL_OUT+MAX_GPIO_OUT)))
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byGPIOOut, i-(MAX_DIG_OUT+MAX_REL_OUT), *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byGPIOOut, i-(MAX_DIG_OUT+MAX_REL_OUT), *bool_output[i/8][i%8]);
}
}
@@ -779,28 +767,23 @@ void updateBuffersOut()
if (i < 2)
{
//int_output[0] and int_output[1]
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) analogOutputs[i] = (*int_output[i] / 64);
+ if (int_output[i] != NULL) analogOutputs[i] = (*int_output[i] / 64);
}
else
{
//int_output[2], 3, 4, 5, 6, 7
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) pwmOutputs[i-2] = *int_output[i];
+ if (int_output[i] != NULL) pwmOutputs[i-2] = *int_output[i];
}
}
inum = MAX_ANALOG_OUT;
// PWM0Ctrl1L - PWM0Ctrl1H - 8
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), inum))
- if (int_output[inum] != NULL) OutputData.wPWM0Ctrl1 = *int_output[inum];
+ if (int_output[inum] != NULL) OutputData.wPWM0Ctrl1 = *int_output[inum];
inum++;
// PWM1Ctrl1L - PWM1Ctrl1H - 9
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), inum))
- if (int_output[inum] != NULL) OutputData.wPWM1Ctrl1 = *int_output[inum];
+ if (int_output[inum] != NULL) OutputData.wPWM1Ctrl1 = *int_output[inum];
inum++;
// PWM2Ctrl1L - PWM2Ctrl1H - 10
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), inum))
- if (int_output[inum] != NULL) OutputData.wPWM2Ctrl1 = *int_output[inum];
+ if (int_output[inum] != NULL) OutputData.wPWM2Ctrl1 = *int_output[inum];
inum = 0;
// UCCtrl0 - 0
if (byte_output[inum] != NULL) OutputData.byUCCtrl0 = *byte_output[inum];
diff --git a/webserver/core/hardware_layers/pixtend2s.cpp b/webserver/core/hardware_layers/pixtend2s.cpp
index 99bbe1c..f88377b 100755
--- a/webserver/core/hardware_layers/pixtend2s.cpp
+++ b/webserver/core/hardware_layers/pixtend2s.cpp
@@ -564,15 +564,13 @@ void updateBuffersIn()
//DIGITAL INPUT
for (int i = 0; i < MAX_DIG_IN; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigitalIn, i);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byDigitalIn, i);
}
//GPIO INPUT
for (int i = MAX_DIG_IN; i < MAX_DIG_IN+MAX_GPIO_IN; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byGPIOIn, i-MAX_DIG_IN);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = bitRead(InputData.byGPIOIn, i-MAX_DIG_IN);
}
// uint8_t byFirmware;
@@ -593,49 +591,44 @@ void updateBuffersIn()
{
if (i < MAX_ANALOG_IN)
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = analogInputs[i];
+ if (int_input[i] != NULL) *int_input[i] = analogInputs[i];
}
if ((i >= MAX_ANALOG_IN) && ( i < MAX_ANALOG_IN+MAX_TEMP_IN))
{
- if (i == MAX_ANALOG_IN){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp0;
+ if (i == MAX_ANALOG_IN)
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp0;
}
- if (i == (MAX_ANALOG_IN+1)){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp1;
+ if (i == (MAX_ANALOG_IN+1))
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp1;
}
- if (i == (MAX_ANALOG_IN+2)){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp2;
+ if (i == (MAX_ANALOG_IN+2))
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp2;
}
- if (i == (MAX_ANALOG_IN+3)){
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wTemp3;
+ if (i == (MAX_ANALOG_IN+3))
+ {
+ if (int_input[i] != NULL) *int_input[i] = InputData.wTemp3;
}
}
if ((i >= (MAX_ANALOG_IN+MAX_TEMP_IN)) && ( i < (MAX_ANALOG_IN+MAX_TEMP_IN+MAX_HUMID_IN)))
{
if (i == (MAX_ANALOG_IN+MAX_TEMP_IN))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid0;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid0;
}
if (i == ((MAX_ANALOG_IN+MAX_TEMP_IN)+1))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid1;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid1;
}
if (i == ((MAX_ANALOG_IN+MAX_TEMP_IN)+2))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid2;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid2;
}
if (i == ((MAX_ANALOG_IN+MAX_TEMP_IN)+3))
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = InputData.wHumid3;
+ if (int_input[i] != NULL) *int_input[i] = InputData.wHumid3;
}
}
@@ -662,8 +655,7 @@ void updateBuffersOut()
{
if (i < MAX_DIG_OUT)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigitalOut, i, *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byDigitalOut, i, *bool_output[i/8][i%8]);
}
}
@@ -672,8 +664,7 @@ void updateBuffersOut()
{
if ((i >= MAX_DIG_OUT) && (i < (MAX_DIG_OUT+MAX_REL_OUT)))
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byRelayOut, i-MAX_DIG_OUT, *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byRelayOut, i-MAX_DIG_OUT, *bool_output[i/8][i%8]);
}
}
@@ -682,8 +673,7 @@ void updateBuffersOut()
{
if ((i >= MAX_DIG_OUT+MAX_REL_OUT) && (i < (MAX_DIG_OUT+MAX_REL_OUT+MAX_GPIO_OUT)))
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byGPIOOut, i-(MAX_DIG_OUT+MAX_REL_OUT), *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) bitWrite(OutputData.byGPIOOut, i-(MAX_DIG_OUT+MAX_REL_OUT), *bool_output[i/8][i%8]);
}
}
@@ -696,18 +686,15 @@ void updateBuffersOut()
{
if (i < 2)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) analogOutputs[i] = (*int_output[i] / 64);
+ if (int_output[i] != NULL) analogOutputs[i] = (*int_output[i] / 64);
}
else
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) pwmOutputs[i-2] = *int_output[i];
+ if (int_output[i] != NULL) pwmOutputs[i-2] = *int_output[i];
}
}
// PWM0Ctrl1L - PWM0Ctrl1H
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), 4))
- if (int_output[4] != NULL) OutputData.wPWM0Ctrl1 = *int_output[4];
+ if (int_output[4] != NULL) OutputData.wPWM0Ctrl1 = *int_output[4];
// UCCtrl0
if (byte_output[0] != NULL) OutputData.byUCCtrl0 = *byte_output[0];
diff --git a/webserver/core/hardware_layers/raspberrypi.cpp b/webserver/core/hardware_layers/raspberrypi.cpp
index dbe8ad8..d1daaa6 100755
--- a/webserver/core/hardware_layers/raspberrypi.cpp
+++ b/webserver/core/hardware_layers/raspberrypi.cpp
@@ -73,30 +73,24 @@ void initializeHardware()
//set pins as input
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), inBufferPinMask[i]))
+ gpioSetMode(inBufferPinMask[i], PI_INPUT);
+ if (i != 0 && i != 1) //pull down can't be enabled on the first two pins
{
- gpioSetMode(inBufferPinMask[i], PI_INPUT);
- if (i != 0 && i != 1) //pull down can't be enabled on the first two pins
- {
- gpioSetPullUpDown(inBufferPinMask[i], PI_PUD_DOWN); //pull down enabled
- }
+ gpioSetPullUpDown(inBufferPinMask[i], PI_PUD_DOWN); //pull down enabled
}
}
//set pins as output
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), outBufferPinMask[i]))
- gpioSetMode(outBufferPinMask[i], PI_OUTPUT);
+ gpioSetMode(outBufferPinMask[i], PI_OUTPUT);
}
//set PWM pins as output
for (int i = 0; i < MAX_ANALOG_OUT; i++)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), analogOutBufferPinMask[i])) {
- gpioSetMode(analogOutBufferPinMask[i], PI_ALT5);
+ gpioSetMode(analogOutBufferPinMask[i], PI_ALT5);
gpioSetPWMrange(analogOutBufferPinMask[i], 1024);
- }
}
}
@@ -121,8 +115,7 @@ void updateBuffersIn()
//INPUT
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), inBufferPinMask[i]))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = gpioRead(inBufferPinMask[i]);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = gpioRead(inBufferPinMask[i]);
}
pthread_mutex_unlock(&bufferLock); //unlock mutex
@@ -140,15 +133,13 @@ void updateBuffersOut()
//OUTPUT
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), outBufferPinMask[i]))
- if (bool_output[i/8][i%8] != NULL) gpioWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) gpioWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
}
//ANALOG OUT (PWM)
for (int i = 0; i < MAX_ANALOG_OUT; i++)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) gpioPWM(analogOutBufferPinMask[i], (*int_output[i] / 64));
+ if (int_output[i] != NULL) gpioPWM(analogOutBufferPinMask[i], (*int_output[i] / 64));
}
pthread_mutex_unlock(&bufferLock); //unlock mutex
diff --git a/webserver/core/hardware_layers/raspberrypi_old.cpp b/webserver/core/hardware_layers/raspberrypi_old.cpp
index a8de9d3..3fae169 100755
--- a/webserver/core/hardware_layers/raspberrypi_old.cpp
+++ b/webserver/core/hardware_layers/raspberrypi_old.cpp
@@ -74,28 +74,23 @@ void initializeHardware()
//set pins as input
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
+ pinMode(inBufferPinMask[i], INPUT);
+ if (i != 0 && i != 1) //pull down can't be enabled on the first two pins
{
- pinMode(inBufferPinMask[i], INPUT);
- if (i != 0 && i != 1) //pull down can't be enabled on the first two pins
- {
- pullUpDnControl(inBufferPinMask[i], PUD_DOWN); //pull down enabled
- }
+ pullUpDnControl(inBufferPinMask[i], PUD_DOWN); //pull down enabled
}
}
//set pins as output
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- pinMode(outBufferPinMask[i], OUTPUT);
+ pinMode(outBufferPinMask[i], OUTPUT);
}
//set PWM pins as output
for (int i = 0; i < MAX_ANALOG_OUT; i++)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- pinMode(analogOutBufferPinMask[i], PWM_OUTPUT);
+ pinMode(analogOutBufferPinMask[i], PWM_OUTPUT);
}
}
@@ -119,8 +114,7 @@ void updateBuffersIn()
//INPUT
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = digitalRead(inBufferPinMask[i]);
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = digitalRead(inBufferPinMask[i]);
}
pthread_mutex_unlock(&bufferLock); //unlock mutex
@@ -138,15 +132,13 @@ void updateBuffersOut()
//OUTPUT
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) digitalWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
+ if (bool_output[i/8][i%8] != NULL) digitalWrite(outBufferPinMask[i], *bool_output[i/8][i%8]);
}
//ANALOG OUT (PWM)
for (int i = 0; i < MAX_ANALOG_OUT; i++)
{
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), i))
- if (int_output[i] != NULL) pwmWrite(analogOutBufferPinMask[i], (*int_output[i] / 64));
+ if (int_output[i] != NULL) pwmWrite(analogOutBufferPinMask[i], (*int_output[i] / 64));
}
pthread_mutex_unlock(&bufferLock); //unlock mutex
diff --git a/webserver/core/hardware_layers/unipi.cpp b/webserver/core/hardware_layers/unipi.cpp
index bede4f6..13d5ae4 100755
--- a/webserver/core/hardware_layers/unipi.cpp
+++ b/webserver/core/hardware_layers/unipi.cpp
@@ -172,21 +172,16 @@ void initializeHardware()
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- pinMode(DOUT_PINBASE + i, OUTPUT);
+ pinMode(DOUT_PINBASE + i, OUTPUT);
}
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- {
- pinMode(inputPinMask[i], INPUT);
- pullUpDnControl(inputPinMask[i], PUD_UP);
- }
+ pinMode(inputPinMask[i], INPUT);
+ pullUpDnControl(inputPinMask[i], PUD_UP);
}
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), ANALOG_OUT_PIN))
- pinMode(ANALOG_OUT_PIN, PWM_OUTPUT);
+ pinMode(ANALOG_OUT_PIN, PWM_OUTPUT);
pthread_t ADCthread;
pthread_create(&ADCthread, NULL, readAdcThread, NULL);
@@ -211,15 +206,13 @@ void updateBuffersIn()
pthread_mutex_lock(&bufferLock); //lock mutex
for (int i = 0; i < MAX_INPUT; i++)
{
- if (pinNotPresent(ignored_bool_inputs, ARRAY_SIZE(ignored_bool_inputs), i))
- if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = !digitalRead(inputPinMask[i]); //printf("[IO%d]: %d | ", i, !digitalRead(inputPinMask[i]));
+ if (bool_input[i/8][i%8] != NULL) *bool_input[i/8][i%8] = !digitalRead(inputPinMask[i]); //printf("[IO%d]: %d | ", i, !digitalRead(inputPinMask[i]));
}
//printf("\nAnalog Inputs:");
for (int i = 0; i < 2; i++)
{
- if (pinNotPresent(ignored_int_inputs, ARRAY_SIZE(ignored_int_inputs), i))
- if (int_input[i] != NULL) *int_input[i] = mcp_adcRead(i); //printf("[AI%d]: %d | ", i, mcp_adcRead(i));
+ if (int_input[i] != NULL) *int_input[i] = mcp_adcRead(i); //printf("[AI%d]: %d | ", i, mcp_adcRead(i));
}
//printf("\n");
@@ -238,12 +231,10 @@ void updateBuffersOut()
//printf("\nDigital Outputs:\n");
for (int i = 0; i < MAX_OUTPUT; i++)
{
- if (pinNotPresent(ignored_bool_outputs, ARRAY_SIZE(ignored_bool_outputs), i))
- if (bool_output[i/8][i%8] != NULL) digitalWrite(DOUT_PINBASE + i, *bool_output[i/8][i%8]); //printf("[IO%d]: %d | ", i, digitalRead(DOUT_PINBASE + i));
+ if (bool_output[i/8][i%8] != NULL) digitalWrite(DOUT_PINBASE + i, *bool_output[i/8][i%8]); //printf("[IO%d]: %d | ", i, digitalRead(DOUT_PINBASE + i));
}
- if (pinNotPresent(ignored_int_outputs, ARRAY_SIZE(ignored_int_outputs), 0))
- if(int_output[0] != NULL) pwmWrite(ANALOG_OUT_PIN, (*int_output[0] / 64));
+ if(int_output[0] != NULL) pwmWrite(ANALOG_OUT_PIN, (*int_output[0] / 64));
pthread_mutex_unlock(&bufferLock); //unlock mutex
}
diff --git a/webserver/core/ladder.h b/webserver/core/ladder.h
index c6fe500..0d4603e 100644
--- a/webserver/core/ladder.h
+++ b/webserver/core/ladder.h
@@ -109,24 +109,22 @@ void finalizeHardware();
void updateBuffersIn();
void updateBuffersOut();
-//custom_layer.h
-void initCustomLayer();
-void updateCustomIn();
-void updateCustomOut();
-extern int ignored_bool_inputs[];
-extern int ignored_bool_outputs[];
-extern int ignored_int_inputs[];
-extern int ignored_int_outputs[];
-
-//main.cpp
+//utils.cpp
void sleep_until(struct timespec *ts, long long delay);
void sleepms(int milliseconds);
void log(char *logmsg);
-bool pinNotPresent(int *ignored_vector, int vector_size, int pinNumber);
-extern uint8_t run_openplc;
+void handleSpecialFunctions();
+void timespec_diff(struct timespec *a, struct timespec *b, struct timespec *result);
+void *interactiveServerThread(void *arg);
+void disableOutputs();
+void RecordCycletimeLatency(long cycle_time, long sleep_latency);
+
+void setModbusRtsPin(uint8_t pin);
extern unsigned char log_buffer[1000000];
extern int log_index;
-void handleSpecialFunctions();
+
+//main.cpp
+extern uint8_t run_openplc;
//server.cpp
void startServer(uint16_t port, int protocol_type);
diff --git a/webserver/core/main.cpp b/webserver/core/main.cpp
index 607b7ef..21a989a 100644
--- a/webserver/core/main.cpp
+++ b/webserver/core/main.cpp
@@ -1,6 +1,6 @@
//-----------------------------------------------------------------------------
// Copyright 2018 Thiago Alves
-// This file is part of the OpenPLC Software Stack.
+// This file is part of the OpenPLC Runtime.
//
// OpenPLC is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -39,175 +39,11 @@
#define OPLC_CYCLE 50000000
extern int opterr;
-//extern int common_ticktime__;
IEC_BOOL __DEBUG;
-IEC_LINT cycle_counter = 0;
-
unsigned long __tick = 0;
pthread_mutex_t bufferLock; //mutex for the internal buffers
-pthread_mutex_t logLock; //mutex for the internal log
uint8_t run_openplc = 1; //Variable to control OpenPLC Runtime execution
-unsigned char log_buffer[1000000]; //A very large buffer to store all logs
-int log_index = 0;
-int log_counter = 0;
-
-//-----------------------------------------------------------------------------
-// Helper function - Makes the running thread sleep for the ammount of time
-// in milliseconds
-//-----------------------------------------------------------------------------
-void sleep_until(struct timespec *ts, long long delay)
-{
- ts->tv_sec += delay / (1000*1000*1000);
- ts->tv_nsec += delay % (1000*1000*1000);
- if(ts->tv_nsec >= 1000*1000*1000)
- {
- ts->tv_nsec -= 1000*1000*1000;
- ts->tv_sec++;
- }
- clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL);
-}
-
-//-----------------------------------------------------------------------------
-// Helper function - Makes the running thread sleep for the ammount of time
-// in milliseconds
-//-----------------------------------------------------------------------------
-void sleepms(int milliseconds)
-{
- struct timespec ts;
- ts.tv_sec = milliseconds / 1000;
- ts.tv_nsec = (milliseconds % 1000) * 1000000;
- nanosleep(&ts, NULL);
-}
-
-/**
- * @fn timespec_diff(struct timespec *, struct timespec *, struct timespec *)
- * @brief Compute the diff of two timespecs, that is a - b = result.
- * @param a the minuend
- * @param b the subtrahend
- * @param result a - b
- */
-static inline void timespec_diff(struct timespec *a, struct timespec *b, struct timespec *result) {
- result->tv_sec = a->tv_sec - b->tv_sec;
- result->tv_nsec = a->tv_nsec - b->tv_nsec;
- if (result->tv_nsec < 0) {
- --result->tv_sec;
- result->tv_nsec += 1000000000L;
- }
-}
-
-//-----------------------------------------------------------------------------
-// Helper function - Logs messages and print them on the console
-//-----------------------------------------------------------------------------
-void log(char *logmsg)
-{
- pthread_mutex_lock(&logLock); //lock mutex
- printf("%s", logmsg);
- for (int i = 0; logmsg[i] != '\0'; i++)
- {
- log_buffer[log_index] = (unsigned char)logmsg[i];
- log_index++;
- log_buffer[log_index] = '\0';
- }
-
- log_counter++;
- if (log_counter >= 1000)
- {
- /*Store current log on a file*/
- log_counter = 0;
- log_index = 0;
- }
- pthread_mutex_unlock(&logLock); //unlock mutex
-}
-
-//-----------------------------------------------------------------------------
-// Interactive Server Thread. Creates the server to listen to commands on
-// localhost
-//-----------------------------------------------------------------------------
-void *interactiveServerThread(void *arg)
-{
- startInteractiveServer(43628);
-}
-
-//-----------------------------------------------------------------------------
-// Verify if pin is present in one of the ignored vectors
-//-----------------------------------------------------------------------------
-bool pinNotPresent(int *ignored_vector, int vector_size, int pinNumber)
-{
- for (int i = 0; i < vector_size; i++)
- {
- if (ignored_vector[i] == pinNumber)
- return false;
- }
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Disable all outputs
-//-----------------------------------------------------------------------------
-void disableOutputs()
-{
- //Disable digital outputs
- for (int i = 0; i < BUFFER_SIZE; i++)
- {
- for (int j = 0; j < 8; j++)
- {
- if (bool_output[i][j] != NULL) *bool_output[i][j] = 0;
- }
- }
-
- //Disable byte outputs
- for (int i = 0; i < BUFFER_SIZE; i++)
- {
- if (byte_output[i] != NULL) *byte_output[i] = 0;
- }
-
- //Disable analog outputs
- for (int i = 0; i < BUFFER_SIZE; i++)
- {
- if (int_output[i] != NULL) *int_output[i] = 0;
- }
-}
-
-//-----------------------------------------------------------------------------
-// Special Functions
-//-----------------------------------------------------------------------------
-void handleSpecialFunctions()
-{
- //current time [%ML1024]
- struct tm *current_time;
- time_t rawtime;
-
- time(&rawtime);
- // store the UTC clock in [%ML1027]
- if (special_functions[3] != NULL) *special_functions[3] = rawtime;
-
- current_time = localtime(&rawtime);
-
- rawtime = rawtime - timezone;
- if (current_time->tm_isdst > 0) rawtime = rawtime + 3600;
-
- if (special_functions[0] != NULL) *special_functions[0] = rawtime;
-
- //number of cycles [%ML1025]
- cycle_counter++;
- if (special_functions[1] != NULL) *special_functions[1] = cycle_counter;
-
- //comm error counter [%ML1026]
- /* Implemented in modbus_master.cpp */
-
- //insert other special functions below
-}
-
-//-----------------------------------------------------------------------------
-// Using special_functions to store REAL-TIME variables
-//-----------------------------------------------------------------------------
-void RecordCycletimeLatency(long cycle_time, long sleep_latency)
-{
- if (special_functions[4] != NULL) *special_functions[4] = cycle_time;
- if (special_functions[5] != NULL) *special_functions[5] = sleep_latency;
-}
// pointers to IO *array[const][const] from cpp to c and back again don't work as expected, so instead callbacks
u_int8_t *bool_input_call_back(int a, int b){ return bool_input[a][b]; }
@@ -266,11 +102,8 @@ int main(int argc,char **argv)
#endif
initializeHardware();
initializeMB();
- initCustomLayer();
updateBuffersIn();
- updateCustomIn();
updateBuffersOut();
- updateCustomOut();
//======================================================
// PERSISTENT STORAGE INITIALIZATION
@@ -358,11 +191,9 @@ int main(int argc,char **argv)
break;
}
#endif
- updateCustomIn();
updateBuffersIn_MB(); //update input image table with data from slave devices
handleSpecialFunctions();
config_run__(__tick++); // execute plc program logic
- updateCustomOut();
updateBuffersOut_MB(); //update slave devices with data from the output image table
pthread_mutex_unlock(&bufferLock); //unlock mutex
@@ -413,9 +244,8 @@ int main(int argc,char **argv)
#endif
printf("Disabling outputs\n");
disableOutputs();
- updateCustomOut();
updateBuffersOut();
finalizeHardware();
printf("Shutting down OpenPLC Runtime...\n");
exit(0);
-}
+}
\ No newline at end of file
diff --git a/webserver/core/modbus_master.cpp b/webserver/core/modbus_master.cpp
index c3733ad..480fe13 100755
--- a/webserver/core/modbus_master.cpp
+++ b/webserver/core/modbus_master.cpp
@@ -49,7 +49,7 @@ uint8_t bool_input_buf[MAX_MB_IO];
uint8_t bool_output_buf[MAX_MB_IO];
uint16_t int_input_buf[MAX_MB_IO];
uint16_t int_output_buf[MAX_MB_IO];
-uint8_t rpi_modbus_rts_pin; // If <> 0, expect hardware RTS to be used with this pin
+extern uint8_t rpi_modbus_rts_pin; // If <> 0, expect hardware RTS to be used with this pin
pthread_mutex_t ioLock;
@@ -650,8 +650,9 @@ void initializeMB()
mb_devices[i].rtu_parity, mb_devices[i].rtu_data_bit,
mb_devices[i].rtu_stop_bit);
- // If hardware layer set modbus_rts_pin, enable Pi specific rts handling handling
- if (rpi_modbus_rts_pin != 0) {
+ // If hardware layer set modbus_rts_pin, enable Pi specific rts handling
+ if (rpi_modbus_rts_pin != 0)
+ {
modbus_enable_rpi(mb_devices[i].mb_ctx,TRUE);
modbus_configure_rpi_bcm_pin(mb_devices[i].mb_ctx,rpi_modbus_rts_pin);
modbus_rpi_pin_export_direction(mb_devices[i].mb_ctx);
diff --git a/webserver/core/utils.cpp b/webserver/core/utils.cpp
new file mode 100644
index 0000000..89eff66
--- /dev/null
+++ b/webserver/core/utils.cpp
@@ -0,0 +1,281 @@
+//-----------------------------------------------------------------------------
+// Copyright 2024 Thiago Alves
+// This file is part of the OpenPLC Runtime.
+//
+// OpenPLC is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// OpenPLC is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with OpenPLC. If not, see .
+//------
+//
+// This is the main file for the OpenPLC. It contains the initialization
+// procedures for the hardware, network and the main loop
+// Thiago Alves, Oct 2024
+//-----------------------------------------------------------------------------
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "ladder.h"
+
+pthread_mutex_t logLock; //mutex for the internal log
+unsigned char log_buffer[1000000]; //A very large buffer to store all logs
+int log_index = 0;
+int log_counter = 0;
+int64_t cycle_counter = 0;
+uint8_t rpi_modbus_rts_pin; // If <> 0, expect hardware RTS to be used with this pin
+
+/**
+ * @brief Makes the running thread sleep for the specified amount of time
+ *
+ * This function adjusts the given timespec structure by adding the specified delay,
+ * and then uses clock_nanosleep to make the thread sleep until the adjusted time.
+ *
+ * @param ts Pointer to a timespec structure representing the start time
+ * @param delay The amount of time to sleep in nanoseconds
+ */
+void sleep_until(struct timespec *ts, long long delay)
+{
+ ts->tv_sec += delay / (1000*1000*1000);
+ ts->tv_nsec += delay % (1000*1000*1000);
+ if(ts->tv_nsec >= 1000*1000*1000)
+ {
+ ts->tv_nsec -= 1000*1000*1000;
+ ts->tv_sec++;
+ }
+ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL);
+}
+
+/**
+ * @brief Makes the running thread sleep for the specified amount of time in milliseconds
+ *
+ * This function creates a timespec structure based on the given milliseconds,
+ * and then uses nanosleep to make the thread sleep for the specified duration.
+ *
+ * @param milliseconds The amount of time to sleep in milliseconds
+ */
+void sleepms(int milliseconds)
+{
+ struct timespec ts;
+ ts.tv_sec = milliseconds / 1000;
+ ts.tv_nsec = (milliseconds % 1000) * 1000000;
+ nanosleep(&ts, NULL);
+}
+
+/**
+ * @brief Compute the difference between two timespec structures
+ *
+ * This function calculates the difference between two timespec structures,
+ * where the result is (a - b). It handles cases where the nanosecond
+ * field may need to borrow from the second field.
+ *
+ * @param a Pointer to the minuend timespec
+ * @param b Pointer to the subtrahend timespec
+ * @param result Pointer to the timespec where the difference will be stored
+ */
+void timespec_diff(struct timespec *a, struct timespec *b, struct timespec *result)
+{
+ // Calculate the difference in seconds
+ result->tv_sec = a->tv_sec - b->tv_sec;
+
+ // Calculate the difference in nanoseconds
+ result->tv_nsec = a->tv_nsec - b->tv_nsec;
+
+ // Handle borrowing if nanoseconds are negative
+ if (result->tv_nsec < 0)
+ {
+ // Borrow 1 second (1e9 nanoseconds)
+ --result->tv_sec;
+ result->tv_nsec += 1000000000L;
+ }
+}
+
+/**
+ * @brief Logs messages and prints them on the console
+ *
+ * This function logs messages to a global buffer and prints them to the console.
+ * It uses a mutex to ensure thread-safe access to the shared log buffer.
+ *
+ * @param logmsg Pointer to a null-terminated string containing the message to be logged
+ */
+void log(char *logmsg)
+{
+ pthread_mutex_lock(&logLock); // lock mutex
+
+ printf("%s", logmsg);
+
+ size_t msg_len = strlen(logmsg);
+ if (log_index + msg_len >= sizeof(log_buffer) - 1)
+ {
+ // Buffer overflow protection: clear the buffer if it's nearly full
+ log_index = 0;
+ }
+
+ memcpy(&log_buffer[log_index], logmsg, msg_len);
+ log_index += msg_len;
+ log_buffer[log_index] = '\0';
+
+ log_counter++;
+ if (log_counter >= 1000)
+ {
+ // Clear log buffer
+ log_counter = 0;
+ log_index = 0;
+ }
+
+ pthread_mutex_unlock(&logLock); // unlock mutex
+}
+
+/**
+ * @brief Creates the server to listen to commands on localhost
+ *
+ * This function starts an interactive server on a specified port to handle
+ * incoming commands.
+ *
+ * @param arg Unused parameter (required for pthread creation)
+ * @return void* Always returns NULL
+ */
+void *interactiveServerThread(void *arg)
+{
+ startInteractiveServer(43628);
+ return NULL;
+}
+
+/**
+ * @brief Disables all outputs
+ *
+ * This function sets all digital, byte, and analog outputs to zero,
+ * effectively disabling them.
+ */
+void disableOutputs()
+{
+ //Disable digital outputs
+ for (int i = 0; i < BUFFER_SIZE; i++)
+ {
+ for (int j = 0; j < 8; j++)
+ {
+ if (bool_output[i][j] != NULL) *bool_output[i][j] = 0;
+ }
+ }
+
+ //Disable byte outputs
+ for (int i = 0; i < BUFFER_SIZE; i++)
+ {
+ if (byte_output[i] != NULL) *byte_output[i] = 0;
+ }
+
+ //Disable analog outputs
+ for (int i = 0; i < BUFFER_SIZE; i++)
+ {
+ if (int_output[i] != NULL) *int_output[i] = 0;
+ }
+}
+
+/**
+ * @brief Handles special functions for the OpenPLC runtime
+ *
+ * This function manages various special functions, including:
+ * - Current time (stored in %ML1024)
+ * - UTC time (stored in %ML1027)
+ * - Number of cycles (stored in %ML1025)
+ * - Communication error counter (implemented elsewhere)
+ *
+ * @note The function assumes that the `special_functions` array is properly initialized
+ * and that indices 0, 1, and 3 are valid.
+ */
+void handleSpecialFunctions()
+{
+ time_t rawtime;
+ struct tm *current_time;
+
+ time(&rawtime);
+
+ // Store the UTC clock in [%ML1027]
+ if (special_functions[3] != NULL)
+ {
+ *special_functions[3] = rawtime;
+ }
+
+ current_time = localtime(&rawtime);
+
+ // Adjust for local time
+ time_t localtime = rawtime - timezone;
+ if (current_time->tm_isdst > 0)
+ {
+ localtime += 3600; // Add one hour for daylight saving time
+ }
+
+ // Store local time in [%ML1024]
+ if (special_functions[0] != NULL)
+ {
+ *special_functions[0] = localtime;
+ }
+
+ // Increment and store number of cycles [%ML1025]
+ cycle_counter++;
+ if (special_functions[1] != NULL)
+ {
+ *special_functions[1] = cycle_counter;
+ }
+
+ // Communication error counter [%ML1026]
+ /* Implemented in modbus_master.cpp */
+
+ // Insert other special functions below
+}
+
+/**
+ * @brief Records cycle time and sleep latency in special function registers
+ *
+ * This function stores the cycle time and sleep latency values in the special
+ * function registers. These values are typically used for real-time performance
+ * monitoring and diagnostics.
+ *
+ * @param cycle_time The execution time of the PLC cycle in microseconds
+ * @param sleep_latency The latency between cycles in microseconds
+ *
+ * @note The function assumes that special_functions[4] and special_functions[5]
+ * are properly initialized and point to valid memory locations.
+ */
+void RecordCycletimeLatency(long cycle_time, long sleep_latency)
+{
+ if (special_functions[4] != NULL)
+ {
+ *special_functions[4] = static_cast(cycle_time);
+ }
+
+ if (special_functions[5] != NULL)
+ {
+ *special_functions[5] = static_cast(sleep_latency);
+ }
+}
+
+/**
+ * @brief Sets the Modbus RTS (Request to Send) pin
+ *
+ * This function sets the GPIO pin number to be used for hardware RTS control
+ * in Modbus RTU over RS485.
+ *
+ * @param pin The GPIO pin number to be used for RTS control
+ *
+ * @note This function assumes that the external variable rpi_modbus_rts_pin
+ * is properly declared and accessible.
+ */
+void setModbusRtsPin(uint8_t pin)
+{
+ rpi_modbus_rts_pin = pin;
+}
diff --git a/webserver/pages.py b/webserver/pages.py
index f804ce3..dfcfd96 100644
--- a/webserver/pages.py
+++ b/webserver/pages.py
@@ -134,6 +134,7 @@ login_body = """
+