Skip to content
Snippets Groups Projects
Commit aedda9fb authored by 최재웅's avatar 최재웅
Browse files

Modify URI and functions.

parent b2fcab77
Branches master
No related tags found
No related merge requests found
......@@ -107,7 +107,7 @@ if __name__ == "__main__":
count = 0
max = 0
while count < 3000:
while count < 1000:
axes = adxl345.getAxes(True)
if max < math.sqrt(axes['x'] * axes['x'] + axes['y'] * axes['y'] + axes['z'] * axes['z']):
max = math.sqrt(axes['x'] * axes['x'] + axes['y'] * axes['y'] + axes['z'] * axes['z'])
......
......@@ -10,7 +10,7 @@ var fs = require('fs');
var xml2js = require('xml2js');
var exec = require("child_process").exec;
var events = require('events');
var request = require('request');
var wdt = require('./wdt');
var useparentport = '';
......@@ -21,6 +21,8 @@ var download_arr = [];
var conf = {};
var sleeping;
// This is an async file read
fs.readFile('conf.xml', 'utf-8', function (err, data) {
if (err) {
......@@ -63,7 +65,6 @@ fs.readFile('conf.xml', 'utf-8', function (err, data) {
}
});
var tas_state = 'init';
var upload_client = null;
......@@ -104,6 +105,8 @@ function on_receive(data) {
if (download_arr[j].ctname == sink_obj.ctname) {
g_down_buf = JSON.stringify({id: download_arr[i].id, con: sink_obj.con});
console.log(g_down_buf + ' <----');
if(sink_obj.ctname == 'cnt-sleeping')
sleeping = sink_obj.con;
break;
}
}
......@@ -115,6 +118,7 @@ function on_receive(data) {
}
function tas_watchdog() {
console.log(download_arr);
if(tas_state == 'init') {
upload_client = new net.Socket();
......@@ -157,14 +161,32 @@ function tas_watchdog() {
}
wdt.set_wdt(require('shortid').generate(), 3, tas_watchdog);
wdt.set_wdt(require('shortid').generate(), 3, checkSleeping);
function checkSleeping() {
var options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-sleeping/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
sleeping = jObject.con;
})
}
function uploadData() {
var cmd = 'sudo python ADXL345.py';
console.log("exec");
exec(cmd, function callback(error, stdout, stderr) {
if(tas_state == 'upload') {
if(tas_state == 'upload' && sleeping == '1') {
var data = stdout.split('\n');
for(var i = 0; i < upload_arr.length; i++) {
if(upload_arr[i].ctname == 'cnt-accel') {
if(upload_arr[i].ctname == 'cnt-acceleration') {
var cin = {ctname: upload_arr[i].ctname, con: data[0]};
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
......
......@@ -5,7 +5,11 @@
<parentport>3105</parentport>
</tas>
<upload>
<ctname>cnt-accel</ctname>
<id>accel#1</id>
<ctname>cnt-acceleration</ctname>
<id>acceleration#1</id>
</upload>
<download>
<ctname>cnt-sleeping</ctname>
<id>sleeping#1</id>
</download>
</m2m:conf>
No preview for this file type
......@@ -63,10 +63,12 @@ int main( void )
{
if ( wiringPiSetup() == -1 )
exit( 1 );
for(int i = 0; i < 64; i++)
int i;
for(i = 0; i < 128; i++)
if(read_dht11_dat())
break;
if(i == 128)
printf("-999 -999");
return(0);
}
......@@ -9,7 +9,7 @@ var util = require('util');
var fs = require('fs');
var xml2js = require('xml2js');
var exec = require("child_process").exec;
var request = require("request");
var wdt = require('./wdt');
var useparentport = '';
......@@ -20,6 +20,16 @@ var download_arr = [];
var conf = {};
var sleeping;
var humidity;
var humidity_auto;
var humidity_low;
var humidity_high;
var temperature;
var temperature_auto;
var temperature_low;
var temperature_high;
// This is an async file read
fs.readFile('conf.xml', 'utf-8', function (err, data) {
if (err) {
......@@ -102,6 +112,29 @@ function on_receive(data) {
for (j = 0; j < download_arr.length; j++) {
if (download_arr[j].ctname == sink_obj.ctname) {
g_down_buf = JSON.stringify({id: download_arr[i].id, con: sink_obj.con});
switch(sink_obj.ctname) {
case 'cnt-sleeping':
sleeping = sink_obj.con;
break;
case 'cnt-humidity-auto':
humidity_auto = sink_obj.con;
break;
case 'cnt-humidity-low':
humidity_low = sink_obj.con;
break;
case 'cnt-humidity-high':
humidity_high = sink_obj.con;
break;
case 'cnt-temperature-auto':
temperature_auto = sink_obj.con;
break;
case 'cnt-temperature-low':
temperature_low = sink_obj.con;
break;
case 'cnt-temperature-high':
temperature_high = sink_obj.con;
break;
}
console.log(g_down_buf + ' <----');
break;
}
......@@ -136,9 +169,95 @@ function tas_watchdog() {
}
}
else if(tas_state == 'init_thing') {
var options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-sleeping/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
sleeping = jObject.con;
});
options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-humidity-auto/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
humidity_auto = jObject.con;
});
options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-humidity-low/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
humidity_low = jObject.con;
});
options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-humidity-high/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
humidity_high = jObject.con;
});
options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-temperature-auto/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
temperature_auto = jObject.con;
});
options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-temperature-low/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
temperature_low = jObject.con;
});
options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-temperature-high/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
temperature_high = jObject.con;
});
tas_state = 'connect';
}
else if(tas_state == 'connect' || tas_state == 'reconnect') {
console.log('port:' + useparentport + ', host:' + useparenthostname);
upload_client.connect(useparentport, useparenthostname, function() {
console.log('upload Connected');
tas_download_count = 0;
......@@ -156,7 +275,33 @@ function tas_watchdog() {
}
wdt.set_wdt(require('shortid').generate(), 3, tas_watchdog);
wdt.set_wdt(require('shortid').generate(), 3, uploadData);
wdt.set_wdt(require('shortid').generate(), 2, uploadData);
wdt.set_wdt(require('shortid').generate(), 1, controllActuator);
wdt.set_wdt(require('shortid').generate(), 3, checkSleeping);
function checkSleeping() {
var options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-sleeping/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
if(sleeping == 1 && jObject.con == 0) {
var cin = {ctname: "cnt-fan", con: "0"};
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
cin = {ctname: "cnt-humidifier", con: "0"};
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
}
sleeping = jObject.con;
})
}
function uploadData() {
var cmd = 'sudo ./DHT11';
......@@ -166,19 +311,54 @@ function uploadData() {
for(var i = 0; i < upload_arr.length; i++) {
if(upload_arr[i].ctname == 'cnt-humidity') {
var cin = {ctname: upload_arr[i].ctname, con: stdoutArr[0]};
if(stdoutArr[0] != -999) {
humidity = stdoutArr[0];
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
}
if(upload_arr[i].ctname == 'cnt-temp') {
}
if(upload_arr[i].ctname == 'cnt-temperature') {
var cin = {ctname: upload_arr[i].ctname, con: stdoutArr[1]};
if(stdoutArr[1] != -999) {
temperature = stdoutArr[1];
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
}
}
}
}
});
}
function controllActuator() {
if(tas_state == 'upload' && sleeping == 1) {
if(humidity_auto == 1) {
if(!((humidity_low <= humidity) && (humidity <= humidity_high))) {
var cin = {ctname: "cnt-humidifier", con: "1"};
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
}
else {
var cin = {ctname: "cnt-humidifier", con: "0"};
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
}
}
if(temperature_auto == 1) {
if(!((temperature_low <= temperature) && (temperature <= temperature_high))) {
var cin = {ctname: "cnt-fan", con: "1"};
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
}
else {
var cin = {ctname: "cnt-fan", con: "0"};
console.log('SEND : ' + JSON.stringify(cin) + ' ---->');
upload_client.write(JSON.stringify(cin) + '<EOF>');
}
}
}
}
var cur_c = '';
var pre_c = '';
var g_sink_buf = '';
......
......@@ -9,7 +9,43 @@
<id>humidity#1</id>
</upload>
<upload>
<ctname>cnt-temp</ctname>
<id>temp#1</id>
<ctname>cnt-temperature</ctname>
<id>temperature#1</id>
</upload>
<upload>
<ctname>cnt-fan</ctname>
<id>fan#1</id>
</upload>
<upload>
<ctname>cnt-humidifier</ctname>
<id>humidifier#1</id>
</upload>
<download>
<ctname>cnt-sleeping</ctname>
<id>sleeping#1</id>
</download>
<download>
<ctname>cnt-humidity-auto</ctname>
<id>humidity#1</id>
</download>
<download>
<ctname>cnt-humidity-low</ctname>
<id>humidity#</id>
</download>
<download>
<ctname>cnt-humidity-high</ctname>
<id>humidity#1</id>
</download>
<download>
<ctname>cnt-temperature-auto</ctname>
<id>temperature#1</id>
</download>
<download>
<ctname>cnt-temperature-low</ctname>
<id>temperature#1</id>
</download>
<download>
<ctname>cnt-temperature-high</ctname>
<id>temperature#1</id>
</download>
</m2m:conf>
......@@ -2,8 +2,8 @@ install:
sudo npm -g install forever
cd thyme && npm install
cd ADXL345 && npm install
cd DHT11 && npm install
cd SEN0228 && npm install
cd DHT11 && npm install
compile:
cd DHT11 && g++ DHT11.cpp -o DHT11 -lwiringPi
......@@ -12,8 +12,8 @@ compile:
start:
cd thyme && forever start thyme.js
cd ADXL345 && forever start app.js
cd DHT11 && forever start app.js
cd SEN0228 && forever start app.js
cd DHT11 && forever start app.js
stop:
forever stopall
......@@ -9,7 +9,7 @@ var util = require('util');
var fs = require('fs');
var xml2js = require('xml2js');
var exec = require("child_process").exec;
var request = require("request");
var wdt = require('./wdt');
var useparentport = '';
......@@ -20,6 +20,8 @@ var download_arr = [];
var conf = {};
var sleeping;
// This is an async file read
fs.readFile('conf.xml', 'utf-8', function (err, data) {
if (err) {
......@@ -102,6 +104,8 @@ function on_receive(data) {
for (j = 0; j < download_arr.length; j++) {
if (download_arr[j].ctname == sink_obj.ctname) {
g_down_buf = JSON.stringify({id: download_arr[i].id, con: sink_obj.con});
if(sink_obj.ctname == 'cnt-sleeping')
sleeping = sink_obj.con;
console.log(g_down_buf + ' <----');
break;
}
......@@ -157,11 +161,28 @@ function tas_watchdog() {
wdt.set_wdt(require('shortid').generate(), 3, tas_watchdog);
wdt.set_wdt(require('shortid').generate(), 3, uploadData);
wdt.set_wdt(require('shortid').generate(), 3, checkSleeping);
function checkSleeping() {
var options = { method: 'GET',
url: 'http://52.79.78.134:7579/mobius-yt/SSS/cnt-sleeping/latest',
headers:
{ 'cache-control': 'no-cache',
'x-m2m-origin': 'SOrigin','x-m2m-ri': '12345',
accept: 'application/json' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
var jObject = JSON.parse(body)["m2m:cin"];
sleeping = jObject.con;
})
}
function uploadData() {
var cmd = 'sudo ./SEN0228';
exec(cmd, function callback(error, stdout, stderr) {
if(tas_state == 'upload') {
if(tas_state == 'upload' && sleeping == '1') {
for(var i = 0; i < upload_arr.length; i++) {
if(upload_arr[i].ctname == 'cnt-lux') {
var cin = {ctname: upload_arr[i].ctname, con: stdout};
......
......@@ -8,4 +8,8 @@
<ctname>cnt-lux</ctname>
<id>lux#1</id>
</upload>
<download>
<ctname>cnt-sleeping</ctname>
<id>sleeping#1</id>
</download>
</m2m:conf>
......@@ -29,9 +29,9 @@ cse.id = '/mobius-yt';
cse.mqttport = '1883';
// build ae
ae.id = 'ae-edu0';
ae.id = 'SSS';
ae.parent = '/' + cse.name;
ae.name = 'ae-edu0';
ae.name = 'SSS';
ae.appid = '0.2.481.1.1';
ae.port = '9727';
ae.bodytype = 'json';
......@@ -41,25 +41,74 @@ ae.tasport = '3105';
var count = 0;
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-sleeping';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-acceleration';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-humidity';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-temp';
cnt_arr[count++].name = 'cnt-humidity-auto';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-accel';
cnt_arr[count++].name = 'cnt-humidity-low';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-humidity-high';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-lux';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-temperature';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-temperature-auto';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-temperature-low';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-temperature-high';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-fan';
cnt_arr[count] = {};
cnt_arr[count].parent = '/' + cse.name + '/' + ae.name;
cnt_arr[count++].name = 'cnt-humidifier';
// build sub
count = 0;
sub_arr[count] = {};
sub_arr[count].parent = '/' + cse.name + '/' + ae.name + '/' + cnt_arr[1].name;
sub_arr[count].name = 'sub-ctrl';
sub_arr[count].parent = cnt_arr[0].parent + '/' + cnt_arr[0].name;
sub_arr[count].name = 'sub';
sub_arr[count++].nu = 'mqtt://' + cse.host + '/' + ae.id;
sub_arr[count] = {};
sub_arr[count].parent = cnt_arr[3].parent + '/' + cnt_arr[3].name;
sub_arr[count].name = 'sub';
sub_arr[count++].nu = 'mqtt://' + cse.host + '/' + ae.id;
sub_arr[count] = {};
sub_arr[count].parent = cnt_arr[4].parent + '/' + cnt_arr[4].name;
sub_arr[count].name = 'sub';
sub_arr[count++].nu = 'mqtt://' + cse.host + '/' + ae.id;
sub_arr[count] = {};
sub_arr[count].parent = cnt_arr[5].parent + '/' + cnt_arr[5].name;
sub_arr[count].name = 'sub';
sub_arr[count++].nu = 'mqtt://' + cse.host + '/' + ae.id;
sub_arr[count] = {};
sub_arr[count].parent = cnt_arr[8].parent + '/' + cnt_arr[8].name;
sub_arr[count].name = 'sub';
sub_arr[count++].nu = 'mqtt://' + cse.host + '/' + ae.id;
sub_arr[count] = {};
sub_arr[count].parent = cnt_arr[9].parent + '/' + cnt_arr[9].name;
sub_arr[count].name = 'sub';
sub_arr[count++].nu = 'mqtt://' + cse.host + '/' + ae.id;
sub_arr[count] = {};
sub_arr[count].parent = cnt_arr[10].parent + '/' + cnt_arr[10].name;
sub_arr[count].name = 'sub';
sub_arr[count++].nu = 'mqtt://' + cse.host + '/' + ae.id;
//sub_arr[count++].nu = 'http://203.254.173.104:' + ae.port + '/noti';
//sub_arr[count++].nu = 'coap://203.254.173.104:' + ae.port + '/noti';
// build acp: not complete
acp.parent = '/' + cse.name + '/' + ae.name;
......
......@@ -9,9 +9,9 @@
"mqttport": "1883"
},
"ae": {
"id": "ae-edu0",
"id": "SSS",
"parent": "/mobius-yt",
"name": "ae-edu0",
"name": "SSS",
"appid": "0.2.481.1.1",
"port": "9727",
"bodytype": "json",
......@@ -19,32 +19,98 @@
},
"cnt": [
{
"parent": "/mobius-yt/ae-edu0",
"parent": "/mobius-yt/SSS",
"name": "cnt-sleeping"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-acceleration"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-humidity"
},
{
"parent": "/mobius-yt/ae-edu0",
"name": "cnt-temp"
"parent": "/mobius-yt/SSS",
"name": "cnt-humidity-auto"
},
{
"parent": "/mobius-yt/ae-edu0",
"name": "cnt-accel"
"parent": "/mobius-yt/SSS",
"name": "cnt-humidity-low"
},
{
"parent": "/mobius-yt/ae-edu0",
"parent": "/mobius-yt/SSS",
"name": "cnt-humidity-high"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-lux"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-temperature"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-temperature-auto"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-temperature-low"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-temperature-high"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-fan"
},
{
"parent": "/mobius-yt/SSS",
"name": "cnt-humidifier"
}
],
"sub": [
{
"parent": "/mobius-yt/ae-edu0/cnt-temp",
"name": "sub-ctrl",
"nu": "mqtt://52.79.78.134/ae-edu0"
"parent": "/mobius-yt/SSS/cnt-sleeping",
"name": "sub",
"nu": "mqtt://52.79.78.134/SSS"
},
{
"parent": "/mobius-yt/SSS/cnt-humidity-auto",
"name": "sub",
"nu": "mqtt://52.79.78.134/SSS"
},
{
"parent": "/mobius-yt/SSS/cnt-humidity-low",
"name": "sub",
"nu": "mqtt://52.79.78.134/SSS"
},
{
"parent": "/mobius-yt/SSS/cnt-humidity-high",
"name": "sub",
"nu": "mqtt://52.79.78.134/SSS"
},
{
"parent": "/mobius-yt/SSS/cnt-temperature-auto",
"name": "sub",
"nu": "mqtt://52.79.78.134/SSS"
},
{
"parent": "/mobius-yt/SSS/cnt-temperature-low",
"name": "sub",
"nu": "mqtt://52.79.78.134/SSS"
},
{
"parent": "/mobius-yt/SSS/cnt-temperature-high",
"name": "sub",
"nu": "mqtt://52.79.78.134/SSS"
}
],
"acp": {
"parent": "/mobius-yt/ae-edu0",
"name": "acp-ae-edu0",
"id": "ae-edu0"
"parent": "/mobius-yt/SSS",
"name": "acp-SSS",
"id": "SSS"
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment