import os
import glob
fileSymbolName = "CAL_FILE_SRC_"
numFileCntr = 0
calPlibTracker = {}
_HAL_FILES = ['hal_i2c_harmony.c', "atca_hal.c", "atca_hal.h", "atca_start_config.h", "atca_start_iface.h"]
_FILE_PATHS = ['atcacert/*', 'basic/*', 'crypto/**/*', 'crypto/*', 'host/*', 'jwt/*', '*']
def add_value_to_list(symbol_list, value):
values = list(symbol_list.getValues())
if value not in values:
symbol_list.addValue(value)
def del_value_from_list(symbol_list, value):
values = list(symbol_list.getValues())
if value in values:
symbol_list.clearValues()
values.remove(value)
for v in values:
symbol_list.addValue(v)
def updatePlibTracker(id, inc):
global calPlibTracker
cnt = calPlibTracker.pop(id, 0)
if inc:
cnt += 1
calPlibTracker[id] = cnt
elif cnt > 0:
cnt -= 1
calPlibList = Database.getComponentByID('cryptoauthlib').getSymbolByID('CAL_PLIB_LIST_ENTRIES')
if cnt == 0:
del_value_from_list(calPlibList, id)
else:
add_value_to_list(calPlibList, id)
def handleMessage(messageID, args):
global calPlibTracker
if (messageID == 'UPDATE_PLIB_LIST'):
if isinstance(args, dict):
updatePlibTracker(**args)
return {}
def AddFile(component, src_path, dest_path, proj_path, file_type = "SOURCE", isMarkup = False):
global fileSymbolName
global numFileCntr
srcFile = component.createFileSymbol(fileSymbolName + str(numFileCntr) , None)
srcFile.setSourcePath(src_path)
srcFile.setDestPath(dest_path)
srcFile.setProjectPath(proj_path)
srcFile.setType(file_type)
srcFile.setOutputName(os.path.basename(src_path))
srcFile.setMarkup(isMarkup)
numFileCntr += 1
def AddFilesDir(component, base_path, search_pattern, destination_path, project_path):
modulePath = os.path.expanduser(Module.getPath())
filelist = glob.iglob(modulePath + os.sep + base_path + os.sep + search_pattern)
for x in filelist:
_, ext = os.path.splitext(x)
if ext in ['.c','.h']:
source_path = os.path.relpath(os.path.abspath(x), modulePath)
file_path = str(os.path.dirname(os.path.relpath(source_path, base_path)))
file_destination = destination_path + os.sep + file_path
file_project = project_path + '/' + file_path
AddFile(component, source_path, file_destination, file_project.replace('\\','/'),
'HEADER' if ext is 'h' else 'SOURCE')
def onAttachmentConnected(source, target):
srcComponent = source["component"]
srcConnectionID = source["id"]
targetComponentID = target["component"].getID().split('_')[0]
if srcConnectionID == 'CAL_LIB_CAP':
calDeviceList = srcComponent.getSymbolByID('CAL_DEVICE_LIST_ENTRIES')
add_value_to_list(calDeviceList, targetComponentID.upper())
if srcConnectionID == 'FreeRTOS':
calEnableRtos = srcComponent.getSymbolByID('CAL_ENABLE_RTOS')
calEnableRtos.setValue(True)
srcComponent.getSymbolByID('CAL_FILE_SRC_FREERTOS').setEnabled(True)
if srcConnectionID == 'LIB_WOLFCRYPT':
calEnableWolfCrypto = srcComponent.getSymbolByID('CAL_ENABLE_WOLFCRYPTO')
calEnableWolfCrypto.setValue(True)
def onAttachmentDisconnected(source, target):
srcComponent = source["component"]
srcConnectionID = source["id"]
targetComponentID = target["component"].getID().split('_')[0]
if srcConnectionID == 'CAL_LIB_CAP':
calDeviceList = srcComponent.getSymbolByID('CAL_DEVICE_LIST_ENTRIES')
del_value_from_list(calDeviceList, targetComponentID.upper())
if srcConnectionID == 'FreeRTOS':
calEnableRtos = srcComponent.getSymbolByID('CAL_ENABLE_RTOS')
calEnableRtos.setValue(False)
srcComponent.getSymbolByID('CAL_FILE_SRC_FREERTOS').setEnabled(False)
if srcConnectionID == 'LIB_WOLFCRYPT':
calEnableWolfCrypto = srcComponent.getSymbolByID('CAL_ENABLE_WOLFCRYPTO')
calEnableWolfCrypto.setValue(False)
def instantiateComponent(calComponent):
global processor
calInstanceIndex = calComponent.createIntegerSymbol("INDEX", None)
calInstanceIndex.setVisible(False)
calInstanceIndex.setDefaultValue(0)
configName = Variables.get("__CONFIGURATION_NAME")
processor = Variables.get( "__PROCESSOR" )
architecture = Variables.get('__ARCH_DIR').split('\\')[-1]
targetPath = '../src/config/' + configName + '/library/cryptoauthlib'
defSym = calComponent.createSettingSymbol("CAL_XC32_INCLUDE_DIRS", None)
defSym.setCategory("C32")
defSym.setKey("extra-include-directories")
defSym.setValue( '{0};{0}/crypto;'.format(targetPath))
defSym.setAppend(True, ';')
for search_path in _FILE_PATHS:
AddFilesDir(calComponent, 'lib', search_path, 'library/cryptoauthlib',
'config/{}/library/cryptoauthlib'.format(configName))
for hal_file in _HAL_FILES:
AddFilesDir(calComponent, 'lib/hal', hal_file, 'library/cryptoauthlib/hal',
'config/{}/library/cryptoauthlib/hal'.format(configName))
calEnableHeap = calComponent.createBooleanSymbol("CAL_ENABLE_HEAP", None)
calEnableHeap.setLabel("Enable Heap?")
calEnableHeap.setVisible(True)
calDebugPrint = calComponent.createBooleanSymbol("CAL_ENABLE_DEBUG_PRINT", None)
calDebugPrint.setLabel("Enable Debug Print?")
calDebugPrint.setVisible(True)
calEnablePolling = calComponent.createBooleanSymbol("CAL_ENABLE_POLLING", None)
calEnablePolling.setLabel("Enable Polling for Response?")
calEnablePolling.setDefaultValue(True)
calEnablePolling.setVisible(True)
calPollingInitTime = calComponent.createIntegerSymbol('CAL_POLL_INIT_TIME', None)
calPollingInitTime.setLabel('Polling Init Time (ms)')
calPollingInitTime.setDefaultValue(1)
calPollingPeriod = calComponent.createIntegerSymbol('CAL_POLL_PERIOD', None)
calPollingPeriod.setLabel('Polling Period (ms)')
calPollingPeriod.setDefaultValue(2)
calPollingTimeout = calComponent.createIntegerSymbol('CAL_POLL_TIMEOUT', None)
calPollingTimeout.setLabel('Polling Timeout (ms)')
calPollingTimeout.setDefaultValue(2500)
calEnableRtos = calComponent.createBooleanSymbol("CAL_ENABLE_RTOS", None)
calEnableRtos.setValue(False)
calEnableRtos.setVisible(False)
calLibFreeRTOSSrcFile = calComponent.createFileSymbol("CAL_FILE_SRC_FREERTOS", None)
calLibFreeRTOSSrcFile.setSourcePath("lib/hal/hal_freertos.c")
calLibFreeRTOSSrcFile.setOutputName("hal_freertos.c")
calLibFreeRTOSSrcFile.setDestPath("library/cryptoauthlib/hal")
calLibFreeRTOSSrcFile.setProjectPath("config/" + configName + "/library/cryptoauthlib/hal/")
calLibFreeRTOSSrcFile.setType('SOURCE')
calLibFreeRTOSSrcFile.setEnabled(False)
calEnableWolfCrypto = calComponent.createBooleanSymbol('CAL_ENABLE_WOLFCRYPTO', None)
calEnableWolfCrypto.setValue(False)
calEnableWolfCrypto.setVisible(False)
calPlibList = calComponent.createListSymbol('CAL_PLIB_LIST', None)
calPlibList = calComponent.createListEntrySymbol('CAL_PLIB_LIST_ENTRIES', None)
calPlibList.setTarget('cryptoauthlib.CAL_PLIB_LIST')
calDeviceList = calComponent.createListSymbol('CAL_DEVICE_LIST', None)
calDeviceList = calComponent.createListEntrySymbol('CAL_DEVICE_LIST_ENTRIES', None)
calDeviceList.setTarget('cryptoauthlib.CAL_DEVICE_LIST')
calLibCoreM0PlusSrcFile = calComponent.createFileSymbol("CAL_I2C_HARMONY_INIT_DATA", None)
calLibCoreM0PlusSrcFile.setSourcePath("harmony/templates/hal_i2c_harmony_init.c.ftl")
calLibCoreM0PlusSrcFile.setOutputName("hal_i2c_harmony_init.c")
calLibCoreM0PlusSrcFile.setDestPath("library/cryptoauthlib/hal")
calLibCoreM0PlusSrcFile.setProjectPath("config/" + configName + "/library/cryptoauthlib/hal/")
calLibCoreM0PlusSrcFile.setType("SOURCE")
calLibCoreM0PlusSrcFile.setOverwrite(True)
calLibCoreM0PlusSrcFile.setMarkup(True)
calLibConfigFile = calComponent.createFileSymbol("CAL_LIB_CONFIG_DATA", None)
calLibConfigFile.setSourcePath("harmony/templates/atca_config.h.ftl")
calLibConfigFile.setOutputName("atca_config.h")
calLibConfigFile.setDestPath("library/cryptoauthlib")
calLibConfigFile.setProjectPath("config/" + configName + "/library/cryptoauthlib/")
calLibConfigFile.setType("HEADER")
calLibConfigFile.setOverwrite(True)
calLibConfigFile.setMarkup(True)
calLibDelaySrcFile = calComponent.createFileSymbol('CAL_LIB_SRC_DELAY', None)
if 'cortex_m'in architecture :
calLibDelaySrcFile.setSourcePath("harmony/templates/hal_cortex_m_delay.c.ftl")
calLibDelaySrcFile.setOutputName("hal_cortex_m_delay.c")
else:
calLibDelaySrcFile.setSourcePath("harmony/templates/hal_pic32_delay.c.ftl")
calLibDelaySrcFile.setOutputName("hal_pic32_delay.c")
calLibDelaySrcFile.setDestPath("library/cryptoauthlib/hal")
calLibDelaySrcFile.setProjectPath("config/" + configName + "/library/cryptoauthlib/hal/")
calLibDelaySrcFile.setType("SOURCE")
calLibDelaySrcFile.setOverwrite(True)
calLibDelaySrcFile.setMarkup(True)