Erick / Mbed 2 deprecated ICE_BLE_TEST

Dependencies:   NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed

Fork of ICE by Erick

src/CloudDataHandler/CloudFileReceiver.cpp

Committer:
davidjhoward
Date:
2016-09-22
Revision:
116:7337ed514891
Parent:
99:55317f374a94
Child:
134:f90154ff33ec

File content as of revision 116:7337ed514891:

#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), "%s_%s%s",
                      from_json["pay"]["spcontrol"]["id"].get<std::string>().c_str(),
                      from_json["pay"]["spcontrol"]["input"].get<std::string>().c_str(),
                      ".json" );
            logInfo("SETPONT CONTROL FILENAME=%s", filename);
            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;
}