Simple interface for Mbed Cloud Client

Dependents:  

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arm_uc_mmStateSelector.c Source File

arm_uc_mmStateSelector.c

00001 // ----------------------------------------------------------------------------
00002 // Copyright 2016-2017 ARM Ltd.
00003 //
00004 // SPDX-License-Identifier: Apache-2.0
00005 //
00006 // Licensed under the Apache License, Version 2.0 (the "License");
00007 // you may not use this file except in compliance with the License.
00008 // You may obtain a copy of the License at
00009 //
00010 //     http://www.apache.org/licenses/LICENSE-2.0
00011 //
00012 // Unless required by applicable law or agreed to in writing, software
00013 // distributed under the License is distributed on an "AS IS" BASIS,
00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00015 // See the License for the specific language governing permissions and
00016 // limitations under the License.
00017 // ----------------------------------------------------------------------------
00018 
00019 #include "arm_uc_mmCryptoUtils.h"
00020 #include "arm_uc_mmCommon.h"
00021 #include "arm_uc_mmConfig.h"
00022 #include "arm_uc_mmStateSelector.h"
00023 #include "arm_uc_mmInit.h"
00024 #include "arm_uc_mmFSMHelper.h"
00025 #include "arm_uc_mmFetchFirmwareInfo.h"
00026 #include "arm_uc_mmInsertManifest.h"
00027 
00028 #include "update-client-manifest-manager/update-client-manifest-manager-context.h"
00029 #include "update-client-manifest-manager/update-client-manifest-manager.h"
00030 #include "update-client-manifest-manager/update-client-manifest-types.h"
00031 
00032 #include "update-client-common/arm_uc_scheduler.h"
00033 
00034 #include <stdint.h>
00035 #include <stdio.h>
00036 #include <stddef.h>
00037 #include <string.h>
00038 
00039 arm_uc_error_t ARM_UC_mmSetState(enum arm_uc_mmState_t newState)
00040 {
00041     arm_uc_mmPersistentContext.state = newState;
00042     return (arm_uc_error_t){MFST_ERR_NONE};
00043 }
00044 
00045 #if 0
00046 static void printCryptoFlags(ucmm_crypto_flags_t *flags)
00047 {
00048     printf("ucmm_crypto_flags_t @ %p = {\n", flags);
00049     printf("    .hash = %u,\n",flags->hash);
00050     printf("    .hmac = %u,\n",flags->hmac);
00051     printf("    .rsa  = %u,\n",flags->rsa);
00052     printf("    .ecc  = %u,\n",flags->ecc);
00053     printf("    .aes  = %u,\n",flags->aes);
00054     printf("}\n");
00055 }
00056 #endif
00057 
00058 arm_uc_error_t ARM_UC_mmFSM(uint32_t event)
00059 {
00060     ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES, "> %s (%u)\n", __PRETTY_FUNCTION__, (unsigned)event);
00061 
00062     arm_uc_error_t err = {MFST_ERR_NONE};
00063     enum arm_uc_mmState_t oldState;
00064     do {
00065         oldState = arm_uc_mmPersistentContext.state;
00066         switch(arm_uc_mmPersistentContext.state)
00067         {
00068             case ARM_UC_MM_STATE_IDLE:
00069                 err = (arm_uc_error_t){MFST_ERR_NONE};
00070                 break;
00071 // Placeholder for init
00072 #if 0
00073             case ARM_UC_MM_STATE_INIT:
00074                 err = arm_uc_mmInitFSM(event);
00075                 if (err.code == MFST_ERR_NONE)
00076                 {
00077                     err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00078                     ARM_UC_PostCallback(&arm_uc_mmContext.cfstore_callback_storage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE);
00079                 }
00080                 break;
00081 #endif
00082             case ARM_UC_MM_STATE_INSERTING:
00083                 err = ARM_UC_mmInsertFSM(event);
00084                 if (err.code == MFST_ERR_NONE)
00085                 {
00086                     err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00087                     ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE);
00088                 }
00089                 break;
00090             case ARM_UC_MM_STATE_FWINFO:
00091                 err = ARM_UC_mmFetchFirmwareInfoFSM(event);
00092                 if (err.code == MFST_ERR_NONE)
00093                 {
00094                     err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00095                     ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE);
00096                 }
00097                 break;
00098             case ARM_UC_MM_STATE_TEST:
00099                 if (arm_uc_mmPersistentContext.testFSM != NULL) {
00100                     err = arm_uc_mmPersistentContext.testFSM(event);
00101                     if (err.code == MFST_ERR_NONE)
00102                     {
00103                         err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00104                         ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE);
00105                     }
00106                     break;
00107                 }
00108             case ARM_UC_MM_STATE_INVALID:
00109             default:
00110                 err = (arm_uc_error_t){MFST_ERR_INVALID_STATE};
00111                 break;
00112         }
00113     } while (err.code == MFST_ERR_NONE && oldState != arm_uc_mmPersistentContext.state);
00114     ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES, "< %s %c%c:%hu (%s)\n", __PRETTY_FUNCTION__, err.modulecc[0], err.modulecc[1], err.error, ARM_UC_err2Str(err));
00115     return err;
00116 }
00117 
00118 void ARM_UC_mmCallbackFSMEntry(uint32_t event)
00119 {
00120     ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES,"> %s (%u)\n", __PRETTY_FUNCTION__, (unsigned)event);
00121     arm_uc_error_t err = ARM_UC_mmFSM(event);
00122     if (err.code != MFST_ERR_NONE && err.code != MFST_ERR_PENDING)
00123     {
00124         arm_uc_mmPersistentContext.reportedError = err;
00125         arm_uc_mmPersistentContext.applicationEventHandler((uint32_t)ARM_UC_MM_RC_ERROR);
00126     }
00127     ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES,"< %s %c%c:%hu (%s)\n", __PRETTY_FUNCTION__, err.modulecc[0], err.modulecc[1], err.error, ARM_UC_err2Str(err));
00128 }