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; }
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; }
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; }
/* 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; }
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; }
/* 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; }