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:
- 134:f90154ff33ec
- Parent:
- 116:7337ed514891
- Child:
- 138:27c39d0e4e81
File content as of revision 134:f90154ff33ec:
#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:
            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(),
                      ".jsn" );
            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;
        }
        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>();
        std::string input = final_json["pay"]["input"]["id"].get<std::string>().c_str();
        printf("MESSAGE TYPE=%d, input=%s\r\n",mType, input.c_str());
        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;
}
            
    