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
Diff: src/CloudDataHandler/CloudFileReceiver.cpp
- Revision:
- 246:ca91a441b4dc
- Parent:
- 224:9ea8925c61e0
- Child:
- 248:e156e33b8b38
diff -r 6665796174c3 -r ca91a441b4dc src/CloudDataHandler/CloudFileReceiver.cpp
--- a/src/CloudDataHandler/CloudFileReceiver.cpp Thu Oct 20 17:59:18 2016 +0000
+++ b/src/CloudDataHandler/CloudFileReceiver.cpp Thu Oct 20 22:20:52 2016 +0000
@@ -1,25 +1,27 @@
#include "CloudFileReceiver.h"
#include "CloudDataHandler.h"
#include "MTSLog.h"
-#include "MbedJSONValue.h"
#include "global.h"
+#include "cJSON.h"
+#include <algorithm>
char CloudFileReceiverWriteBuf[MAX_FILE_SIZE];
char CloudFileReceiverReadBuf[MAX_FILE_SIZE];
-bool StoreReceivedFile( mDot *dot, MbedJSONValue &from_json )
+bool StoreReceivedFile( mDot *dot, std::string &payload_string )
{
FILENAME_STRING filename;
memset( filename, '\0', sizeof(FILENAME_STRING) );
-
- int mType = from_json["pay"]["mtype"].get<int>();
- logInfo("mtype=%d", mType);
+
+ cJSON * payload = cJSON_Parse(payload_string.c_str());
+ int mType = cJSON_GetObjectItem(payload,"mtype")->valueint;
+ logInfo("%s:%d: mtype=%d", __func__,__LINE__,mType);
switch( mType ) {
case SETPOINT_CONTROL_MTYPE: {
+ cJSON * spcontrol = cJSON_GetObjectItem(payload,"spcontrol");
logInfo("PROCESSING SETPONT CONTROL FILE");
- snprintf( filename, sizeof(FILENAME_STRING), "control_sp_%s.json",
- from_json["pay"]["spcontrol"]["id"].get<std::string>().c_str() );
+ snprintf( filename, sizeof(FILENAME_STRING), "control_sp_%s.json", cJSON_GetObjectItem(spcontrol,"id")->valuestring );
logInfo("SETPONT CONTROL FILENAME=%s", filename);
memset( CloudFileReceiverWriteBuf, '\0', MAX_FILE_SIZE );
@@ -37,20 +39,21 @@
"\"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()
+ cJSON_GetObjectItem(spcontrol,"id")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"priority")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"input")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"output")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"setpoint")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"productfact")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"actingDir")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"halert")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"lalert")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"hfs")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"lfs")->valuestring,
+ cJSON_GetObjectItem(spcontrol,"tol")->valuestring
);
-
+ cJSON_Delete(spcontrol);
+ cJSON_Delete(payload);
logInfo("saving string%s", CloudFileReceiverWriteBuf);
bool status = GLOBAL_mdot->saveUserFile(filename, (void *)CloudFileReceiverWriteBuf, MAX_FILE_SIZE);
if( status != true ) {
@@ -69,6 +72,7 @@
MailBox.put(msg);
break;
}
+#ifdef 0
case MANUAL_CONTROL_MTYPE: {
logInfo("PROCESSING MANUAL CONTROL FILE");
snprintf( filename, sizeof(FILENAME_STRING), "control_mn_%s.json",
@@ -413,6 +417,7 @@
ModbusMasterMailBox.put(mail);
break;
}
+#endif
default:
logInfo("DEFAULT");
break;
@@ -423,36 +428,52 @@
bool CloudDataHandler_RcvFile = false;
bool CloudFileReceiver( std::string *recv_string, mDot *dot )
{
-
- MbedJSONValue incomingJson;
+ bool status;
- bool status;
- parse( incomingJson, recv_string->c_str() );
- int sequence = incomingJson["seq"].get<int>();
+ cJSON * root = cJSON_Parse(recv_string->c_str());
+ cJSON * payload = cJSON_GetObjectItem(root,"pay");
+ std::string payload_string = cJSON_Print(payload);
+ int sequence = cJSON_GetObjectItem(root,"seq")->valueint;
+ logInfo("%s:%d: sequence=%d",__func__,__LINE__, sequence);
+ cJSON_Delete(root);
+ cJSON_Delete(payload);
+
+
+ //remove the quotes added by the print function
+// payload_string.erase( payload_string.begin() );
+// payload_string.erase( payload_string.size() - 1 );
+
+ payload_string = payload_string.substr(1, payload_string.size() - 2);
+// payload_string.erase( std::remove(payload_string.begin(), payload_string.end(), 'a'), payload_string.end() );
+ std::replace( payload_string.begin(), payload_string.end(), '\\', ' ');
+
+ printf("payload_string:%s\r\n", payload_string.c_str() );
CloudDataHandler_RcvFile = false;
+ if( sequence == -1 ) {
- // sequence of -1 means string sent in 1 chunk.
- if( sequence == -1 ) {
- return StoreReceivedFile( dot, incomingJson );
+ // sequence of -1 means string sent in 1 chunk.
+// printf("%s:%d: payload=%s\r\n",__func__,__LINE__, payload_string.c_str() );
+ status = StoreReceivedFile( dot, payload_string );
+
} else if( sequence == 0 ) {
memset(CloudFileReceiverWriteBuf,0,sizeof(CloudFileReceiverWriteBuf));
- snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s", "{\"seq\":-1, \"pay\":",incomingJson["pay"].get<std::string>().c_str() );
+ snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s", "{\"seq\":-1, \"pay\":", payload_string.c_str() );
+
logInfo("(%d)Writing String Length=%d, %s", __LINE__, MAX_FILE_SIZE, CloudFileReceiverWriteBuf );
status = dot->saveUserFile("scratch.json", (void *)CloudFileReceiverWriteBuf, MAX_FILE_SIZE);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
- return false;
+ } else {
+ CloudDataHandler_RcvFile = true;
+ logInfo("(%d)UPDATED scratch.json FILE, status:%d, strlen=%d", __LINE__, status, strlen(CloudFileReceiverWriteBuf));
+ __heapstats((__heapprt)fprintf,stderr);
}
- CloudDataHandler_RcvFile = true;
- logInfo("(%d)UPDATED scratch.json FILE, status:%d, strlen=%d", __LINE__, status, strlen(CloudFileReceiverWriteBuf));
} else if( sequence == -2 ) {
- MbedJSONValue finalJson;
-
logInfo("(%d)READING BACK scratch.json FILE FOR LAST PACKET", __LINE__);
// read the file back
@@ -462,21 +483,13 @@
return false;
}
- snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s%s", CloudFileReceiverReadBuf, incomingJson["pay"].get<std::string>().c_str(), "}" );
+ snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s%s", CloudFileReceiverReadBuf, payload_string.c_str(), "}" );
logInfo("(%d)Final String Length=%d, %s", __LINE__, strlen(CloudFileReceiverWriteBuf), CloudFileReceiverWriteBuf );
- std::string err;
- parse( finalJson, CloudFileReceiverWriteBuf, CloudFileReceiverWriteBuf + strlen(CloudFileReceiverWriteBuf), &err );
+ std::string final_json = CloudFileReceiverWriteBuf;
printf("finished parse\r\n" );
- Thread::wait(1000);
-
- int sequence = finalJson["seq"].get<int>();
- int mType = finalJson["pay"]["mtype"].get<int>();
-
- printf("MESSAGE TYPE=%d\r\n",mType);
-
- status = StoreReceivedFile( dot, finalJson );
+ status = StoreReceivedFile( dot, final_json );
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
}
@@ -499,18 +512,17 @@
return false;
}
- snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s", CloudFileReceiverReadBuf, incomingJson["pay"].get<std::string>().c_str() );
+ snprintf(CloudFileReceiverWriteBuf, sizeof(CloudFileReceiverWriteBuf), "%s%s", CloudFileReceiverReadBuf, payload_string.c_str() );
logInfo("(%d)Writing String Length=%d, %s", __LINE__, strlen(CloudFileReceiverWriteBuf), CloudFileReceiverWriteBuf );
status = dot->saveUserFile("scratch.json", (void *)CloudFileReceiverWriteBuf, MAX_FILE_SIZE);
if( status != true ) {
logError("(%d)save file failed, status=%d", __LINE__, status);
- return false;
+ } else {
+ CloudDataHandler_RcvFile = true;
+ logInfo("(%d)UPDATED scratch.json FILE, status:%d, strlen=%d", __LINE__, status, strlen(CloudFileReceiverWriteBuf));
+ __heapstats((__heapprt)fprintf,stderr);
}
- CloudDataHandler_RcvFile = true;
- logInfo("(%d)UPDATED scratch.json FILE, status:%d, strlen=%d", __LINE__, status, strlen(CloudFileReceiverWriteBuf));
-
}
-
return true;
}
\ No newline at end of file
