aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c
blob: c66300b7e730252c11cfafcc2b0ba8edba88cbb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * FirmwareUpgrade.c
 *
 *  Created on: Dec 24, 2018
 *      Author: shlomo
 */

#include "include.h"
#include "Communication/CommunicationTask.h"
#include <DataDef.h>

#include  <Communication/PMR/FirmwareUpgrade/ActivateVersionRequest.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/ActivateVersionRequest.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/ActivateVersionResponse.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/ValidateVersionRequest.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/ValidateVersionResponse.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/ValidateVersionRequest.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/ValidateVersionResponse.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/VersionFileDestination.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/VersionFileDescriptor.pb-c.h>
#include  <Communication/PMR/FirmwareUpgrade/VersionPackageDescriptor.pb-c.h>

#include "drivers/FPGA/Full_Vme/FPGA_Programming_Up.h"
#include "Common/SWUpdate/FileSystem.h"

uint32_t    ActivateVersionRequestFunc(MessageContainer* requestContainer)
{
    void* buffer = NULL;
    uint32_t Bytes = 0;
    char SWUpgradePath[100];
    char FullPath[50];
    FRESULT Fresult = FR_OK;
    int File_i;
    bool Reboot = false;
    MessageContainer responseContainer;

    ActivateVersionRequest* request = activate_version_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);

    ActivateVersionResponse response = ACTIVATE_VERSION_RESPONSE__INIT;
    VersionPackageDescriptor* VersionPackage;// = VERSION_PACKAGE_DESCRIPTOR__INIT;

    FPGA_ID FileDestinationToFPGAId[VERSION_FILE_DESTINATION__FPGA3+1] = {MAX_FPGA,FPGA1,FPGA2,FPGA3};


    strcpy (SWUpgradePath,request->path);
    strcat(SWUpgradePath,"/package.cfg");

    Fresult = FileRead(SWUpgradePath, &Bytes, &buffer);
    if (Fresult == FR_OK)
    {
        VersionPackage = version_package_descriptor__unpack(NULL,Bytes,buffer);
        for (File_i = 0;File_i<VersionPackage->n_filedescriptors;File_i++)
        {
            switch(VersionPackage->filedescriptors[File_i]->destination)
            {
            case   VERSION_FILE_DESTINATION__MCU:
                break;
            case VERSION_FILE_DESTINATION__FPGA1:
            case VERSION_FILE_DESTINATION__FPGA2:
            case VERSION_FILE_DESTINATION__FPGA3:
                //validate
                //update
                usnprintf(FullPath, 50,  "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename);
                if (VersionPackage->filedescriptors[File_i]->destination == VERSION_FILE_DESTINATION__FPGA3)
                    Reboot = true;
                else
                    Reboot = false;
                Fresult = FPGA_Programming_Request( FileDestinationToFPGAId[VersionPackage->filedescriptors[File_i]->destination], FullPath, Reboot);
                break;
            case VERSION_FILE_DESTINATION__ConfigParams:
                    usnprintf(FullPath, 50,  "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename);
                    Fresult = f_unlink("//SYSINFO//EMBPARAM.CFG");
                    Fresult |= f_rename (FullPath, "//SYSINFO//EMBPARAM.CFG");
                break;
            case     VERSION_FILE_DESTINATION__ProcessParams:
                    usnprintf(FullPath, 50,  "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename);
                    Fresult = f_unlink("//SYSINFO//PROCESSP.CFG");
                    Fresult |= f_rename (FullPath, "//SYSINFO//PROCESSP.CFG");
                break;
            case     VERSION_FILE_DESTINATION__AlarmParams:
                    usnprintf(FullPath, 50,  "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename);
                    Fresult = f_unlink("//SYSINFO//ALARMPRM.CFG");
                    Fresult |= f_rename (FullPath, "//SYSINFO//ALARMPRM.CFG");
                break;
            case     VERSION_FILE_DESTINATION__GeneralHWConfigParams:
                    usnprintf(FullPath, 50,  "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename);
                    Fresult = f_unlink("//SYSINFO//GENHWCFG.CFG");
                    Fresult |= f_rename (FullPath, "//SYSINFO//GENHWCFG.CFG");
                break;
            default:
                LOG_ERROR (VersionPackage->filedescriptors[File_i]->destination,"wrong file update Destination");
                Fresult = FR_INVALID_NAME;
                break;
            }
        }
    }
    responseContainer = createContainer(MESSAGE_TYPE__ActivateVersionResponse,  requestContainer->token, false, &response, &activate_version_response__pack, &activate_version_response__get_packed_size);
    if (Fresult!= OK)
    {
        responseContainer.error = FileError_to_ErrorCode[Fresult];
        responseContainer.errormessage = "Activate Version Request error";
    }
    responseContainer.continuous = false;
    uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
    size_t container_size = message_container__pack(&responseContainer, container_buffer);
    my_free(responseContainer.data.data);
    activate_version_request__free_unpacked(request,NULL);
    SendChars(container_buffer, container_size);

    return OK;
}

uint32_t    ValidateVersionRequestFunc(MessageContainer* requestContainer)
{
    uint32_t status = OK;

    MessageContainer responseContainer;

    ValidateVersionRequest* request = validate_version_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);

    ValidateVersionResponse response = VALIDATE_VERSION_RESPONSE__INIT;


    responseContainer = createContainer(MESSAGE_TYPE__ValidateVersionResponse,  requestContainer->token, false, &response, &validate_version_response__pack, &validate_version_response__get_packed_size);
    if (status!= OK)
    {
        responseContainer.error = ERROR_CODE__INVALID_UPLOAD_ID;
        responseContainer.errormessage = "Validate Version Request error";
    }
    responseContainer.continuous = false;
    uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
    size_t container_size = message_container__pack(&responseContainer, container_buffer);
    my_free(responseContainer.data.data);
    validate_version_request__free_unpacked(request,NULL);
    SendChars(container_buffer, container_size);

    return OK;
}