Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed
Fork of ICE by
src/CloudDataHandler/CloudFileReceiver.cpp
- Committer:
- davidjhoward
- Date:
- 2016-09-27
- Revision:
- 144:b32d6a6f445f
- Parent:
- 139:f1f4a523399f
- Child:
- 145:c1dfbb5eed0e
File content as of revision 144:b32d6a6f445f:
#include "CloudFileReceiver.h"
#include "CloudDataHandler.h"
#include "MTSLog.h"
#include "MbedJSONValue.h"
#include "global.h"
char CloudFileReceiverWriteBuf[1024];
char CloudFileReceiverReadBuf[1024];
bool StoreReceivedFile( mDot *dot, MbedJSONValue &from_json )
{
FILENAME_STRING filename;
memset( filename, '\0', sizeof(FILENAME_STRING) );
int mType = from_json["pay"]["mtype"].get<int>();
logInfo("mtype=%d", mType);
switch( mType ) {
case SETPOINT_CONTROL_MTYPE: {
logInfo("PROCESSING SETPONT CONTROL FILE");
snprintf( filename, sizeof(FILENAME_STRING), "control_sp_%s.json",
from_json["pay"]["spcontrol"]["id"].get<std::string>().c_str() );
logInfo("SETPONT CONTROL FILENAME=%s", filename);
memset( CloudFileReceiverWriteBuf, '\0', 1024 );
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf),
"{ "
"\"id\": \"%s\", "
"\"priority\": \"%s\","
"\"input\": \"%s\", "
"\"output\": \"%s\", "
"\"setpoint\": \"%s\","
"\"prodfact\": \"%s\","
"\"actingDir\": \"%s\", "
"\"halert\": \"%s\","
"\"lalert\": \"%s\", "
"\"hfs\": \"%s\","
"\"lfs\": \"%s\", "
"\"tol\": \"%s\" }",
from_json["pay"]["spcontrol"]["id"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["priority"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["input"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["output"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["setpoint"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["prodfact"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["actingDir"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["halert"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["lalert"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["hfs"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["lfs"].get<std::string>().c_str(),
from_json["pay"]["spcontrol"]["tol"].get<std::string>().c_str()
);
logInfo("saving string%s", CloudFileReceiverWriteBuf);
bool status = GLOBAL_mdot->saveUserFile(filename, (void *)CloudFileReceiverWriteBuf, 1024);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
}
// send a message to the configuration handler to create the control
Message_t *msg = MailBox.alloc();
memset(msg, 0, sizeof(Message_t));
msg->action = ACTION_CREATE;
msg->control = CONTROL_SETPOINT;
strncpy(msg->controlFile, filename, sizeof(msg->controlFile)-1);
printf("%s: Sending a create request for control %s type = %u\r\n", __func__, msg->controlFile, msg->control);
MailBox.put(msg);
break;
}
case MAN_CONTROL_MTYPE: {
logInfo("PROCESSING MANUAL CONTROL FILE");
snprintf( filename, sizeof(FILENAME_STRING), "control_mn_%s.json",
from_json["pay"]["mncontrol"]["id"].get<std::string>().c_str() );
logInfo("MANUAL CONTROL FILENAME=%s", filename);
memset( CloudFileReceiverWriteBuf, '\0', 1024 );
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf),
"{ "
"\"id\": \"%s\", "
"\"output\": \"%s\", "
"\"type\": \"%s\", "
"\"priority\": \"%s\", "
"\"duration\": \"%s\", "
"\"setpoint\": \"%s\", "
"\"state\": \"%s\", "
"\"percent\": \"%s\" }",
from_json["pay"]["mncontrol"]["id"].get<std::string>().c_str(),
from_json["pay"]["mncontrol"]["output"].get<std::string>().c_str(),
from_json["pay"]["mncontrol"]["type"].get<std::string>().c_str(),
from_json["pay"]["mncontrol"]["priority"].get<std::string>().c_str(),
from_json["pay"]["mncontrol"]["duration"].get<std::string>().c_str(),
from_json["pay"]["mncontrol"]["setpoint"].get<std::string>().c_str(),
from_json["pay"]["mncontrol"]["state"].get<std::string>().c_str(),
from_json["pay"]["mncontrol"]["percent"].get<std::string>().c_str()
);
logInfo("saving string%s", CloudFileReceiverWriteBuf);
bool status = GLOBAL_mdot->saveUserFile(filename, (void *)CloudFileReceiverWriteBuf, 1024);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
}
// send a message to the configuration handler to create the control
Message_t *msg = MailBox.alloc();
memset(msg, 0, sizeof(Message_t));
msg->action = ACTION_CREATE;
msg->control = CONTROL_MANUAL;
strncpy(msg->controlFile, filename, sizeof(msg->controlFile)-1);
printf("%s: Sending a create manual for control %s type = %u\r\n", __func__, msg->controlFile, msg->control);
MailBox.put(msg);
break;
}
case TIMER_CONTROL_MTYPE: {
logInfo("PROCESSING TIMER CONTROL FILE");
snprintf( filename, sizeof(FILENAME_STRING), "control_tm_%s.json",
from_json["pay"]["tmcontrol"]["id"].get<std::string>().c_str() );
logInfo("TIMER CONTROL FILENAME=%s", filename);
memset( CloudFileReceiverWriteBuf, '\0', 1024 );
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf),
"{ "
"\"id\": \"%s\", "
"\"output\": \"%s\", "
"\"priority\": \"%s\", "
"\"starttime\": \"%s\", "
"\"duration\": \"%s\", ",
from_json["pay"]["tmcontrol"]["id"].get<std::string>().c_str(),
from_json["pay"]["tmcontrol"]["output"].get<std::string>().c_str(),
from_json["pay"]["tmcontrol"]["priority"].get<std::string>().c_str(),
from_json["pay"]["tmcontrol"]["starttime"].get<std::string>().c_str(),
from_json["pay"]["tmcontrol"]["duration"].get<std::string>().c_str()
);
logInfo("saving string%s", CloudFileReceiverWriteBuf);
bool status = GLOBAL_mdot->saveUserFile(filename, (void *)CloudFileReceiverWriteBuf, 1024);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
}
// send a message to the configuration handler to create the control
Message_t *msg = MailBox.alloc();
memset(msg, 0, sizeof(Message_t));
msg->action = ACTION_CREATE;
msg->control = CONTROL_TIMER;
strncpy(msg->controlFile, filename, sizeof(msg->controlFile)-1);
printf("%s: Sending a create request for control %s type = %u\r\n", __func__, msg->controlFile, msg->control);
MailBox.put(msg);
break;
}
case INPUT_CONFIG_MTYPE: {
logInfo("id=%s", from_json["pay"]["input"]["id"].get<std::string>().c_str() );
snprintf( filename, sizeof(FILENAME_STRING), "input_%s%s",
from_json["pay"]["input"]["id"].get<std::string>().c_str(),
".json" );
logInfo("INPUT CONFIG FILENAME=%s", filename);
memset( CloudFileReceiverWriteBuf, '\0', 1024 );
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf),
"{ "
"\"id\":\"%s\", "
"\"name\":\"%s\", "
"\"units\":\"%s\", "
"\"min\":\"%s\", "
"\"max\":\"%s\", "
"\"node\":\"%s\", "
"\"reg\":\"%s\", "
"\"rtype\":\"%s\", "
"\"type\":\"%s\", "
"\"size\":\"%s\", "
"\"order\":\"%s\", "
"\"fmt\":\"%s\", "
"\"rfreq\":\"%s\" } ",
from_json["pay"]["input"]["id"].get<std::string>().c_str(),
from_json["pay"]["input"]["name"].get<std::string>().c_str(),
from_json["pay"]["input"]["units"].get<std::string>().c_str(),
from_json["pay"]["input"]["min"].get<std::string>().c_str(),
from_json["pay"]["input"]["max"].get<std::string>().c_str(),
from_json["pay"]["input"]["node"].get<std::string>().c_str(),
from_json["pay"]["input"]["reg"].get<std::string>().c_str(),
from_json["pay"]["input"]["rtype"].get<std::string>().c_str(),
from_json["pay"]["input"]["type"].get<std::string>().c_str(),
from_json["pay"]["input"]["size"].get<std::string>().c_str(),
from_json["pay"]["input"]["order"].get<std::string>().c_str(),
from_json["pay"]["input"]["fmt"].get<std::string>().c_str(),
from_json["pay"]["input"]["rfreq"].get<std::string>().c_str()
);
logInfo("saving string%s", CloudFileReceiverWriteBuf);
bool status = GLOBAL_mdot->saveUserFile(filename, (void *)CloudFileReceiverWriteBuf, 1024);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
}
logInfo("Sending Mail To ModbusMasterMailBox, filename=%s", filename);
Message_t *mail = ModbusMasterMailBox.alloc();
mail->action = ACTION_READ_FILE;
strncpy( mail->controlFile, filename, (sizeof(mail->controlFile)-1));
ModbusMasterMailBox.put(mail);
break;
}
case OUTPUT_CONFIG_MTYPE: {
logInfo("id=%s", from_json["pay"]["output"]["id"].get<std::string>().c_str() );
snprintf( filename, sizeof(FILENAME_STRING), "output_%s%s",
from_json["pay"]["output"]["id"].get<std::string>().c_str(),
".json" );
logInfo("OUTPUT CONFIG FILENAME=%s", filename);
memset( CloudFileReceiverWriteBuf, '\0', 1024 );
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf),
"{ "
"\"id\":\"%s\", "
"\"name\":\"%s\", "
"\"units\":\"%s\", "
"\"min\":\"%s\", "
"\"max\":\"%s\", "
"\"node\":\"%s\", "
"\"reg\":\"%s\", "
"\"rtype\":\"%s\", "
"\"type\":\"%s\", "
"\"size\":\"%s\", "
"\"order\":\"%s\", "
"\"fmt\":\"%s\", "
"\"rfreq\":\"%s\", "
"\"toperiod\":\"%s\", "
"\"scalelo\":\"%s\", "
"\"scalehi\":\"%s\" }",
from_json["pay"]["output"]["id"].get<std::string>().c_str(),
from_json["pay"]["output"]["name"].get<std::string>().c_str(),
from_json["pay"]["output"]["units"].get<std::string>().c_str(),
from_json["pay"]["output"]["min"].get<std::string>().c_str(),
from_json["pay"]["output"]["max"].get<std::string>().c_str(),
from_json["pay"]["output"]["node"].get<std::string>().c_str(),
from_json["pay"]["output"]["reg"].get<std::string>().c_str(),
from_json["pay"]["output"]["rtype"].get<std::string>().c_str(),
from_json["pay"]["output"]["type"].get<std::string>().c_str(),
from_json["pay"]["output"]["size"].get<std::string>().c_str(),
from_json["pay"]["output"]["order"].get<std::string>().c_str(),
from_json["pay"]["output"]["fmt"].get<std::string>().c_str(),
from_json["pay"]["output"]["rfreq"].get<std::string>().c_str(),
from_json["pay"]["output"]["toperiod"].get<std::string>().c_str(),
from_json["pay"]["output"]["scalelo"].get<std::string>().c_str(),
from_json["pay"]["output"]["scalehi"].get<std::string>().c_str()
);
logInfo("saving string%s", CloudFileReceiverWriteBuf);
bool status = GLOBAL_mdot->saveUserFile(filename, (void *)CloudFileReceiverWriteBuf, 1024);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
}
logInfo("Sending Mail To ModbusMasterMailBox, filename=%s", filename);
Message_t *mail = ModbusMasterMailBox.alloc();
mail->action = ACTION_READ_FILE;
strncpy( mail->controlFile, filename, (sizeof(mail->controlFile)-1));
ModbusMasterMailBox.put(mail);
break;
}
default:
logInfo("DEFAULT");
break;
}
return true;
}
bool CloudFileReceiver( std::string *recv_string, mDot *dot )
{
MbedJSONValue from_json;
bool status;
parse( from_json, recv_string->c_str() );
int sequence = from_json["seq"].get<int>();
// sequence of -1 means string sent in 1 chunk.
if( sequence == -1 ) {
return StoreReceivedFile( dot, from_json );
} else if( sequence == 0 ) {
memset(CloudFileReceiverWriteBuf,0,sizeof(CloudFileReceiverWriteBuf));
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s", "{\"seq\":-1, \"pay\":",from_json["pay"].get<std::string>().c_str() );
logInfo("(%d)Writing String Length=%d, %s", __LINE__, 1024, CloudFileReceiverWriteBuf );
status = dot->saveUserFile("scratch.json", (void *)CloudFileReceiverWriteBuf, 1024);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
return false;
}
logInfo("(%d)UPDATED scratch.json FILE, status:%d, strlen=%d", __LINE__, status, strlen(CloudFileReceiverWriteBuf));
} else if( sequence == -2 ) {
MbedJSONValue final_json;
logInfo("(%d)READING BACK scratch.json FILE FOR LAST PACKET", __LINE__);
// read the file back
status = dot->readUserFile("scratch.json", (void *)CloudFileReceiverReadBuf, 1024);
if( status != true ) {
logError("(%d)read file failed, status=%d", __LINE__, status);
return false;
}
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s%s", CloudFileReceiverReadBuf, from_json["pay"].get<std::string>().c_str(), "}" );
logInfo("(%d)Final String Length=%d, %s", __LINE__, strlen(CloudFileReceiverWriteBuf), CloudFileReceiverWriteBuf );
parse( final_json, CloudFileReceiverWriteBuf );
int sequence = final_json["seq"].get<int>();
int mType = final_json["pay"]["mtype"].get<int>();
printf("MESSAGE TYPE=%d\r\n",mType);
status = StoreReceivedFile( dot, final_json );
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
}
status = dot->deleteUserFile("scratch.json");
if( status != true ) {
logError("(%d)delete file failed, status=%d", __LINE__, status);
}
logInfo("(%d)DELETED scratch.json FILE, status:%d", __LINE__, status );
} else {
logInfo("(%d)READING BACK scratch.json FILE", __LINE__);
// read the file back
status = dot->readUserFile("scratch.json", (void *)CloudFileReceiverReadBuf, 1024);
if( status != true ) {
logError("(%d)read file failed, status=%d", __LINE__, status);
return false;
}
snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s", CloudFileReceiverReadBuf, from_json["pay"].get<std::string>().c_str() );
logInfo("(%d)Writing String Length=%d, %s", __LINE__, strlen(CloudFileReceiverWriteBuf), CloudFileReceiverWriteBuf );
status = dot->saveUserFile("scratch.json", (void *)CloudFileReceiverWriteBuf, 1024);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
return false;
}
logInfo("(%d)UPDATED scratch.json FILE, status:%d, strlen=%d", __LINE__, status, strlen(CloudFileReceiverWriteBuf));
}
return true;
}
