Пример #1
0
static CO_SDO_abortCode_t CO_ODF_1011(CO_ODF_arg_t *ODF_arg) {
    CO_EE_t *ee;
    uint32_t value;
    CO_SDO_abortCode_t ret = CO_SDO_AB_NONE;

    ee = (CO_EE_t*) ODF_arg->object;
    value = CO_getUint32(ODF_arg->data);

    if(!ODF_arg->reading) {
        /* don't change the old value */
        CO_memcpy(ODF_arg->data, (const uint8_t*)ODF_arg->ODdataStorage, 4U);

        if(ODF_arg->subIndex >= 1U) {
            if(value == 0x64616F6CUL) {
                /* Clear the eeprom */

            }
            else {
                ret = CO_SDO_AB_DATA_TRANSF;
            }
        }
    }

    return ret;
}
Пример #2
0
static CO_SDO_abortCode_t CO_ODF_1010(CO_ODF_arg_t *ODF_arg) {
    CO_EE_t *ee;
    uint32_t value;
    CO_SDO_abortCode_t ret = CO_SDO_AB_NONE;

    ee = (CO_EE_t*) ODF_arg->object;
    value = CO_getUint32(ODF_arg->data);

    if(!ODF_arg->reading) {
        /* don't change the old value */
        CO_memcpy(ODF_arg->data, (const uint8_t*)ODF_arg->ODdataStorage, 4U);

        if(ODF_arg->subIndex == 1U) {
            if(value == 0x65766173UL) {
                /* write ee->OD_ROMAddress, ee->OD_ROMSize to eeprom (blocking function) */

                /* verify data */
                if(0/*error*/) {
                    ret = CO_SDO_AB_HW;
                }
            }
            else {
                ret = CO_SDO_AB_DATA_TRANSF;
            }
        }
    }

    return ret;
}
Пример #3
0
CO_SDO_abortCode_t CO_ODF_1011(CO_ODF_arg_t *ODF_arg) {
    CO_OD_storage_t *odStor;
    uint32_t value;
    CO_SDO_abortCode_t ret = CO_SDO_AB_NONE;

    odStor = (CO_OD_storage_t*) ODF_arg->object;
    value = CO_getUint32(ODF_arg->data);

    if(!ODF_arg->reading) {
        /* don't change the old value */
        CO_memcpy(ODF_arg->data, (const uint8_t*)ODF_arg->ODdataStorage, 4U);

        if(ODF_arg->subIndex >= 1) {
            /* restore default parameters */
            if(value == 0x64616F6CUL) {
                if(CO_OD_storage_restoreSecure(odStor->filename) != 0) {
                    ret = CO_SDO_AB_HW;
                }
            }
            else {
                ret = CO_SDO_AB_DATA_TRANSF;
            }
        }
    }

    return ret;
}
Пример #4
0
/* Restore default parameters *************************************************/
static CO_SDO_abortCode_t CO_ODF_1011(CO_ODF_arg_t *ODF_arg){
    uint32_t value;
    CO_SDO_abortCode_t ret = CO_SDO_AB_NONE;

    value = CO_getUint32(ODF_arg->data);

    if(!ODF_arg->reading){
        /* don't change the old value */
        CO_memcpy(ODF_arg->data, (const uint8_t*)ODF_arg->ODdataStorage, 4U);

        if(ODF_arg->subIndex >= 1){
            if(value == 0x64616F6CUL){
                /* restore default parameters */
                /* rename current file to .old, so it no longer exist */
                remove(EE_ROM_FILENAME_OLD);
                rename(EE_ROM_FILENAME, EE_ROM_FILENAME_OLD);

                /* create an empty file */
                FILE *fp = fopen(EE_ROM_FILENAME, "wt");
                if(!fp){
                    rename(EE_ROM_FILENAME_OLD, EE_ROM_FILENAME);
                    return CO_SDO_AB_HW;
                }
                /* write one byte '-' to the file */
                fputc('-', fp);
                fclose(fp);

                return CO_SDO_AB_NONE;
            }
            else
                return CO_SDO_AB_DATA_TRANSF;
        }
    }

    return ret;
}
Пример #5
0
void CO_EM_process(
        CO_EMpr_t              *emPr,
        CO_bool_t               NMTisPreOrOperational,
        uint16_t                timeDifference_100us,
        uint16_t                emInhTime)
{

    CO_EM_t *em = emPr->em;
    uint8_t errorRegister;

    /* verify errors from driver and other */
    CO_CANverifyErrors(emPr->CANdev);
    if(em->wrongErrorReport != 0U){
        CO_errorReport(em, CO_EM_WRONG_ERROR_REPORT, CO_EMC_SOFTWARE_INTERNAL, (uint32_t)em->wrongErrorReport);
        em->wrongErrorReport = 0U;
    }


    /* calculate Error register */
    errorRegister = 0U;
    /* generic error */
    if(em->errorStatusBits[5]){
        errorRegister |= CO_ERR_REG_GENERIC_ERR;
    }
    /* communication error (overrun, error state) */
    if(em->errorStatusBits[2] || em->errorStatusBits[3]){
        errorRegister |= CO_ERR_REG_COMM_ERR;
    }
    *emPr->errorRegister = (*emPr->errorRegister & 0xEEU) | errorRegister;

    /* inhibit time */
    if(emPr->inhibitEmTimer < emInhTime){
        emPr->inhibitEmTimer += timeDifference_100us;
    }

    /* send Emergency message. */
    if(     NMTisPreOrOperational &&
            !emPr->CANtxBuff->bufferFull &&
            emPr->inhibitEmTimer >= emInhTime &&
            (em->bufReadPtr != em->bufWritePtr || em->bufFull))
    {
        uint32_t preDEF;    /* preDefinedErrorField */
        
        /* add error register */
        em->bufReadPtr[2] = *emPr->errorRegister;

        /* copy data to CAN emergency message */
        CO_memcpy(emPr->CANtxBuff->data, em->bufReadPtr, 8U);
        CO_memcpy((uint8_t*)&preDEF, em->bufReadPtr, 4U);
        em->bufReadPtr += 8;

        /* Update read buffer pointer and reset inhibit timer */
        if(em->bufReadPtr == em->bufEnd){
            em->bufReadPtr = em->buf;
        }
        emPr->inhibitEmTimer = 0U;

        /* verify message buffer overflow, then clear full flag */
        if(em->bufFull == 2U){
            em->bufFull = 0U;    /* will be updated below */
            CO_errorReport(em, CO_EM_EMERGENCY_BUFFER_FULL, CO_EMC_GENERIC, 0U);
        }
        else{
            em->bufFull = 0;
        }

        /* write to 'pre-defined error field' (object dictionary, index 0x1003) */
        if(emPr->preDefErr){
            uint8_t i;

            if(emPr->preDefErrNoOfErrors < emPr->preDefErrSize)
                emPr->preDefErrNoOfErrors++;
            for(i=emPr->preDefErrNoOfErrors-1; i>0; i--)
                emPr->preDefErr[i] = emPr->preDefErr[i-1];
            emPr->preDefErr[0] = preDEF;
        }

        /* send CAN message */
        CO_CANsend(emPr->CANdev, emPr->CANtxBuff);
    }

    return;
}
Пример #6
0
/* Store parameters ***********************************************************/
static CO_SDO_abortCode_t CO_ODF_1010(CO_ODF_arg_t *ODF_arg){
    CO_EE_t *ee;
    uint32_t value;
    CO_SDO_abortCode_t ret = CO_SDO_AB_NONE;

    ee = (CO_EE_t*) ODF_arg->object;
    value = CO_getUint32(ODF_arg->data);

    if(!ODF_arg->reading){
        /* don't change the old value */
        CO_memcpy(ODF_arg->data, (const uint8_t*)ODF_arg->ODdataStorage, 4U);

        if(ODF_arg->subIndex == 1){
            if(value == 0x65766173UL){
                /* store parameters */
                /* rename current file to .old */
                remove(EE_ROM_FILENAME_OLD);
                rename(EE_ROM_FILENAME, EE_ROM_FILENAME_OLD);
                /* open a file */
                FILE *fp = fopen(EE_ROM_FILENAME, "wb");
                if(!fp){
                    rename(EE_ROM_FILENAME_OLD, EE_ROM_FILENAME);
                    return CO_SDO_AB_HW;
                }

                /* write data to the file */
                fwrite((const void *)ee->OD_ROMAddress, 1, ee->OD_ROMSize, fp);
                /* write CRC to the end of the file */
                uint16_t CRC = crc16_ccitt((unsigned char*)ee->OD_ROMAddress, ee->OD_ROMSize, 0);
                fwrite((const void *)&CRC, 1, 2, fp);
                fclose(fp);

                /* verify data */
                void *buf = malloc(ee->OD_ROMSize + 4);
                if(buf){
                    fp = fopen(EE_ROM_FILENAME, "rb");
                    uint32_t cnt = 0;
                    uint16_t CRC2 = 0;
                    if(fp){
                        cnt = fread(buf, 1, ee->OD_ROMSize, fp);
                        CRC2 = crc16_ccitt((unsigned char*)buf, ee->OD_ROMSize, 0);
                        /* read also two bytes of CRC */
                        cnt += fread(buf, 1, 4, fp);
                        fclose(fp);
                    }
                    free(buf);
                    if(cnt == (ee->OD_ROMSize + 2) && CRC == CRC2){
                        /* write successful */
                        return CO_SDO_AB_NONE;
                    }
                }
                /* error, set back the old file */
                remove(EE_ROM_FILENAME);
                rename(EE_ROM_FILENAME_OLD, EE_ROM_FILENAME);

                return CO_SDO_AB_HW;
            }
            else
                return CO_SDO_AB_DATA_TRANSF;
        }
    }

    return ret;
}