GraphicsFunc.c 8.96 KB
Newer Older
1
#include <string.h>
2 3 4
#include "UartProtocol.h"
#include "PicBin.h"
#include <stdint.h>
5
#include "UDS_ISO14229_Services.h"
6
#include "flash.h"
7

8 9 10
#define NULL 0
extern uint8_t UartRevBuff[0x1000];
extern uint32_t UartRevCnts;
11

12 13 14 15 16 17 18 19 20
uint8_t *GetUartRecvData(uint32_t *UartRecvBufLen, uint32_t *UartRecvPos)
{
    *UartRecvBufLen = 0x1000;
    *UartRecvPos = UartRevCnts;
    return UartRevBuff;
}

void UartSendData(uint8_t *data, uint32_t len)
{
21
    mwAmt630hUartSendData(data, len);
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
}

void DisplayNum(uint8_t page, DISPLAY_NUM_ST *pNumData, int32_t NumVal)
{
    uint8_t j = 0;
    uint8_t i = 0;
    int32_t TmpNum;
    uint16_t tmpIndex = 0;
    uint8_t PointFrontRearBlank = 2;
    uint16_t DotPosition = 0;
    uint8_t DotInterval = 0;
	uint16_t NumberList[20];
    DotInterval = 3;
    DotPosition = pNumData->DecimalNum;
    DotPosition <<= 8;
    TmpNum = NumVal;
    if (TmpNum < 0) {        
        TmpNum = -TmpNum;
    }
    do {
        NumberList[tmpIndex ++] = pNumData->NumList[(TmpNum % 10)];
        i++;
        TmpNum /= 10;
        if (i == pNumData->DecimalNum) {
            if (pNumData->NumList[NUM_POINT] != NULL) {
		        NumberList[tmpIndex ++] = pNumData->NumList[NUM_POINT];
            }
        }
    } while (TmpNum != 0u);
    if (pNumData->DecimalNum != 0u) {
        while ((i - 1u) < pNumData->DecimalNum) {
            NumberList[tmpIndex ++] = pNumData->NumList[0];
            i++;
            if (i == pNumData->DecimalNum) {
                if (pNumData->NumList[NUM_POINT] != NULL) {
		            NumberList[tmpIndex ++] = pNumData->NumList[NUM_POINT];
                }
            }
        }
    }
    if (pNumData->MinDigits != 0u) {
        if ((i - 1) < pNumData->MinDigits) {
            for (j = i; j < pNumData->MinDigits; j++) {
                NumberList[tmpIndex ++] = pNumData->NumList[0];
                i++;
            }
        }
    }
    if (NumVal < 0) {
        if (pNumData->NumList[NUM_LINE] != NULL) {
            NumberList[tmpIndex ++] = pNumData->NumList[NUM_LINE];
        }
    }
    
    SetPagePicGroup(page, pNumData->NumInterval, pNumData->x, pNumData->y, NumberList, GROUP_ALIGN_CENTER | (tmpIndex & 0x3f), DotPosition | DotInterval, TFT_ROT_0);
}

/***************** Read 630 ************************/
80
#define READ_MCU_DATA_MAX 0x40
81 82 83 84 85 86 87 88 89
enum {
    READ630_IDLE,
    READ630_WAITING_RESP,
    READ630_RECV_RESP_DATA,
    READ630_RECV_OFFSET_LEN,
    READ630_RECV_BACKUP_DATA_RESP,
    READ630_RECV_BACKUP_DATA_CRC,
};

90 91 92 93 94 95 96
uint8_t ReadDataBuf[READ_MCU_DATA_MAX]; /* 读取缓存 */
uint32_t NeedWriteSize; /* 需要写入文件的长度 */
uint32_t FactOffset;    /* 绝对地址 */
uint32_t AppOffset;
uint32_t Check_Upgrade;
uint32_t Check_Upgrade_Cnt;

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 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
static uint8_t Read630State = READ630_IDLE;
static uint32_t ReqDataBufAddr = 0;
static uint32_t ReqDataLen = 0;
static uint32_t RespDataOffset = 0;
static uint32_t RespDataLen = 0;
static uint32_t RespDataCrc = 0;
static uint32_t WriteBackupDataCrc = 0;
uint32_t ProcMcuOrBackupData(READ_ARK630_CMD type, uint32_t offset, uint32_t len, uint8_t uotbuffer[])
{
    uint32_t ret32 = 0;

    if (type == REQ_DATA) {
        if (len <= READ_MCU_DATA_MAX) {
            ReqDataBufAddr = (uint32_t)uotbuffer;
            ReqDataLen = len;
            memset((uint8_t *)ReqDataBufAddr, 0, ReqDataLen);
            PackedTransfer_GetMcuData(offset, (uint16_t)len);
            Read630State = READ630_WAITING_RESP;
            RespDataOffset = 0;
            RespDataLen = 0;
        } else {
            ret32 = 1;
        }
    } else if (type == WRITE_BACKUP_DATA) {
        if (len <= READ_MCU_DATA_MAX) {
            PackedTransfer_WriteBackupData(offset, uotbuffer, (uint16_t)len);
            Read630State = READ630_WAITING_RESP;
            RespDataOffset = 0;
            RespDataLen = 0;
        } else {
            ret32 = 1;
        }
    } else if (type == GET_BACKUP_DATA_CRC) {
        PackedTransfer_GetBackupDataCrc(offset, len);
        Read630State = READ630_WAITING_RESP;
        RespDataOffset = 0;
        RespDataLen = 0;
    } else if (type == GET_STATUS) {
        if (Read630State == READ630_WAITING_RESP) {
            ret32 = 2;
        } else if (Read630State == READ630_RECV_RESP_DATA) {
            ret32 = RespDataOffset + RespDataLen;
        } else if (Read630State == READ630_RECV_OFFSET_LEN) {
            ret32 = RespDataOffset;
        } else if (Read630State == READ630_RECV_BACKUP_DATA_CRC) {
            ret32 = RespDataCrc;
        } else if (Read630State == READ630_RECV_BACKUP_DATA_RESP) {
            ret32 = RespDataOffset + RespDataLen;
        } else {
            Read630State = READ630_IDLE;
        }
    } else if ((type == GET_APP_DATA_OFFSET) || (type == GET_BACKUP_DATA_OFFSET)) {
        PackedTransfer_GetDataOffsetLen(type);
        Read630State = READ630_WAITING_RESP;
        RespDataOffset = 0;
        RespDataLen = 0;
    } else {
        ;
    }

    return ret32;
}

void GetDataBuf(uint32_t *pAddr, uint32_t *pLen)
{
    *pAddr = ReqDataBufAddr;
    *pLen = ReqDataLen;
}

void SetRecvDataSt(RECV_MCU_DATA_TYPE type, uint32_t addr, uint32_t len, uint32_t crc)
{
    RespDataOffset = addr;
    RespDataLen = len;
    RespDataCrc = crc;
    if (type == RECV_TYPE_DATA) {
        Read630State = READ630_RECV_RESP_DATA;
    } else if (type == RECV_TYPE_OFFSET_LEN) {
        Read630State = READ630_RECV_OFFSET_LEN;
    } else if (type == RECV_TYPE_WRITE_BACKUP_RESP) {
        Read630State = READ630_RECV_BACKUP_DATA_RESP;
        WriteBackupDataCrc = crc;
    } else if (type == RECV_TYPE_BACKUP_CRC) {
        Read630State = READ630_RECV_BACKUP_DATA_CRC;
    } else {
        ;
    }
}
/***************** Read 630 end ************************/

186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
void GetReadInfo(READ_ARK630_CMD type)
{
    static uint8_t readSt = 0;
    static uint16_t getStRetryCnts = 0;
    uint32_t tmpRet;

    if (NeedWriteSize == 0)
    {
        if (readSt == 0)
        {
            readSt = 1;
            ProcMcuOrBackupData(type, 0, 0, 0); /* 获取偏移地址 */
            getStRetryCnts = 500;
        }
        else
        {
            tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0);
            if ((tmpRet != 2) || (--getStRetryCnts == 0)) /* 非零值为获得的程序地址 */
            {
                if (tmpRet != 2)
                {
                    NeedWriteSize = 32; /* 此时的NeedWriteSize不重要, 只要跳出循环就行 */
                    if (type == GET_APP_DATA_OFFSET)
                    {
                        FactOffset = 0; /* USB按相对地址获取数据 */
                    }
                    AppOffset = 0x00;
                }
                readSt = 0;
            }
        }
    }
}

/**
 * @brief 检查Flash中的MCU程序信息, 是否与当前运行的MCU_APP信息相同, 若不同, 则进入升级模式
 */
void Check_MCU_in_Flash(READ_ARK630_CMD type)
{
    static uint8_t readSt = 0;
    static uint16_t getStRetryCnts = 0;

    uint32_t tmpLen;
    uint8_t saveVersion[16];
    uint8_t readVersion[16];

    if (NeedWriteSize != 0)
    {
        if (readSt == 0)
        {
            readSt = 1;
            (void)memset(ReadDataBuf, 0xFFU, sizeof(ReadDataBuf)); /* 初始化buffer */
238
            ProcMcuOrBackupData(REQ_DATA, FactOffset, READ_MCU_DATA_MAX, ReadDataBuf); // 按地址获取程序数据
239 240 241 242 243
            getStRetryCnts = 500;
        }
        else
        {
            tmpLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0); /* 获取读取状态 */
244
            if (FactOffset + READ_MCU_DATA_MAX == tmpLen)             /* 当返回值为目标位置时为数据获取成功 */
245 246 247 248 249 250 251 252
            {
                if (AppOffset == 0) /* 首个数据块内解析文件信息 */
                {
                    if (type == GET_APP_DATA_OFFSET) /* 从 MCU_APP 升级文件 */
                    {
                        flash_read(FLASH_630H_UPDATE_INFO, sizeof(saveVersion), saveVersion); /* 读取630H升级记录 */

                        memcpy(readVersion, &ReadDataBuf[16], 16);          /* 630中读出的版本信息 */
253
                        if (memcmp(readVersion, saveVersion, 16) != 0) /* 对比版本不同才更新 */
254 255 256 257 258 259 260
                        {
                            Get_Into_630H_Update_MCU_Mode();
                        }
                        else
                        {
                            /* 信息相同, 重置状态 */
                            NeedWriteSize = 0;
261
                            Check_Upgrade = 0;
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
                            readSt = 0;
                        }
                    }
                }
            }
            if (--getStRetryCnts == 0)
            {
                /* 读信息超时, 重置状态 */
                readSt = 0;
            }
        }
    }
}

void Check_MCU_Info_in_630H(void)
{
278 279
    
    if(Check_Upgrade == 1U)
280 281 282 283
    {
        GetReadInfo(GET_APP_DATA_OFFSET);
        Check_MCU_in_Flash(GET_APP_DATA_OFFSET);
    }
284 285 286 287 288 289 290 291 292
    else
    {
        Check_Upgrade_Cnt++;
        if(Check_Upgrade_Cnt >= 2500U) /* 放在2ms任务中, 2500 = 5000ms */
        {
            Check_Upgrade_Cnt = 0;
            Check_Upgrade = 1U;
        }
    }
293
}