Adafruit_Learning_System_Gu.../DigiKey_IoT_Home/iot-home.atmo
2019-12-03 10:53:38 -05:00

2859 lines
No EOL
335 KiB
Text

{
"name": "IoT Home",
"createVersion": "2017-08-12",
"description": "New Project",
"lastModified": "2019-11-21T21:12:12.661Z",
"created": "2019-11-21T21:12:12.661Z",
"meta": {
"projectTypeName": "Huzzah32",
"projectTypeId": "AdafruitHuzzah32"
},
"planes": {
"Adafruit Huzzah32": {
"type": "esp32",
"compilerVersion": "latest",
"variants": [
"AdafruitHuzzah32"
],
"meta": {},
"elements": [
{
"name": "GPIOPin14",
"type": "EmbeddedGPIOPin",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_GPIO_Config_t config;\n\tconfig.pinMode = ATMO_PROPERTY(GPIOPin14, mode);\n\tconfig.initialState = ATMO_PROPERTY(GPIOPin14, state);\n\tATMO_GPIO_SetPinConfiguration(ATMO_PROPERTY(GPIOPin14, instance), ATMO_PROPERTY(GPIOPin14, pin), &config);\n\n\t#if ATMO_PROPERTY(GPIOPin14, interruptEnabled) == true\n\t\tATMO_GPIO_RegisterInterruptCallback(\n\t\t\tATMO_PROPERTY(GPIOPin14, instance), \n\t\t\tATMO_PROPERTY(GPIOPin14, pin), \n\t\t\tATMO_PROPERTY(GPIOPin14, interruptMode), \n\t\t\tATMO_INTERRUPT(GPIOPin14, interrupt));\n\t#endif\n\t\n\treturn ATMO_Status_Success;\n\t",
"setState": "\n\tATMO_BOOL_t state;\n\tATMO_GetBool(in, &state);\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin14, instance), ATMO_PROPERTY(GPIOPin14, pin), (ATMO_GPIO_PinState_t)state);\n\treturn ATMO_Status_Success;\n\t",
"setPinHigh": "\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin14, instance), ATMO_PROPERTY(GPIOPin14, pin), ATMO_GPIO_PinState_High);\n\treturn ATMO_Status_Success;\n\t",
"setPinLow": "\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin14, instance), ATMO_PROPERTY(GPIOPin14, pin), ATMO_GPIO_PinState_Low);\n\treturn ATMO_Status_Success;\n\t",
"read": "\n\tATMO_CreateValueBool(out, ATMO_GPIO_Read(ATMO_PROPERTY(GPIOPin14, instance), ATMO_PROPERTY(GPIOPin14, pin)));\n\treturn ATMO_Status_Success;\n\t",
"toggle": "\n\tATMO_GPIO_Toggle(ATMO_PROPERTY(GPIOPin14, instance), ATMO_PROPERTY(GPIOPin14, pin));\n\treturn ATMO_Status_Success;\n\t",
"interrupt": "\n\tATMO_CreateValueCopy(out, in);\n\treturn ATMO_Status_Success;\n\t"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setState": false,
"setPinHigh": false,
"setPinLow": false,
"read": false,
"toggle": false,
"interrupt": false
},
"instance": "ATMO_DRIVERINSTANCE_GPIO_GPIO1",
"pin": "IO14",
"mode": "ATMO_GPIO_PinMode_Output_PushPull",
"state": "ATMO_GPIO_PinState_Low",
"interruptEnabled": false,
"interruptMode": "ATMO_GPIO_InterruptTrigger_None"
},
"meta": {
"editorX": 225,
"editorY": 12,
"lastTrigger": "interrupt"
},
"triggers": {
"triggered": [],
"stateSet": [],
"read": [],
"toggled": [],
"interrupt": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setState": false,
"setPinHigh": false,
"setPinLow": false,
"read": false,
"toggle": false,
"interrupt": true
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setState",
"triggers": [
"stateSet"
]
},
{
"name": "setPinHigh",
"triggers": [
"stateSet"
]
},
{
"name": "setPinLow",
"triggers": [
"stateSet"
]
},
{
"name": "read",
"triggers": [
"read"
]
},
{
"name": "toggle",
"triggers": [
"toggled"
]
},
{
"name": "interrupt",
"triggers": [
"interrupt"
]
}
]
},
{
"name": "BLECharacteristicLights",
"type": "EmbeddedBLECharacteristicCustom",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"ble"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicLights, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicLights, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicLights, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicLights, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicLights, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicLights, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicLights, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicLights, writeDataType), ATMO_PROPERTY(BLECharacteristicLights, readDataType), ATMO_PROPERTY(BLECharacteristicLights, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicLights, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicLights, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicLights, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\tATMO_VARIABLE(BLECharacteristicLights, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicLights, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicLights, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\tATMO_VARIABLE(BLECharacteristicLights, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicLights, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a974",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_BOOL",
"writeDataType": "ATMO_DATATYPE_BOOL",
"notifyDataType": "ATMO_DATATYPE_BOOL"
},
"meta": {
"editorX": 76,
"editorY": 12,
"lastTrigger": "written"
},
"triggers": {
"triggered": [],
"written": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "GPIOPin14",
"targetAbility": "setState"
}
],
"subscibed": [],
"unsubscribed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setValue": "valueSet",
"written": false,
"subscibed": false,
"unsubscribed": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setValue",
"triggers": []
},
{
"name": "written",
"triggers": [
"written"
]
},
{
"name": "subscibed",
"triggers": [
"subscibed"
]
},
{
"name": "unsubscribed",
"triggers": [
"unsubscribed"
]
}
]
},
{
"name": "Interval",
"type": "EmbeddedInterval",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_INTERVAL_Handle_t intervalHandle;\n ATMO_INTERVAL_AddAbilityInterval(\n\t\tATMO_PROPERTY(Interval, instance), \n\t\tATMO_ABILITY(Interval, interval), \n\t\tATMO_PROPERTY(Interval, time), \n\t\t&intervalHandle\n\t);\n\t\n\treturn ATMO_Status_Success;\n\t",
"interval": "\treturn ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"interval": false
},
"instance": "ATMO_DRIVERINSTANCE_INTERVAL_INTERVAL1",
"time": 1000
},
"meta": {
"editorX": 74,
"editorY": 289,
"lastTrigger": "interval"
},
"triggers": {
"triggered": [],
"interval": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "ADT7410FeatherWing",
"targetAbility": "readTemperature"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "BME680",
"targetAbility": "readHumidity"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "BME680",
"targetAbility": "readGasResistance"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"interval": true
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "interval",
"triggers": [
"interval"
]
}
]
},
{
"name": "ADT7410FeatherWing",
"type": "EmbeddedADT7410FeatherWing",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": " ADT7410_Init(ATMO_PROPERTY(ADT7410FeatherWing, i2cInstance), ATMO_PROPERTY(ADT7410FeatherWing, i2cAddress));\n return ATMO_Status_Success;",
"readTemperature": " float temperature = 0;\n\n if(!ADT7410_ReadTemperature(&temperature))\n {\n return ATMO_Status_Fail;\n }\n\n ATMO_CreateValueFloat(out, temperature);\n return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"readTemperature": false
},
"i2cInstance": "ATMO_DRIVERINSTANCE_I2C_I2C1",
"i2cAddress": "0x48"
},
"meta": {
"editorX": 225,
"editorY": 114,
"lastTrigger": "temperatureRead"
},
"triggers": {
"triggered": [],
"temperatureRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicTemp",
"targetAbility": "setValue"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "DebugPrintTemp",
"targetAbility": "print"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"readTemperature": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "readTemperature",
"triggers": [
"temperatureRead"
]
}
]
},
{
"name": "BLECharacteristicTemp",
"type": "EmbeddedBLECharacteristicCustom",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"ble"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicTemp, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicTemp, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicTemp, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicTemp, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicTemp, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicTemp, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicTemp, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicTemp, writeDataType), ATMO_PROPERTY(BLECharacteristicTemp, readDataType), ATMO_PROPERTY(BLECharacteristicTemp, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicTemp, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicTemp, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicTemp, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\tATMO_VARIABLE(BLECharacteristicTemp, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicTemp, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicTemp, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\tATMO_VARIABLE(BLECharacteristicTemp, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicTemp, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a975",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_STRING",
"writeDataType": "ATMO_DATATYPE_STRING",
"notifyDataType": "ATMO_DATATYPE_STRING"
},
"meta": {
"editorX": 380,
"editorY": 65,
"lastTrigger": "written"
},
"triggers": {
"triggered": [],
"written": [],
"subscibed": [],
"unsubscribed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setValue": "valueSet",
"written": false,
"subscibed": false,
"unsubscribed": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setValue",
"triggers": []
},
{
"name": "written",
"triggers": [
"written"
]
},
{
"name": "subscibed",
"triggers": [
"subscibed"
]
},
{
"name": "unsubscribed",
"triggers": [
"unsubscribed"
]
}
]
},
{
"name": "DebugPrintTemp",
"type": "EmbeddedDebugPrint",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"debugPrint"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\treturn ATMO_Status_Success;\n\t",
"print": "\n if((in != NULL) && (in->type != ATMO_DATATYPE_VOID))\n {\n char str[256];\n unsigned int prependLen = strlen(ATMO_PROPERTY(DebugPrintTemp, prepend));\n // If there's text to prepend, do that first\n if(prependLen > 0)\n {\n sprintf(str, \"%s: \", ATMO_PROPERTY(DebugPrintTemp, prepend));\n prependLen += 2; // Adding 2 chars for \": \"\n }\n \n // Grab the string version of the input data, place it after the prepend text\n if(ATMO_GetString(in, str + prependLen, 256 - prependLen) == ATMO_Status_Success)\n {\n ATMO_PLATFORM_DebugPrint(\"%s\\r\\n\", str);\n }\n }\n else\n {\n ATMO_PLATFORM_DebugPrint(\"%s\\r\\n\", ATMO_PROPERTY(DebugPrintTemp, prepend));\n }\n \n return ATMO_Status_Success;\n "
},
"variables": {},
"embeddedPropertyConversions": {
"prepend": "string"
},
"codeUserChanged": {
"setup": false,
"print": false
},
"prepend": "Temperature(*C): "
},
"meta": {
"editorX": 378,
"editorY": 212,
"lastTrigger": "printed"
},
"triggers": {
"triggered": [],
"printed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"print": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "print",
"triggers": [
"printed"
]
}
]
},
{
"name": "BME680",
"type": "EmbeddedBME680",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "BME680_Config_t config;\nconfig.i2cInstance = ATMO_PROPERTY(BME680, i2cInstance );\nconfig.i2cAddr = ATMO_PROPERTY(BME680, i2cAddress );\n\nif ( !BME680_Init( &config ) )\n{\n\treturn ATMO_Status_Fail;\n}\n\nreturn ATMO_Status_Success;",
"readTemperature": "float temperature = 0.0;\n\nif ( BME680_GetTempData( &temperature ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, temperature );\n\nreturn ATMO_Status_Success;",
"readHumidity": "float humidity = 0.0;\n\nif ( BME680_GetHumidity( &humidity ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, humidity );\n\nreturn ATMO_Status_Success;",
"readPressure": "float pressure = 0.0;\n\nif ( BME680_GetPressure( &pressure ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, pressure );\n\nreturn ATMO_Status_Success;",
"readGasResistance": "float gas_resistance = 0.0;\n\nif ( BME680_GetGasRes( &gas_resistance ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, gas_resistance );\n\nreturn ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"readTemperature": false,
"readHumidity": false,
"readPressure": false,
"readGasResistance": false
},
"i2cInstance": "ATMO_DRIVERINSTANCE_I2C_I2C1",
"i2cAddress": "0x77"
},
"meta": {
"editorX": 228,
"editorY": 514,
"lastTrigger": "gasResistanceRead"
},
"triggers": {
"triggered": [],
"temperatureRead": [],
"humidityRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicHumid",
"targetAbility": "setValue"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "DebugPrintHumid",
"targetAbility": "print"
}
],
"pressureRead": [],
"gasResistanceRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicGas",
"targetAbility": "setValue"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "DebugPrintGas",
"targetAbility": "print"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"readTemperature": false,
"readHumidity": false,
"readPressure": false,
"readGasResistance": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "readTemperature",
"triggers": [
"temperatureRead"
]
},
{
"name": "readHumidity",
"triggers": [
"humidityRead"
]
},
{
"name": "readPressure",
"triggers": [
"pressureRead"
]
},
{
"name": "readGasResistance",
"triggers": [
"gasResistanceRead"
]
}
]
},
{
"name": "BLECharacteristicHumid",
"type": "EmbeddedBLECharacteristicCustom",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"ble"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicHumid, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicHumid, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicHumid, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicHumid, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicHumid, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicHumid, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicHumid, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicHumid, writeDataType), ATMO_PROPERTY(BLECharacteristicHumid, readDataType), ATMO_PROPERTY(BLECharacteristicHumid, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicHumid, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicHumid, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicHumid, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\tATMO_VARIABLE(BLECharacteristicHumid, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicHumid, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicHumid, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\tATMO_VARIABLE(BLECharacteristicHumid, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicHumid, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a976",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_STRING",
"writeDataType": "ATMO_DATATYPE_STRING",
"notifyDataType": "ATMO_DATATYPE_STRING"
},
"meta": {
"editorX": 377,
"editorY": 315,
"lastTrigger": "written"
},
"triggers": {
"triggered": [],
"written": [],
"subscibed": [],
"unsubscribed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setValue": "valueSet",
"written": false,
"subscibed": false,
"unsubscribed": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setValue",
"triggers": []
},
{
"name": "written",
"triggers": [
"written"
]
},
{
"name": "subscibed",
"triggers": [
"subscibed"
]
},
{
"name": "unsubscribed",
"triggers": [
"unsubscribed"
]
}
]
},
{
"name": "DebugPrintHumid",
"type": "EmbeddedDebugPrint",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"debugPrint"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\treturn ATMO_Status_Success;\n\t",
"print": "\n if((in != NULL) && (in->type != ATMO_DATATYPE_VOID))\n {\n char str[256];\n unsigned int prependLen = strlen(ATMO_PROPERTY(DebugPrintHumid, prepend));\n // If there's text to prepend, do that first\n if(prependLen > 0)\n {\n sprintf(str, \"%s: \", ATMO_PROPERTY(DebugPrintHumid, prepend));\n prependLen += 2; // Adding 2 chars for \": \"\n }\n \n // Grab the string version of the input data, place it after the prepend text\n if(ATMO_GetString(in, str + prependLen, 256 - prependLen) == ATMO_Status_Success)\n {\n ATMO_PLATFORM_DebugPrint(\"%s\\r\\n\", str);\n }\n }\n else\n {\n ATMO_PLATFORM_DebugPrint(\"%s\\r\\n\", ATMO_PROPERTY(DebugPrintHumid, prepend));\n }\n \n return ATMO_Status_Success;\n "
},
"variables": {},
"embeddedPropertyConversions": {
"prepend": "string"
},
"codeUserChanged": {
"setup": false,
"print": false
},
"prepend": "Humidity (%RH):"
},
"meta": {
"editorX": 376,
"editorY": 415,
"lastTrigger": "printed"
},
"triggers": {
"triggered": [],
"printed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"print": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "print",
"triggers": [
"printed"
]
}
]
},
{
"name": "DebugPrintGas",
"type": "EmbeddedDebugPrint",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"debugPrint"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\treturn ATMO_Status_Success;\n\t",
"print": "\n if((in != NULL) && (in->type != ATMO_DATATYPE_VOID))\n {\n char str[256];\n unsigned int prependLen = strlen(ATMO_PROPERTY(DebugPrintGas, prepend));\n // If there's text to prepend, do that first\n if(prependLen > 0)\n {\n sprintf(str, \"%s: \", ATMO_PROPERTY(DebugPrintGas, prepend));\n prependLen += 2; // Adding 2 chars for \": \"\n }\n \n // Grab the string version of the input data, place it after the prepend text\n if(ATMO_GetString(in, str + prependLen, 256 - prependLen) == ATMO_Status_Success)\n {\n ATMO_PLATFORM_DebugPrint(\"%s\\r\\n\", str);\n }\n }\n else\n {\n ATMO_PLATFORM_DebugPrint(\"%s\\r\\n\", ATMO_PROPERTY(DebugPrintGas, prepend));\n }\n \n return ATMO_Status_Success;\n "
},
"variables": {},
"embeddedPropertyConversions": {
"prepend": "string"
},
"codeUserChanged": {
"setup": false,
"print": false
},
"prepend": "Gas (ohms):"
},
"meta": {
"editorX": 379,
"editorY": 663,
"lastTrigger": "printed"
},
"triggers": {
"triggered": [],
"printed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"print": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "print",
"triggers": [
"printed"
]
}
]
},
{
"name": "BLECharacteristicGas",
"type": "EmbeddedBLECharacteristicCustom",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"ble"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicGas, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicGas, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicGas, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicGas, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicGas, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicGas, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicGas, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicGas, writeDataType), ATMO_PROPERTY(BLECharacteristicGas, readDataType), ATMO_PROPERTY(BLECharacteristicGas, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicGas, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicGas, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicGas, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\tATMO_VARIABLE(BLECharacteristicGas, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicGas, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicGas, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\tATMO_VARIABLE(BLECharacteristicGas, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicGas, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a977",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_STRING",
"writeDataType": "ATMO_DATATYPE_STRING",
"notifyDataType": "ATMO_DATATYPE_STRING"
},
"meta": {
"editorX": 379,
"editorY": 569,
"lastTrigger": "written"
},
"triggers": {
"triggered": [],
"written": [],
"subscibed": [],
"unsubscribed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setValue": "valueSet",
"written": false,
"subscibed": false,
"unsubscribed": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setValue",
"triggers": []
},
{
"name": "written",
"triggers": [
"written"
]
},
{
"name": "subscibed",
"triggers": [
"subscibed"
]
},
{
"name": "unsubscribed",
"triggers": [
"unsubscribed"
]
}
]
},
{
"name": "IntervalFast",
"type": "EmbeddedInterval",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_INTERVAL_Handle_t intervalHandle;\n ATMO_INTERVAL_AddAbilityInterval(\n\t\tATMO_PROPERTY(IntervalFast, instance), \n\t\tATMO_ABILITY(IntervalFast, interval), \n\t\tATMO_PROPERTY(IntervalFast, time), \n\t\t&intervalHandle\n\t);\n\t\n\treturn ATMO_Status_Success;\n\t",
"interval": "\treturn ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"interval": false
},
"instance": "ATMO_DRIVERINSTANCE_INTERVAL_INTERVAL1",
"time": "50"
},
"meta": {
"editorX": 26,
"editorY": 812,
"lastTrigger": "interval"
},
"triggers": {
"triggered": [],
"interval": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "GPIOPin15",
"targetAbility": "read"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"interval": true
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "interval",
"triggers": [
"interval"
]
}
]
},
{
"name": "GPIOPin15",
"type": "EmbeddedGPIOPin",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_GPIO_Config_t config;\n\tconfig.pinMode = ATMO_PROPERTY(GPIOPin15, mode);\n\tconfig.initialState = ATMO_PROPERTY(GPIOPin15, state);\n\tATMO_GPIO_SetPinConfiguration(ATMO_PROPERTY(GPIOPin15, instance), ATMO_PROPERTY(GPIOPin15, pin), &config);\n\n\t#if ATMO_PROPERTY(GPIOPin15, interruptEnabled) == true\n\t\tATMO_GPIO_RegisterInterruptCallback(\n\t\t\tATMO_PROPERTY(GPIOPin15, instance), \n\t\t\tATMO_PROPERTY(GPIOPin15, pin), \n\t\t\tATMO_PROPERTY(GPIOPin15, interruptMode), \n\t\t\tATMO_INTERRUPT(GPIOPin15, interrupt));\n\t#endif\n\t\n\treturn ATMO_Status_Success;\n\t",
"setState": "\n\tATMO_BOOL_t state;\n\tATMO_GetBool(in, &state);\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin15, instance), ATMO_PROPERTY(GPIOPin15, pin), (ATMO_GPIO_PinState_t)state);\n\treturn ATMO_Status_Success;\n\t",
"setPinHigh": "\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin15, instance), ATMO_PROPERTY(GPIOPin15, pin), ATMO_GPIO_PinState_High);\n\treturn ATMO_Status_Success;\n\t",
"setPinLow": "\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin15, instance), ATMO_PROPERTY(GPIOPin15, pin), ATMO_GPIO_PinState_Low);\n\treturn ATMO_Status_Success;\n\t",
"read": "\n\tATMO_CreateValueBool(out, ATMO_GPIO_Read(ATMO_PROPERTY(GPIOPin15, instance), ATMO_PROPERTY(GPIOPin15, pin)));\n\treturn ATMO_Status_Success;\n\t",
"toggle": "\n\tATMO_GPIO_Toggle(ATMO_PROPERTY(GPIOPin15, instance), ATMO_PROPERTY(GPIOPin15, pin));\n\treturn ATMO_Status_Success;\n\t",
"interrupt": "\n\tATMO_CreateValueCopy(out, in);\n\treturn ATMO_Status_Success;\n\t"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setState": false,
"setPinHigh": false,
"setPinLow": false,
"read": false,
"toggle": false,
"interrupt": false
},
"instance": "ATMO_DRIVERINSTANCE_GPIO_GPIO1",
"pin": "IO15",
"mode": "ATMO_GPIO_PinMode_Input_PullDown",
"state": "ATMO_GPIO_PinState_Low",
"interruptEnabled": false,
"interruptMode": "ATMO_GPIO_InterruptTrigger_None"
},
"meta": {
"editorX": 178,
"editorY": 813,
"lastTrigger": "read"
},
"triggers": {
"triggered": [],
"stateSet": [],
"read": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicDoor",
"targetAbility": "setValue"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "EmbeddedComparisonDoor",
"targetAbility": "evaluate"
}
],
"toggled": [],
"interrupt": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setState": false,
"setPinHigh": false,
"setPinLow": false,
"read": false,
"toggle": false,
"interrupt": true
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setState",
"triggers": [
"stateSet"
]
},
{
"name": "setPinHigh",
"triggers": [
"stateSet"
]
},
{
"name": "setPinLow",
"triggers": [
"stateSet"
]
},
{
"name": "read",
"triggers": [
"read"
]
},
{
"name": "toggle",
"triggers": [
"toggled"
]
},
{
"name": "interrupt",
"triggers": [
"interrupt"
]
}
]
},
{
"name": "BLECharacteristicDoor",
"type": "EmbeddedBLECharacteristicCustom",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"ble"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicDoor, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicDoor, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicDoor, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicDoor, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicDoor, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicDoor, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicDoor, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicDoor, writeDataType), ATMO_PROPERTY(BLECharacteristicDoor, readDataType), ATMO_PROPERTY(BLECharacteristicDoor, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicDoor, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicDoor, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicDoor, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\tATMO_VARIABLE(BLECharacteristicDoor, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicDoor, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicDoor, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\tATMO_VARIABLE(BLECharacteristicDoor, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicDoor, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a978",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_BOOL",
"writeDataType": "ATMO_DATATYPE_BOOL",
"notifyDataType": "ATMO_DATATYPE_BOOL"
},
"meta": {
"editorX": 326,
"editorY": 765,
"lastTrigger": "written"
},
"triggers": {
"triggered": [],
"written": [],
"subscibed": [],
"unsubscribed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setValue": "valueSet",
"written": false,
"subscibed": false,
"unsubscribed": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setValue",
"triggers": []
},
{
"name": "written",
"triggers": [
"written"
]
},
{
"name": "subscibed",
"triggers": [
"subscibed"
]
},
{
"name": "unsubscribed",
"triggers": [
"unsubscribed"
]
}
]
},
{
"name": "EmbeddedComparisonDoor",
"type": "EmbeddedComparison",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\treturn ATMO_Status_Success;\n\t",
"evaluate": "\n\tbool conditionTrue = false;\n\n\t// Convert property to same type as input\n\tATMO_Value_t targetStr;\n\tATMO_Value_t targetNum;\n\t\n\tATMO_InitValue(&targetStr);\n\tATMO_InitValue(&targetNum);\n\tATMO_CreateValueString(&targetStr, ATMO_PROPERTY(EmbeddedComparisonDoor, target));\n\tATMO_CreateValueConverted(&targetNum, in->type, &targetStr);\n\t\n\tif(ATMO_CompareValues(in, &targetNum, ATMO_PROPERTY(EmbeddedComparisonDoor, condition), &conditionTrue) != ATMO_Status_Success)\n\t{\n\t\tATMO_Value_t value;\n\t\tATMO_InitValue(&value);\n\t\tATMO_TriggerHandler(ATMO_TRIGGER(EmbeddedComparisonDoor, invalidType), NULL);\n\t\tATMO_FreeValue(&value);\n\t\tATMO_FreeValue(&targetStr);\n\t\tATMO_FreeValue(&targetNum);\n\t\treturn ATMO_Status_Fail;\n\t}\n\n\tATMO_FreeValue(&targetStr);\n\tATMO_FreeValue(&targetNum);\n\n\n\tATMO_Value_t value;\n\tATMO_InitValue(&value);\n\tATMO_CreateValueCopy(&value, in);\n\tATMO_TriggerHandler(conditionTrue ? ATMO_TRIGGER(EmbeddedComparisonDoor, conditionTrue) : ATMO_TRIGGER(EmbeddedComparisonDoor, conditionFalse), &value);\n\tATMO_FreeValue(&value);\t\t\n\n\treturn ATMO_Status_Success;\n\t"
},
"variables": {},
"embeddedPropertyConversions": {
"target": "string"
},
"codeUserChanged": {
"setup": false,
"evaluate": false
},
"condition": "ATMO_EQUAL",
"target": "1"
},
"meta": {
"editorX": 327,
"editorY": 865,
"lastTrigger": "conditionFalse"
},
"triggers": {
"triggered": [],
"conditionTrue": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "GPIOPin12",
"targetAbility": "setPinHigh"
}
],
"conditionFalse": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "GPIOPin12",
"targetAbility": "setPinLow"
}
],
"invalidType": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"evaluate": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "evaluate",
"triggers": []
}
]
},
{
"name": "GPIOPin12",
"type": "EmbeddedGPIOPin",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_GPIO_Config_t config;\n\tconfig.pinMode = ATMO_PROPERTY(GPIOPin12, mode);\n\tconfig.initialState = ATMO_PROPERTY(GPIOPin12, state);\n\tATMO_GPIO_SetPinConfiguration(ATMO_PROPERTY(GPIOPin12, instance), ATMO_PROPERTY(GPIOPin12, pin), &config);\n\n\t#if ATMO_PROPERTY(GPIOPin12, interruptEnabled) == true\n\t\tATMO_GPIO_RegisterInterruptCallback(\n\t\t\tATMO_PROPERTY(GPIOPin12, instance), \n\t\t\tATMO_PROPERTY(GPIOPin12, pin), \n\t\t\tATMO_PROPERTY(GPIOPin12, interruptMode), \n\t\t\tATMO_INTERRUPT(GPIOPin12, interrupt));\n\t#endif\n\t\n\treturn ATMO_Status_Success;\n\t",
"setState": "\n\tATMO_BOOL_t state;\n\tATMO_GetBool(in, &state);\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin12, instance), ATMO_PROPERTY(GPIOPin12, pin), (ATMO_GPIO_PinState_t)state);\n\treturn ATMO_Status_Success;\n\t",
"setPinHigh": "\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin12, instance), ATMO_PROPERTY(GPIOPin12, pin), ATMO_GPIO_PinState_High);\n\treturn ATMO_Status_Success;\n\t",
"setPinLow": "\n\tATMO_GPIO_SetPinState(ATMO_PROPERTY(GPIOPin12, instance), ATMO_PROPERTY(GPIOPin12, pin), ATMO_GPIO_PinState_Low);\n\treturn ATMO_Status_Success;\n\t",
"read": "\n\tATMO_CreateValueBool(out, ATMO_GPIO_Read(ATMO_PROPERTY(GPIOPin12, instance), ATMO_PROPERTY(GPIOPin12, pin)));\n\treturn ATMO_Status_Success;\n\t",
"toggle": "\n\tATMO_GPIO_Toggle(ATMO_PROPERTY(GPIOPin12, instance), ATMO_PROPERTY(GPIOPin12, pin));\n\treturn ATMO_Status_Success;\n\t",
"interrupt": "\n\tATMO_CreateValueCopy(out, in);\n\treturn ATMO_Status_Success;\n\t"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setState": false,
"setPinHigh": false,
"setPinLow": false,
"read": false,
"toggle": false,
"interrupt": false
},
"instance": "ATMO_DRIVERINSTANCE_GPIO_GPIO1",
"pin": "IO12",
"mode": "ATMO_GPIO_PinMode_Output_PushPull",
"state": "ATMO_GPIO_PinState_Low",
"interruptEnabled": false,
"interruptMode": "ATMO_GPIO_InterruptTrigger_None"
},
"meta": {
"editorX": 477,
"editorY": 865,
"lastTrigger": "interrupt"
},
"triggers": {
"triggered": [],
"stateSet": [],
"read": [],
"toggled": [],
"interrupt": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setState": false,
"setPinHigh": false,
"setPinLow": false,
"read": false,
"toggle": false,
"interrupt": true
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setState",
"triggers": [
"stateSet"
]
},
{
"name": "setPinHigh",
"triggers": [
"stateSet"
]
},
{
"name": "setPinLow",
"triggers": [
"stateSet"
]
},
{
"name": "read",
"triggers": [
"read"
]
},
{
"name": "toggle",
"triggers": [
"toggled"
]
},
{
"name": "interrupt",
"triggers": [
"interrupt"
]
}
]
}
],
"libraries": {
"adt7410featherwing": {
"libName": "adt7410featherwing",
"manufacturer": "Analog Devices",
"description": "Temperature Sensor",
"version": "",
"type": "Temperature Sensor",
"eelVersion": "3",
"shoppingCartLinks": {
"digikey": {
"links": {
"info": "https://www.digikey.com/short/p4tz7r"
},
"cartData": {
"part": "1528-2880-ND",
"source": "dkstudio",
"qty": "1"
}
}
},
"requires": [
"embedded",
"i2c"
],
"elements": [
{
"name": "ADT7410FeatherWing",
"type": "EmbeddedADT7410FeatherWing",
"icon": "EmbeddedTemperature.svg",
"defaultAbility": "readTemperature",
"defaultTrigger": "temperatureRead",
"hidden": false,
"abilities": [
{
"name": "setup",
"hidden": true,
"triggers": [],
"code": " ADT7410_Init(ATMO_PROPERTY(undefined, i2cInstance), ATMO_PROPERTY(undefined, i2cAddress));\n return ATMO_Status_Success;"
},
{
"name": "readTemperature",
"triggers": [
"temperatureRead"
],
"code": " float temperature = 0;\n\n if(!ADT7410_ReadTemperature(&temperature))\n {\n return ATMO_Status_Fail;\n }\n\n ATMO_CreateValueFloat(out, temperature);\n return ATMO_Status_Success;"
}
],
"properties": [
{
"name": "i2cInstance",
"input": "driverInstance",
"driverType": "i2c"
},
{
"name": "i2cAddress",
"input": "select",
"inputOptions": [
"0x48",
"0x49",
"0x4A",
"0x4B"
],
"value": "0x48"
}
],
"triggers": [],
"variables": [],
"language": {
"en-US": {
"EmbeddedADT7410": "ADT7410 Temperature",
"i2cInstance": "I2C Driver Instance",
"gpioInstance": "GPIO Driver Instance",
"i2cAddress": "I2C Address",
"readTemperature": "Read Temperature (°C)",
"temperatureRead": "Temperature Read",
"EmbeddedADT7410FeatherWing": "ADT7410 Temperature (Feather Wing)"
}
}
}
],
"files": {
"common": {
"headers": {
"adt7410.h": "#ifndef _ATMO_ADT7410_H_\n#define _ATMO_ADT7410_H_\n\n#include \"../app_src/atmosphere_platform.h\"\n\n/**\n * @brief Initialize ADT7410 Sensor\n * \n * @param i2cInstance \n * @param i2cAddress \n * @return true \n * @return false \n */\nATMO_BOOL_t ADT7410_Init(ATMO_DriverInstanceHandle_t i2cInstance, uint8_t i2cAddress);\n\n/**\n * @brief Read temperature data from ADT7410\n * \n * @param temperatureC \n * @return true \n * @return false \n */\nATMO_BOOL_t ADT7410_ReadTemperature(float *temperatureC);\n\n#endif"
},
"objects": {
"adt7410.c": "#include \"adt7410.h\"\n\nstatic ATMO_DriverInstanceHandle_t _ADT7410_I2CInstance = 0;\nstatic uint8_t _ADT7410_I2CAddress = 0;\nstatic ATMO_BOOL_t _ADT7410_Connected = false;\n\n#define ADT7410_REG_ID 0x0B\n#define ADT7410_ID_MASK 0xF8\n#define ADT7410_ID_VAL 0xC8\n\n#define ADT7410_REG_CONFIGURATION 0x03\n#define ADT7410_CONFIG_VAL 0x80 // 16 bit resolution continuous conversion mode\n\n#define ADT7410_REG_TEMP 0x0\n\n#define ADT7410_TEMP_MULTIPLIER 0.0078\n\nstatic uint8_t _ADT7410_GetId()\n{\n uint8_t cmd = ADT7410_REG_ID;\n uint8_t id = 0;\n if( ATMO_I2C_MasterRead(_ADT7410_I2CInstance, _ADT7410_I2CAddress, &cmd, 1, &id, 1, 1000) != ATMO_I2C_Status_Success )\n {\n ATMO_PLATFORM_DebugPrint(\"I2C Read error!\\r\\n\");\n return 0;\n }\n return id;\n}\n\nATMO_BOOL_t ADT7410_Init(ATMO_DriverInstanceHandle_t i2cInstance, uint8_t i2cAddress)\n{\n _ADT7410_I2CInstance = i2cInstance;\n _ADT7410_I2CAddress = i2cAddress;\n\n // Make sure the device is connected\n uint8_t id = _ADT7410_GetId();\n\n if((id & ADT7410_ID_MASK) != ADT7410_ID_VAL)\n {\n ATMO_PLATFORM_DebugPrint(\"INCORRECT ID: %02X\\r\\n\", id);\n return false;\n }\n\n _ADT7410_Connected = true;\n\n uint8_t data[2] = {ADT7410_REG_CONFIGURATION, ADT7410_CONFIG_VAL};\n if( ATMO_I2C_MasterWrite(_ADT7410_I2CInstance, _ADT7410_I2CAddress, NULL, 0, data, 2, 1000) != ATMO_I2C_Status_Success )\n {\n return false;\n }\n\n return true;\n}\n\n\nATMO_BOOL_t ADT7410_ReadTemperature(float *temperatureC)\n{\n if(!_ADT7410_Connected)\n {\n return false;\n }\n\n uint8_t cmd = ADT7410_REG_TEMP;\n uint8_t tempDataRaw[2] = {0};\n if( ATMO_I2C_MasterRead(_ADT7410_I2CInstance, _ADT7410_I2CAddress, &cmd, 1, tempDataRaw, 2, 1000) != ATMO_I2C_Status_Success )\n {\n return false;\n }\n\n int16_t tempVal = (tempDataRaw[0] << 8) | tempDataRaw[1];\n *temperatureC = tempVal * ADT7410_TEMP_MULTIPLIER;\n return true;\n}"
}
}
},
"md5": "787426330a0ddf66f36dcfb4a4ecf007"
},
"bme680": {
"libName": "bme680",
"manufacturer": "Bosch",
"description": "BME680 is a low power gas, pressure, temperature and humidity sensor",
"type": "Environmental sensor",
"icon": "EmbeddedTempHumidity.svg",
"version": "",
"eelVersion": "3",
"shoppingCartLinks": {
"digikey": {
"links": {
"info": "https://www.digikey.com/product-detail/en/bosch-sensortec/SHUTTLE-BOARD-BME680/828-1078-ND/7401318"
},
"cartData": {
"part": "828-1078-ND",
"source": "dkstudio",
"qty": "1"
}
}
},
"requires": [
"embedded",
"i2c"
],
"elements": [
{
"name": "BME680",
"type": "EmbeddedBME680",
"icon": "EmbeddedTempHumidity.svg",
"defaultAbility": "readTemperature",
"defaultTrigger": "temperatureRead",
"hidden": false,
"abilities": [
{
"name": "setup",
"hidden": true,
"code": "BME680_Config_t config;\nconfig.i2cInstance = ATMO_PROPERTY( undefined, i2cInstance );\nconfig.i2cAddr = ATMO_PROPERTY( undefined, i2cAddress );\n\nif ( !BME680_Init( &config ) )\n{\n\treturn ATMO_Status_Fail;\n}\n\nreturn ATMO_Status_Success;"
},
{
"name": "readTemperature",
"triggers": [
"temperatureRead"
],
"code": "float temperature = 0.0;\n\nif ( BME680_GetTempData( &temperature ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, temperature );\n\nreturn ATMO_Status_Success;"
},
{
"name": "readHumidity",
"triggers": [
"humidityRead"
],
"code": "float humidity = 0.0;\n\nif ( BME680_GetHumidity( &humidity ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, humidity );\n\nreturn ATMO_Status_Success;"
},
{
"name": "readPressure",
"triggers": [
"pressureRead"
],
"code": "float pressure = 0.0;\n\nif ( BME680_GetPressure( &pressure ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, pressure );\n\nreturn ATMO_Status_Success;"
},
{
"name": "readGasResistance",
"triggers": [
"gasResistanceRead"
],
"code": "float gas_resistance = 0.0;\n\nif ( BME680_GetGasRes( &gas_resistance ) != BME680_Status_Success )\n{\n\treturn ATMO_Status_Fail;\n}\n\nATMO_CreateValueFloat( out, gas_resistance );\n\nreturn ATMO_Status_Success;"
}
],
"properties": [
{
"name": "i2cInstance",
"input": "driverInstance",
"driverType": "i2c"
},
{
"name": "i2cAddress",
"input": "select",
"inputOptions": [
"0x76",
"0x77"
],
"value": "0x76"
}
],
"triggers": [],
"variables": [],
"language": {
"en-US": {
"EmbeddedBME680": "BME680 Environmental",
"i2cInstance": "I2C Driver Instance",
"i2cAddress": "I2C Address",
"setup": "Setup",
"readTemperature": "Read Temperature (°C)",
"temperatureRead": "Temperature Read",
"readHumidity": "Read Humidity (%rh)",
"humidityRead": "Humidity Read",
"readPressure": "Read Pressure (Pa)",
"pressureRead": "Pressure Read",
"readGasResistance": "Read Gas Resistance (ohm)",
"gasResistanceRead": "Gas Resistance Read"
}
}
}
],
"files": {
"common": {
"headers": {
"bme680.h": "#ifndef ATMO_BME680_H_\n#define ATMO_BME680_H_\n\n#include \"../app_src/atmosphere_platform.h\"\n\ntypedef struct\n{\n\tATMO_DriverInstanceHandle_t i2cInstance;\n\tuint8_t i2cAddr;\n} BME680_Config_t;\n\ntypedef enum\n{\n\tBME680_Status_Success = 0,\n\tBME680_Status_Fail\n} BME680_Status_t;\n\nBME680_Status_t BME680_Init( BME680_Config_t *config );\n\nBME680_Status_t BME680_GetPressure( float *pressureHpa );\n\nBME680_Status_t BME680_GetTempData( float *tempC );\n\nBME680_Status_t BME680_GetHumidity( float *humidity );\n\nBME680_Status_t BME680_GetGasRes( float *gas_resistance );\n\n#endif\n",
"bme680_defs.h": "/**\n * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * Neither the name of the copyright holder nor the names of the\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER\n * OR CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE\n *\n * The information provided is believed to be accurate and reliable.\n * The copyright holder assumes no responsibility\n * for the consequences of use\n * of such information nor for any infringement of patents or\n * other rights of third parties which may result from its use.\n * No license is granted by implication or otherwise under any patent or\n * patent rights of the copyright holder.\n *\n * @file\tbme680_defs.h\n * @date\t22 Feb 2018\n * @version\t3.5.8\n * @brief\n *\n */\n\n/*! @file bme680_defs.h\n @brief Sensor driver for BME680 sensor */\n/*!\n * @defgroup BME680_DRIVER_GRP BME680 SENSOR API\n * @brief\n * @{*/\n#ifndef BME680_DEFS_H_\n#define BME680_DEFS_H_\n\n/********************************************************/\n/* header includes */\n#ifdef __KERNEL__\n#include <linux/types.h>\n#include <linux/kernel.h>\n#else\n#include \"../app_src/atmosphere_platform.h\"\n#endif\n\n/******************************************************************************/\n/*! @name\t\tCommon macros\t\t\t\t\t */\n/******************************************************************************/\n\n#if !defined(UINT8_C) && !defined(INT8_C)\n#define INT8_C(x) S8_C(x)\n#define UINT8_C(x) U8_C(x)\n#endif\n\n#if !defined(UINT16_C) && !defined(INT16_C)\n#define INT16_C(x) S16_C(x)\n#define UINT16_C(x) U16_C(x)\n#endif\n\n#if !defined(INT32_C) && !defined(UINT32_C)\n#define INT32_C(x) S32_C(x)\n#define UINT32_C(x) U32_C(x)\n#endif\n\n#if !defined(INT64_C) && !defined(UINT64_C)\n#define INT64_C(x) S64_C(x)\n#define UINT64_C(x) U64_C(x)\n#endif\n\n/**@}*/\n\n/**\\name C standard macros */\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *) 0)\n#endif\n#endif\n\n/** BME680 configuration macros */\n/** Enable or un-comment the macro to provide floating point data output */\n#ifndef BME680_FLOAT_POINT_COMPENSATION\n#define BME680_FLOAT_POINT_COMPENSATION\n#endif\n\n/** BME680 General config */\n#define BME680_POLL_PERIOD_MS\t\tUINT8_C(10)\n\n/** BME680 I2C addresses */\n#define BME680_I2C_ADDR_PRIMARY\t\tUINT8_C(0x76)\n#define BME680_I2C_ADDR_SECONDARY\tUINT8_C(0x77)\n\n/** BME680 unique chip identifier */\n#define BME680_CHIP_ID UINT8_C(0x61)\n\n/** BME680 coefficients related defines */\n#define BME680_COEFF_SIZE\t\tUINT8_C(41)\n#define BME680_COEFF_ADDR1_LEN\t\tUINT8_C(25)\n#define BME680_COEFF_ADDR2_LEN\t\tUINT8_C(16)\n\n/** BME680 field_x related defines */\n#define BME680_FIELD_LENGTH\t\tUINT8_C(15)\n#define BME680_FIELD_ADDR_OFFSET\tUINT8_C(17)\n\n/** Soft reset command */\n#define BME680_SOFT_RESET_CMD UINT8_C(0xb6)\n\n/** Error code definitions */\n#define BME680_OK\t\tINT8_C(0)\n/* Errors */\n#define BME680_E_NULL_PTR\t\t INT8_C(-1)\n#define BME680_E_COM_FAIL\t\t INT8_C(-2)\n#define BME680_E_DEV_NOT_FOUND\t\tINT8_C(-3)\n#define BME680_E_INVALID_LENGTH\t\tINT8_C(-4)\n\n/* Warnings */\n#define BME680_W_DEFINE_PWR_MODE\tINT8_C(1)\n#define BME680_W_NO_NEW_DATA INT8_C(2)\n\n/* Info's */\n#define BME680_I_MIN_CORRECTION\t\tUINT8_C(1)\n#define BME680_I_MAX_CORRECTION\t\tUINT8_C(2)\n\n/** Register map */\n/** Other coefficient's address */\n#define BME680_ADDR_RES_HEAT_VAL_ADDR\tUINT8_C(0x00)\n#define BME680_ADDR_RES_HEAT_RANGE_ADDR\tUINT8_C(0x02)\n#define BME680_ADDR_RANGE_SW_ERR_ADDR\tUINT8_C(0x04)\n#define BME680_ADDR_SENS_CONF_START\tUINT8_C(0x5A)\n#define BME680_ADDR_GAS_CONF_START\tUINT8_C(0x64)\n\n/** Field settings */\n#define BME680_FIELD0_ADDR\t\tUINT8_C(0x1d)\n\n/** Heater settings */\n#define BME680_RES_HEAT0_ADDR\t\tUINT8_C(0x5a)\n#define BME680_GAS_WAIT0_ADDR\t\tUINT8_C(0x64)\n\n/** Sensor configuration registers */\n#define BME680_CONF_HEAT_CTRL_ADDR\t\tUINT8_C(0x70)\n#define BME680_CONF_ODR_RUN_GAS_NBC_ADDR\tUINT8_C(0x71)\n#define BME680_CONF_OS_H_ADDR\t\t\tUINT8_C(0x72)\n#define BME680_MEM_PAGE_ADDR\t\t\tUINT8_C(0xf3)\n#define BME680_CONF_T_P_MODE_ADDR\t\tUINT8_C(0x74)\n#define BME680_CONF_ODR_FILT_ADDR\t\tUINT8_C(0x75)\n\n/** Coefficient's address */\n#define BME680_COEFF_ADDR1\tUINT8_C(0x89)\n#define BME680_COEFF_ADDR2\tUINT8_C(0xe1)\n\n/** Chip identifier */\n#define BME680_CHIP_ID_ADDR\tUINT8_C(0xd0)\n\n/** Soft reset register */\n#define BME680_SOFT_RESET_ADDR\t\tUINT8_C(0xe0)\n\n/** Heater control settings */\n#define BME680_ENABLE_HEATER\t\tUINT8_C(0x00)\n#define BME680_DISABLE_HEATER\t\tUINT8_C(0x08)\n\n/** Gas measurement settings */\n#define BME680_DISABLE_GAS_MEAS\t\tUINT8_C(0x00)\n#define BME680_ENABLE_GAS_MEAS\t\tUINT8_C(0x01)\n\n/** Over-sampling settings */\n#define BME680_OS_NONE\t\tUINT8_C(0)\n#define BME680_OS_1X\t\tUINT8_C(1)\n#define BME680_OS_2X\t\tUINT8_C(2)\n#define BME680_OS_4X\t\tUINT8_C(3)\n#define BME680_OS_8X\t\tUINT8_C(4)\n#define BME680_OS_16X\t\tUINT8_C(5)\n\n/** IIR filter settings */\n#define BME680_FILTER_SIZE_0\tUINT8_C(0)\n#define BME680_FILTER_SIZE_1\tUINT8_C(1)\n#define BME680_FILTER_SIZE_3\tUINT8_C(2)\n#define BME680_FILTER_SIZE_7\tUINT8_C(3)\n#define BME680_FILTER_SIZE_15\tUINT8_C(4)\n#define BME680_FILTER_SIZE_31\tUINT8_C(5)\n#define BME680_FILTER_SIZE_63\tUINT8_C(6)\n#define BME680_FILTER_SIZE_127\tUINT8_C(7)\n\n/** Power mode settings */\n#define BME680_SLEEP_MODE\tUINT8_C(0)\n#define BME680_FORCED_MODE\tUINT8_C(1)\n\n/** Delay related macro declaration */\n#define BME680_RESET_PERIOD\tUINT32_C(10)\n\n/** SPI memory page settings */\n#define BME680_MEM_PAGE0\tUINT8_C(0x10)\n#define BME680_MEM_PAGE1\tUINT8_C(0x00)\n\n/** Ambient humidity shift value for compensation */\n#define BME680_HUM_REG_SHIFT_VAL\tUINT8_C(4)\n\n/** Run gas enable and disable settings */\n#define BME680_RUN_GAS_DISABLE\tUINT8_C(0)\n#define BME680_RUN_GAS_ENABLE\tUINT8_C(1)\n\n/** Buffer length macro declaration */\n#define BME680_TMP_BUFFER_LENGTH\tUINT8_C(40)\n#define BME680_REG_BUFFER_LENGTH\tUINT8_C(6)\n#define BME680_FIELD_DATA_LENGTH\tUINT8_C(3)\n#define BME680_GAS_REG_BUF_LENGTH\tUINT8_C(20)\n\n/** Settings selector */\n#define BME680_OST_SEL\t\t\tUINT16_C(1)\n#define BME680_OSP_SEL\t\t\tUINT16_C(2)\n#define BME680_OSH_SEL\t\t\tUINT16_C(4)\n#define BME680_GAS_MEAS_SEL\t\tUINT16_C(8)\n#define BME680_FILTER_SEL\t\tUINT16_C(16)\n#define BME680_HCNTRL_SEL\t\tUINT16_C(32)\n#define BME680_RUN_GAS_SEL\t\tUINT16_C(64)\n#define BME680_NBCONV_SEL\t\tUINT16_C(128)\n#define BME680_GAS_SENSOR_SEL\t\t(BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)\n\n/** Number of conversion settings*/\n#define BME680_NBCONV_MIN\t\tUINT8_C(0)\n#define BME680_NBCONV_MAX\t\tUINT8_C(10)\n\n/** Mask definitions */\n#define BME680_GAS_MEAS_MSK\tUINT8_C(0x30)\n#define BME680_NBCONV_MSK\tUINT8_C(0X0F)\n#define BME680_FILTER_MSK\tUINT8_C(0X1C)\n#define BME680_OST_MSK\t\tUINT8_C(0XE0)\n#define BME680_OSP_MSK\t\tUINT8_C(0X1C)\n#define BME680_OSH_MSK\t\tUINT8_C(0X07)\n#define BME680_HCTRL_MSK\tUINT8_C(0x08)\n#define BME680_RUN_GAS_MSK\tUINT8_C(0x10)\n#define BME680_MODE_MSK\t\tUINT8_C(0x03)\n#define BME680_RHRANGE_MSK\tUINT8_C(0x30)\n#define BME680_RSERROR_MSK\tUINT8_C(0xf0)\n#define BME680_NEW_DATA_MSK\tUINT8_C(0x80)\n#define BME680_GAS_INDEX_MSK\tUINT8_C(0x0f)\n#define BME680_GAS_RANGE_MSK\tUINT8_C(0x0f)\n#define BME680_GASM_VALID_MSK\tUINT8_C(0x20)\n#define BME680_HEAT_STAB_MSK\tUINT8_C(0x10)\n#define BME680_MEM_PAGE_MSK\tUINT8_C(0x10)\n#define BME680_SPI_RD_MSK\tUINT8_C(0x80)\n#define BME680_SPI_WR_MSK\tUINT8_C(0x7f)\n#define\tBME680_BIT_H1_DATA_MSK\tUINT8_C(0x0F)\n\n/** Bit position definitions for sensor settings */\n#define BME680_GAS_MEAS_POS\tUINT8_C(4)\n#define BME680_FILTER_POS\tUINT8_C(2)\n#define BME680_OST_POS\t\tUINT8_C(5)\n#define BME680_OSP_POS\t\tUINT8_C(2)\n#define BME680_RUN_GAS_POS\tUINT8_C(4)\n\n/** Array Index to Field data mapping for Calibration Data*/\n#define BME680_T2_LSB_REG\t(1)\n#define BME680_T2_MSB_REG\t(2)\n#define BME680_T3_REG\t\t(3)\n#define BME680_P1_LSB_REG\t(5)\n#define BME680_P1_MSB_REG\t(6)\n#define BME680_P2_LSB_REG\t(7)\n#define BME680_P2_MSB_REG\t(8)\n#define BME680_P3_REG\t\t(9)\n#define BME680_P4_LSB_REG\t(11)\n#define BME680_P4_MSB_REG\t(12)\n#define BME680_P5_LSB_REG\t(13)\n#define BME680_P5_MSB_REG\t(14)\n#define BME680_P7_REG\t\t(15)\n#define BME680_P6_REG\t\t(16)\n#define BME680_P8_LSB_REG\t(19)\n#define BME680_P8_MSB_REG\t(20)\n#define BME680_P9_LSB_REG\t(21)\n#define BME680_P9_MSB_REG\t(22)\n#define BME680_P10_REG\t\t(23)\n#define BME680_H2_MSB_REG\t(25)\n#define BME680_H2_LSB_REG\t(26)\n#define BME680_H1_LSB_REG\t(26)\n#define BME680_H1_MSB_REG\t(27)\n#define BME680_H3_REG\t\t(28)\n#define BME680_H4_REG\t\t(29)\n#define BME680_H5_REG\t\t(30)\n#define BME680_H6_REG\t\t(31)\n#define BME680_H7_REG\t\t(32)\n#define BME680_T1_LSB_REG\t(33)\n#define BME680_T1_MSB_REG\t(34)\n#define BME680_GH2_LSB_REG\t(35)\n#define BME680_GH2_MSB_REG\t(36)\n#define BME680_GH1_REG\t\t(37)\n#define BME680_GH3_REG\t\t(38)\n\n/** BME680 register buffer index settings*/\n#define BME680_REG_FILTER_INDEX\t\tUINT8_C(5)\n#define BME680_REG_TEMP_INDEX\t\tUINT8_C(4)\n#define BME680_REG_PRES_INDEX\t\tUINT8_C(4)\n#define BME680_REG_HUM_INDEX\t\tUINT8_C(2)\n#define BME680_REG_NBCONV_INDEX\t\tUINT8_C(1)\n#define BME680_REG_RUN_GAS_INDEX\tUINT8_C(1)\n#define BME680_REG_HCTRL_INDEX\t\tUINT8_C(0)\n\n/** BME680 pressure calculation macros */\n/*! This max value is used to provide precedence to multiplication or division\n * in pressure compensation equation to achieve least loss of precision and\n * avoiding overflows.\n * i.e Comparing value, BME680_MAX_OVERFLOW_VAL = INT32_C(1 << 30)\n */\n#define BME680_MAX_OVERFLOW_VAL INT32_C(0x40000000)\n\n/** Macro to combine two 8 bit data's to form a 16 bit data */\n#define BME680_CONCAT_BYTES(msb, lsb)\t(((uint16_t)msb << 8) | (uint16_t)lsb)\n\n/** Macro to SET and GET BITS of a register */\n#define BME680_SET_BITS(reg_data, bitname, data) \\\n\t\t((reg_data & ~(bitname##_MSK)) | \\\n\t\t((data << bitname##_POS) & bitname##_MSK))\n#define BME680_GET_BITS(reg_data, bitname)\t((reg_data & (bitname##_MSK)) >> \\\n\t(bitname##_POS))\n\n/** Macro variant to handle the bitname position if it is zero */\n#define BME680_SET_BITS_POS_0(reg_data, bitname, data) \\\n\t\t\t\t((reg_data & ~(bitname##_MSK)) | \\\n\t\t\t\t(data & bitname##_MSK))\n#define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))\n\n/** Type definitions */\n/*!\n * Generic communication function pointer\n * @param[in] dev_id: Place holder to store the id of the device structure\n * Can be used to store the index of the Chip select or\n * I2C address of the device.\n * @param[in] reg_addr:\tUsed to select the register the where data needs to\n * be read from or written to.\n * @param[in/out] reg_data: Data array to read/write\n * @param[in] len: Length of the data array\n */\ntypedef int8_t ( *bme680_com_fptr_t )( uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len );\n\n/*!\n * Delay function pointer\n * @param[in] period: Time period in milliseconds\n */\ntypedef void ( *bme680_delay_fptr_t )( uint32_t period );\n\n/*!\n * @brief Interface selection Enumerations\n */\nenum bme680_intf\n{\n\t/*! SPI interface */\n\tBME680_SPI_INTF,\n\t/*! I2C interface */\n\tBME680_I2C_INTF\n};\n\n/* structure definitions */\n/*!\n * @brief Sensor field data structure\n */\nstruct\tbme680_field_data\n{\n\t/*! Contains new_data, gasm_valid & heat_stab */\n\tuint8_t status;\n\t/*! The index of the heater profile used */\n\tuint8_t gas_index;\n\t/*! Measurement index to track order */\n\tuint8_t meas_index;\n\n#ifndef BME680_FLOAT_POINT_COMPENSATION\n\t/*! Temperature in degree celsius x100 */\n\tint16_t temperature;\n\t/*! Pressure in Pascal */\n\tuint32_t pressure;\n\t/*! Humidity in % relative humidity x1000 */\n\tuint32_t humidity;\n\t/*! Gas resistance in Ohms */\n\tuint32_t gas_resistance;\n#else\n\t/*! Temperature in degree celsius */\n\tfloat temperature;\n\t/*! Pressure in Pascal */\n\tfloat pressure;\n\t/*! Humidity in % relative humidity x1000 */\n\tfloat humidity;\n\t/*! Gas resistance in Ohms */\n\tfloat gas_resistance;\n\n#endif\n\n};\n\n/*!\n * @brief Structure to hold the Calibration data\n */\nstruct\tbme680_calib_data\n{\n\t/*! Variable to store calibrated humidity data */\n\tuint16_t par_h1;\n\t/*! Variable to store calibrated humidity data */\n\tuint16_t par_h2;\n\t/*! Variable to store calibrated humidity data */\n\tint8_t par_h3;\n\t/*! Variable to store calibrated humidity data */\n\tint8_t par_h4;\n\t/*! Variable to store calibrated humidity data */\n\tint8_t par_h5;\n\t/*! Variable to store calibrated humidity data */\n\tuint8_t par_h6;\n\t/*! Variable to store calibrated humidity data */\n\tint8_t par_h7;\n\t/*! Variable to store calibrated gas data */\n\tint8_t par_gh1;\n\t/*! Variable to store calibrated gas data */\n\tint16_t par_gh2;\n\t/*! Variable to store calibrated gas data */\n\tint8_t par_gh3;\n\t/*! Variable to store calibrated temperature data */\n\tuint16_t par_t1;\n\t/*! Variable to store calibrated temperature data */\n\tint16_t par_t2;\n\t/*! Variable to store calibrated temperature data */\n\tint8_t par_t3;\n\t/*! Variable to store calibrated pressure data */\n\tuint16_t par_p1;\n\t/*! Variable to store calibrated pressure data */\n\tint16_t par_p2;\n\t/*! Variable to store calibrated pressure data */\n\tint8_t par_p3;\n\t/*! Variable to store calibrated pressure data */\n\tint16_t par_p4;\n\t/*! Variable to store calibrated pressure data */\n\tint16_t par_p5;\n\t/*! Variable to store calibrated pressure data */\n\tint8_t par_p6;\n\t/*! Variable to store calibrated pressure data */\n\tint8_t par_p7;\n\t/*! Variable to store calibrated pressure data */\n\tint16_t par_p8;\n\t/*! Variable to store calibrated pressure data */\n\tint16_t par_p9;\n\t/*! Variable to store calibrated pressure data */\n\tuint8_t par_p10;\n\n#ifndef BME680_FLOAT_POINT_COMPENSATION\n\t/*! Variable to store t_fine size */\n\tint32_t t_fine;\n#else\n\t/*! Variable to store t_fine size */\n\tfloat t_fine;\n#endif\n\t/*! Variable to store heater resistance range */\n\tuint8_t res_heat_range;\n\t/*! Variable to store heater resistance value */\n\tint8_t res_heat_val;\n\t/*! Variable to store error range */\n\tint8_t range_sw_err;\n};\n\n/*!\n * @brief BME680 sensor settings structure which comprises of ODR,\n * over-sampling and filter settings.\n */\nstruct\tbme680_tph_sett\n{\n\t/*! Humidity oversampling */\n\tuint8_t os_hum;\n\t/*! Temperature oversampling */\n\tuint8_t os_temp;\n\t/*! Pressure oversampling */\n\tuint8_t os_pres;\n\t/*! Filter coefficient */\n\tuint8_t filter;\n};\n\n/*!\n * @brief BME680 gas sensor which comprises of gas settings\n * and status parameters\n */\nstruct\tbme680_gas_sett\n{\n\t/*! Variable to store nb conversion */\n\tuint8_t nb_conv;\n\t/*! Variable to store heater control */\n\tuint8_t heatr_ctrl;\n\t/*! Run gas enable value */\n\tuint8_t run_gas;\n\t/*! Heater temperature value */\n\tuint16_t heatr_temp;\n\t/*! Duration profile value */\n\tuint16_t heatr_dur;\n};\n\n/*!\n * @brief BME680 device structure\n */\nstruct\tbme680_dev\n{\n\t/*! Chip Id */\n\tuint8_t chip_id;\n\t/*! Device Id */\n\tuint8_t dev_id;\n\t/*! SPI/I2C interface */\n\tenum bme680_intf intf;\n\t/*! Memory page used */\n\tuint8_t mem_page;\n\t/*! Ambient temperature in Degree C */\n\tint8_t amb_temp;\n\t/*! Sensor calibration data */\n\tstruct bme680_calib_data calib;\n\t/*! Sensor settings */\n\tstruct bme680_tph_sett tph_sett;\n\t/*! Gas Sensor settings */\n\tstruct bme680_gas_sett gas_sett;\n\t/*! Sensor power modes */\n\tuint8_t power_mode;\n\t/*! New sensor fields */\n\tuint8_t new_fields;\n\t/*! Store the info messages */\n\tuint8_t info_msg;\n\t/*! Bus read function pointer */\n\tbme680_com_fptr_t read;\n\t/*! Bus write function pointer */\n\tbme680_com_fptr_t write;\n\t/*! delay function pointer */\n\tbme680_delay_fptr_t delay_ms;\n\t/*! Communication function result */\n\tint8_t com_rslt;\n};\n\n\n\n#endif /* BME680_DEFS_H_ */\n/** @}*/\n/** @}*/\n",
"bme680_env.h": "//-----------------------------------------------------------------------------\n// Copyright (c) 2018 Semiconductor Components Industries LLC\n// (d/b/a \"ON Semiconductor\"). All rights reserved.\n// This software and/or documentation is licensed by ON Semiconductor under\n// limited terms and conditions. The terms and conditions pertaining to the\n// software and/or documentation are available at\n// http://www.onsemi.com/site/pdf/ONSEMI_T&C.pdf (\"ON Semiconductor Standard\n// Terms and Conditions of Sale, Section 8 Software\") and if applicable the\n// software license agreement. Do not use this software and/or documentation\n// unless you have carefully read and you agree to the limited terms and\n// conditions. By using this software and/or documentation, you agree to the\n// limited terms and conditions.\n//-----------------------------------------------------------------------------\n//! \\file RTE_BDK_BME680_ENV.h\n//!\n//! This file contains the Run Time Configuration (RTE) options for BME680_ENV\n//! CMSIS Component.\n//!\n//! These options can be edited by opening this file in CMSIS Configuration\n//! Wizard Editor that is part of Eclipse installation.\n//!\n//! \\addtogroup BDK_GRP\n//! \\{\n//! \\addtogroup COMPONENTS\n//! \\{\n//! \\addtogroup BME680_ENV_GRP\n//! \\{\n//! \\name Run Time Environment Configuration\n//!\n//! These parameters are part of the \\ref RTE_BME680_ENV.h RTE configuration\n//! file and can be used to adjust library behavior.\n//! This file is copied into the Eclipse project when the BME680_ENV component\n//! is selected and can be edited by using the <i>CMIS Configuration Wizard</i>\n//! editor.\n//!\n//! \\image html rte_bme680_env.jpg\n//!\n//-----------------------------------------------------------------------------\n\n#ifndef RTE_BME680_ENV_H_\n#define RTE_BME680_ENV_H_\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n/** \\def RTE_BME680_ENV_TEMP_ENABLE\n * \\brief Enables or disables temperature measurement.\n *\n * Disabling is discouraged as other measurements depend on temperature\n * measurement for calibration.\n *\n * If disabled a constant value of INT16_MAX will be reported in\n * \\ref BME680_ENV_Data::temperature.\n */\n// <e> Temperature measurement\n// <i> Enables temperature measurement.\n// <i> Disabling is discouraged as other measurements depend on temperature measurement for calibration.\n// <i> If disabled a constant value of INT16_MAX will be reported.\n#ifndef RTE_BME680_ENV_TEMP_ENABLE\n#define RTE_BME680_ENV_TEMP_ENABLE 1\n#endif\n\n#if defined RTE_BME680_ENV_TEMP_ENABLE == 1\n\n/** \\def RTE_BME680_ENV_OS_TEMP\n * \\brief Temperature measurement oversampling setting.\n *\n * Oversampling improves temperature measurement resolution by reducing noise.\n * Higher oversampling values will result in longer measurement duration.\n *\n * \\see\n * Section <b>3.3.1 Temperature Measurement</b> of BME680 datasheet for more\n * details.\n */\n// <o> Oversampling\n// <i> Oversampling improves temperature measurement resolution by reducing noise.\n// <i> Higher oversampling values will result in longer measurement duration.\n// <i> See section '3.3.1 Temperature Measurement' of BME680 datasheet for more details.\n// <1=> 1x\n// <2=> 2x\n// <3=> 4x\n// <4=> 8x\n// <5=> 16x\n#define RTE_BME680_ENV_OS_TEMP 2\n\n#else\n#define RTE_BME680_ENV_OS_TEMP 0\n#endif /* defined RTE_BME680_ENV_TEMP_ENABLE == 1 */\n\n// </e>\n\n/** \\def RTE_BME680_ENV_PRES_ENABLE\n * \\brief Enables or disables pressure measurement.\n *\n * If disabled a constant value of UINT32_MAX will be reported in\n * \\ref BME680_ENV_Data::pressure.\n */\n// <e> Pressure measurement\n// <i> Enables pressure measurement.\n// <i> If disabled a constant value of UINT32_MAX will be reported.\n#ifndef RTE_BME680_ENV_PRES_ENABLE\n#define RTE_BME680_ENV_PRES_ENABLE 1\n#endif\n\n#if defined RTE_BME680_ENV_PRES_ENABLE == 1\n\n/** \\def RTE_BME680_ENV_OS_PRES\n * \\brief Pressure measurement oversampling setting.\n *\n * Oversampling improves pressure measurement resolution by reducing noise.\n * Higher oversampling values will result in longer measurement duration.\n *\n * \\see\n * Section <b>3.3.2 Pressure Measurement</b> of BME680 datasheet for more\n * details.\n */\n// <o> Oversampling\n// <i> Oversampling improves pressure measurement resolution by reducing noise.\n// <i> Higher oversampling values will result in longer measurement duration.\n// <i> See section '3.3.2 Pressure Measurement' of BME680 datasheet for more details.\n// <1=> 1x\n// <2=> 2x\n// <3=> 4x\n// <4=> 8x\n// <5=> 16x\n#define RTE_BME680_ENV_OS_PRES 2\n\n#else\n#define RTE_BME680_ENV_OS_PRES 0\n#endif /* defined RTE_BME680_ENV_PRES_ENABLE == 1 */\n\n// </e>\n\n/** \\def RTE_BME680_ENV_HUM_ENABLE\n * \\brief Enables or disables humidity measurement.\n *\n * If disabled a constant value of UINT32_MAX will be reported in\n * \\ref BME680_ENV_Data::humidity.\n */\n// <e> Humidity measurement\n// <i> Enables humidity measurement\n// <i> If disabled a constant value of UINT32_MAX will be reported.\n#ifndef RTE_BME680_ENV_HUM_ENABLE\n#define RTE_BME680_ENV_HUM_ENABLE 1\n#endif\n\n#if defined RTE_BME680_ENV_HUM_ENABLE == 1\n\n/** \\def RTE_BME680_ENV_OS_HUM\n * \\brief Humidity measurement oversampling setting.\n *\n * Oversampling improves humidity measurement by reducing noise.\n * Higher oversampling values will result in longer measurement duration.\n *\n * \\see\n * Section <b>3.3.3 Humidity Measurement</b> of BME680 datasheet for more\n * details.\n */\n// <o> Oversampling\n// <i> Higher oversampling setting reduces noise.\n// <i> Higher oversampling values will result in longer measurement duration.\n// <i> See section '3.3.3 Humidity Measurement' of BME680 datasheet for more details.\n// <1=> 1x\n// <2=> 2x\n// <3=> 4x\n// <4=> 8x\n// <5=> 16x\n#ifndef RTE_BME680_ENV_OS_HUM\n#define RTE_BME680_ENV_OS_HUM 2\n#endif\n\n#else\n#define RTE_BME680_ENV_OS_HUM 0\n#endif /* defined RTE_BME680_ENV_HUM_ENABLE == 1 */\n\n// </e>\n\n/** \\def RTE_BME680_ENV_FILTER_SIZE\n * \\brief IIR filter coefficient value.\n *\n * Reduces the bandwidth of temperature and pressure output signals and\n * increases the resolution of output data to 20 bit.\n *\n * \\see\n * Section <b>3.3.4 IIR filter</b> of BME680 datasheet for more details.\n */\n// <o> IIR Filter Size\n// <i> Reduces the bandwidth of temperature and pressure output signals and increases the resolution of output data to 20 bit.\n// <i> See section '3.3.4 IIR filter' of BME680 datasheet for more details.\n// <0=> 0\n// <1=> 1\n// <2=> 3\n// <3=> 7\n// <4=> 15\n// <5=> 31\n// <6=> 63\n// <7=> 127\n#ifndef RTE_BME680_ENV_FILTER_SIZE\n#define RTE_BME680_ENV_FILTER_SIZE 1\n#endif\n\n// <<< end of configuration section >>>\n\n#endif /* RTE_BME680_ENV_H_ */\n\n//! \\}\n//! \\}\n//! \\}\n//! \\}\n",
"bme680_reg.h": "/**\n * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * Neither the name of the copyright holder nor the names of the\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER\n * OR CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE\n *\n * The information provided is believed to be accurate and reliable.\n * The copyright holder assumes no responsibility\n * for the consequences of use\n * of such information nor for any infringement of patents or\n * other rights of third parties which may result from its use.\n * No license is granted by implication or otherwise under any patent or\n * patent rights of the copyright holder.\n *\n * @file\tbme680.h\n * @date\t22 Feb 2018\n * @version\t3.5.8\n * @brief\n *\n */\n/*! @file bme680.h\n @brief Sensor driver for BME680 sensor */\n/*!\n * @defgroup BME680_DRIVER_GRP BME680 SENSOR API\n * @{*/\n#ifndef BME680_H_\n#define BME680_H_\n\n/*! CPP guard */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n/* Header includes */\n#include \"bme680_defs.h\"\n\n/* function prototype declarations */\n/*!\n * @brief This API is the entry point.\n * It reads the chip-id and calibration data from the sensor.\n *\n * @param[in,out] dev : Structure instance of bme680_dev\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error\n */\nint8_t bme680_init( struct bme680_dev *dev );\n\n/*!\n * @brief This API writes the given data to the register address\n * of the sensor.\n *\n * @param[in] reg_addr : Register address from where the data to be written.\n * @param[in] reg_data : Pointer to data buffer which is to be written\n * in the sensor.\n * @param[in] len : No of bytes of data to write..\n * @param[in] dev : Structure instance of bme680_dev.\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error\n */\nint8_t bme680_set_regs( const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_dev *dev );\n\n/*!\n * @brief This API reads the data from the given register address of the sensor.\n *\n * @param[in] reg_addr : Register address from where the data to be read\n * @param[out] reg_data : Pointer to data buffer to store the read data.\n * @param[in] len : No of bytes of data to be read.\n * @param[in] dev : Structure instance of bme680_dev.\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error\n */\nint8_t bme680_get_regs( uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev );\n\n/*!\n * @brief This API performs the soft reset of the sensor.\n *\n * @param[in] dev : Structure instance of bme680_dev.\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.\n */\nint8_t bme680_soft_reset( struct bme680_dev *dev );\n\n/*!\n * @brief This API is used to set the power mode of the sensor.\n *\n * @param[in] dev : Structure instance of bme680_dev\n * @note : Pass the value to bme680_dev.power_mode structure variable.\n *\n * value\t|\tmode\n * -------------|------------------\n *\t0x00\t|\tBME680_SLEEP_MODE\n *\t0x01\t|\tBME680_FORCED_MODE\n *\n * * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error\n */\nint8_t bme680_set_sensor_mode( struct bme680_dev *dev );\n\n/*!\n * @brief This API is used to get the power mode of the sensor.\n *\n * @param[in] dev : Structure instance of bme680_dev\n * @note : bme680_dev.power_mode structure variable hold the power mode.\n *\n * value\t|\tmode\n * ---------|------------------\n *\t0x00\t|\tBME680_SLEEP_MODE\n *\t0x01\t|\tBME680_FORCED_MODE\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error\n */\nint8_t bme680_get_sensor_mode( struct bme680_dev *dev );\n\n/*!\n * @brief This API is used to set the profile duration of the sensor.\n *\n * @param[in] dev\t : Structure instance of bme680_dev.\n * @param[in] duration : Duration of the measurement in ms.\n *\n * @return Nothing\n */\nvoid bme680_set_profile_dur( uint16_t duration, struct bme680_dev *dev );\n\n/*!\n * @brief This API is used to get the profile duration of the sensor.\n *\n * @param[in] dev\t : Structure instance of bme680_dev.\n * @param[in] duration : Duration of the measurement in ms.\n *\n * @return Nothing\n */\nvoid bme680_get_profile_dur( uint16_t *duration, const struct bme680_dev *dev );\n\n/*!\n * @brief This API reads the pressure, temperature and humidity and gas data\n * from the sensor, compensates the data and store it in the bme680_data\n * structure instance passed by the user.\n *\n * @param[out] data: Structure instance to hold the data.\n * @param[in] dev : Structure instance of bme680_dev.\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error\n */\nint8_t bme680_get_sensor_data( struct bme680_field_data *data, struct bme680_dev *dev );\n\n/*!\n * @brief This API is used to set the oversampling, filter and T,P,H, gas selection\n * settings in the sensor.\n *\n * @param[in] dev : Structure instance of bme680_dev.\n * @param[in] desired_settings : Variable used to select the settings which\n * are to be set in the sensor.\n *\n *\t Macros\t | Functionality\n *---------------------------------|----------------------------------------------\n *\tBME680_OST_SEL | To set temperature oversampling.\n *\tBME680_OSP_SEL | To set pressure oversampling.\n *\tBME680_OSH_SEL | To set humidity oversampling.\n *\tBME680_GAS_MEAS_SEL | To set gas measurement setting.\n *\tBME680_FILTER_SEL | To set filter setting.\n *\tBME680_HCNTRL_SEL | To set humidity control setting.\n *\tBME680_RUN_GAS_SEL | To set run gas setting.\n *\tBME680_NBCONV_SEL | To set NB conversion setting.\n *\tBME680_GAS_SENSOR_SEL | To set all gas sensor related settings\n *\n * @note : Below are the macros to be used by the user for selecting the\n * desired settings. User can do OR operation of these macros for configuring\n * multiple settings.\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.\n */\nint8_t bme680_set_sensor_settings( uint16_t desired_settings, struct bme680_dev *dev );\n\n/*!\n * @brief This API is used to get the oversampling, filter and T,P,H, gas selection\n * settings in the sensor.\n *\n * @param[in] dev : Structure instance of bme680_dev.\n * @param[in] desired_settings : Variable used to select the settings which\n * are to be get from the sensor.\n *\n * @return Result of API execution status\n * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.\n */\nint8_t bme680_get_sensor_settings( uint16_t desired_settings, struct bme680_dev *dev );\n#ifdef __cplusplus\n}\n#endif /* End of CPP guard */\n#endif /* BME680_H_ */\n/** @}*/\n"
},
"objects": {
"bme680.c": "#include \"bme680.h\"\n#include \"bme680_reg.h\"\n#include \"bme680_env.h\"\n\nstatic struct bme680_dev _BME680_DriverConfig = {0};\nstatic BME680_Config_t _BME680_PrivConfig;\nstatic uint16_t _BLE680_Meas_Delay_Ms = 0;\n\n\nstatic int8_t BME680_I2C_Write( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len )\n{\n\tuint8_t status;\n\n\tuint8_t writeData[len + 1];\n\n\twriteData[0] = reg_addr;\n\tmemcpy( &writeData[1], reg_data, len );\n\n\treturn ATMO_I2C_MasterWrite( _BME680_PrivConfig.i2cInstance, dev_id, NULL, 0, writeData, len + 1, 0 ) == ATMO_I2C_Status_Success ? 0 : 1;\n}\n\nstatic int8_t BME680_I2C_Read( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len )\n{\n\tATMO_I2C_Status_t status = ATMO_I2C_Status_Success;\n\tuint8_t currentReg = reg_addr;\n\n\tunsigned int i;\n\n\tstatus = ATMO_I2C_MasterRead( _BME680_PrivConfig.i2cInstance, dev_id,\n\t &reg_addr, 1, reg_data, len, 0 );\n\n\treturn ( status == ATMO_I2C_Status_Success ) ? 0 : 1;\n}\n\nBME680_Status_t BME680_Init( BME680_Config_t *config )\n{\n\tif ( config == NULL )\n\t{\n\t\treturn BME680_Status_Fail;\n\t}\n\n\tmemcpy( &_BME680_PrivConfig, config, sizeof( _BME680_PrivConfig ) );\n\n\tATMO_I2C_Peripheral_t i2cConfig;\n\ti2cConfig.operatingMode = ATMO_I2C_OperatingMode_Master;\n\ti2cConfig.baudRate = ATMO_I2C_BaudRate_Standard_Mode;\n\tATMO_I2C_SetConfiguration( config->i2cInstance, &i2cConfig );\n\n\tATMO_PLATFORM_DelayMilliseconds( 1000 );\n\n\tint8_t status;\n\tuint8_t sel_setting;\n\n\t_BME680_DriverConfig.dev_id = config->i2cAddr;\n\t_BME680_DriverConfig.intf = BME680_I2C_INTF;\n\t_BME680_DriverConfig.read = &BME680_I2C_Read;\n\t_BME680_DriverConfig.write = &BME680_I2C_Write;\n\t_BME680_DriverConfig.delay_ms = &ATMO_PLATFORM_DelayMilliseconds;\n\t_BME680_DriverConfig.amb_temp = 25;\n\n\tATMO_PLATFORM_DebugPrint( \"BME680 I2C Address: %02X\\r\\n\", _BME680_DriverConfig.dev_id );\n\n\tstatus = bme680_init( &_BME680_DriverConfig );\n\n\tif ( status != BME680_OK )\n\t{\n\t\tATMO_PLATFORM_DebugPrint( \"Error initializing BME680: %d\\r\\n\", status );\n\t\treturn BME680_Status_Fail;\n\t}\n\n\t_BME680_DriverConfig.tph_sett.os_hum = RTE_BME680_ENV_OS_HUM;\n\t_BME680_DriverConfig.tph_sett.os_pres = RTE_BME680_ENV_OS_PRES;\n\t_BME680_DriverConfig.tph_sett.os_temp = RTE_BME680_ENV_OS_TEMP;\n\t_BME680_DriverConfig.tph_sett.filter = RTE_BME680_ENV_FILTER_SIZE;\n\n\t_BME680_DriverConfig.gas_sett.run_gas = BME680_ENABLE_GAS_MEAS;\n\t_BME680_DriverConfig.gas_sett.heatr_temp = 320;\n\t_BME680_DriverConfig.gas_sett.heatr_dur = 150;\n\n\t_BME680_DriverConfig.power_mode = BME680_SLEEP_MODE;\n\n\tsel_setting = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL\n\t | BME680_FILTER_SEL | BME680_GAS_SENSOR_SEL;\n\n\tstatus = bme680_set_sensor_settings( sel_setting, &_BME680_DriverConfig );\n\n\tif ( status != BME680_OK )\n\t{\n\t\tATMO_PLATFORM_DebugPrint( \"Error setting sensor settings\\r\\n\" );\n\t\treturn BME680_Status_Fail;\n\t}\n\n\tstatus = bme680_set_sensor_mode( &_BME680_DriverConfig );\n\n\tif ( status != BME680_OK )\n\t{\n\t\tATMO_PLATFORM_DebugPrint( \"Error setting sensor mode\\r\\n\" );\n\t\treturn BME680_Status_Fail;\n\t}\n\n\t// How long it takes between turning sensor on and getting a reading\n\tbme680_get_profile_dur( &_BLE680_Meas_Delay_Ms, &_BME680_DriverConfig );\n\n\tATMO_PLATFORM_DebugPrint( \"Meas Delay: %d\\r\\n\", _BLE680_Meas_Delay_Ms );\n\n\treturn 0;\n}\n\nstatic void _BME680_StartMeasurement()\n{\n\t// Turn sensor on to start measure\n\t_BME680_DriverConfig.power_mode = BME680_FORCED_MODE;\n\tbme680_set_sensor_mode( &_BME680_DriverConfig );\n\n\t// Wait for measurement to complete\n\tATMO_PLATFORM_DelayMilliseconds( _BLE680_Meas_Delay_Ms );\n}\n\nstatic void _BME680_Sleep()\n{\n\t// Go back to sleep\n\t_BME680_DriverConfig.power_mode = BME680_SLEEP_MODE;\n\tbme680_set_sensor_mode( &_BME680_DriverConfig );\n}\n\nBME680_Status_t BME680_GetTempData( float *tempC )\n{\n\t_BME680_StartMeasurement();\n\n\tstruct bme680_field_data data;\n\tint8_t retval = bme680_get_sensor_data( &data, &_BME680_DriverConfig );\n\n\tif ( retval != 0 )\n\t{\n\t\tATMO_PLATFORM_DebugPrint( \"Error getting sensor data! %d\\r\\n\", retval );\n\t\t*tempC = 0;\n\t}\n\telse\n\t{\n\t\t*tempC = data.temperature;\n\t}\n\n\t_BME680_Sleep();\n\treturn BME680_Status_Success;\n}\n\nBME680_Status_t BME680_GetPressure( float *pressureHpa )\n{\n\t_BME680_StartMeasurement();\n\n\tstruct bme680_field_data data;\n\tint8_t retval = bme680_get_sensor_data( &data, &_BME680_DriverConfig );\n\n\tif ( retval != 0 )\n\t{\n\t\tATMO_PLATFORM_DebugPrint( \"Error getting sensor data! %d\\r\\n\", retval );\n\t\t*pressureHpa = 0;\n\t}\n\telse\n\t{\n\t\t*pressureHpa = data.pressure;\n\t}\n\n\t_BME680_Sleep();\n\treturn BME680_Status_Success;\n}\n\nBME680_Status_t BME680_GetHumidity( float *humidity )\n{\n\t_BME680_StartMeasurement();\n\n\tstruct bme680_field_data data;\n\tint8_t retval = bme680_get_sensor_data( &data, &_BME680_DriverConfig );\n\n\tif ( retval != 0 )\n\t{\n\t\tATMO_PLATFORM_DebugPrint( \"Error getting sensor data! %d\\r\\n\", retval );\n\t\t*humidity = 0;\n\t}\n\telse\n\t{\n\t\t*humidity = data.humidity;\n\t}\n\n\t_BME680_Sleep();\n\treturn BME680_Status_Success;\n}\n\nBME680_Status_t BME680_GetGasRes( float *gas_resistance )\n{\n\t_BME680_StartMeasurement();\n\n\tstruct bme680_field_data data;\n\tint8_t retval = bme680_get_sensor_data( &data, &_BME680_DriverConfig );\n\n\tif ( retval != 0 )\n\t{\n\t\tATMO_PLATFORM_DebugPrint( \"Error getting sensor data! %d\\r\\n\", retval );\n\t\t*gas_resistance = 0;\n\t}\n\telse\n\t{\n\t\t*gas_resistance = data.gas_resistance;\n\t}\n\n\t_BME680_Sleep();\n\treturn BME680_Status_Success;\n}\n",
"bme680_reg.c": "#include \"bme680_reg.h\"\n\nstatic int8_t get_calib_data( struct bme680_dev *dev );\nstatic int8_t set_gas_config( struct bme680_dev *dev );\nstatic int8_t get_gas_config( struct bme680_dev *dev );\nstatic uint8_t calc_heater_dur( uint16_t dur );\n\n#ifndef BME680_FLOAT_POINT_COMPENSATION\nstatic int16_t calc_temperature( uint32_t temp_adc, struct bme680_dev *dev );\nstatic uint32_t calc_pressure( uint32_t pres_adc, const struct bme680_dev *dev );\nstatic uint32_t calc_humidity( uint16_t hum_adc, const struct bme680_dev *dev );\nstatic uint32_t calc_gas_resistance( uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev );\nstatic uint8_t calc_heater_res( uint16_t temp, const struct bme680_dev *dev );\n\n#else\nstatic float calc_temperature( uint32_t temp_adc, struct bme680_dev *dev );\nstatic float calc_pressure( uint32_t pres_adc, const struct bme680_dev *dev );\nstatic float calc_humidity( uint16_t hum_adc, const struct bme680_dev *dev );\nstatic float calc_gas_resistance( uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev );\nstatic float calc_heater_res( uint16_t temp, const struct bme680_dev *dev );\n\n#endif\n\nstatic int8_t read_field_data( struct bme680_field_data *data, struct bme680_dev *dev );\nstatic int8_t set_mem_page( uint8_t reg_addr, struct bme680_dev *dev );\nstatic int8_t get_mem_page( struct bme680_dev *dev );\nstatic int8_t null_ptr_check( const struct bme680_dev *dev );\nstatic int8_t boundary_check( uint8_t *value, uint8_t min, uint8_t max, struct bme680_dev *dev );\n\nint8_t bme680_init( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\trslt = bme680_soft_reset( dev );\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_get_regs( BME680_CHIP_ID_ADDR, &dev->chip_id, 1, dev );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\tif ( dev->chip_id == BME680_CHIP_ID )\n\t\t\t\t{\n\t\t\t\t\trslt = get_calib_data( dev );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trslt = BME680_E_DEV_NOT_FOUND;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nint8_t bme680_get_regs( uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tif ( dev->intf == BME680_SPI_INTF )\n\t\t{\n\t\t\trslt = set_mem_page( reg_addr, dev );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\treg_addr = reg_addr | BME680_SPI_RD_MSK;\n\t\t\t}\n\t\t}\n\n\t\tdev->com_rslt = dev->read( dev->dev_id, reg_addr, reg_data, len );\n\n\t\tif ( dev->com_rslt != 0 )\n\t\t{\n\t\t\trslt = BME680_E_COM_FAIL;\n\t\t}\n\t}\n\n\treturn rslt;\n}\nint8_t bme680_set_regs( const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t tmp_buff[BME680_TMP_BUFFER_LENGTH] = { 0 };\n\tuint16_t index;\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tif ( ( len > 0 ) && ( len < BME680_TMP_BUFFER_LENGTH / 2 ) )\n\t\t{\n\t\t\tfor ( index = 0; index < len; index++ )\n\t\t\t{\n\t\t\t\tif ( dev->intf == BME680_SPI_INTF )\n\t\t\t\t{\n\t\t\t\t\trslt = set_mem_page( reg_addr[index], dev );\n\t\t\t\t\ttmp_buff[( 2 * index )] = reg_addr[index] & BME680_SPI_WR_MSK;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmp_buff[( 2 * index )] = reg_addr[index];\n\t\t\t\t}\n\n\t\t\t\ttmp_buff[( 2 * index ) + 1] = reg_data[index];\n\t\t\t}\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\tdev->com_rslt = dev->write( dev->dev_id, tmp_buff[0], &tmp_buff[1], ( 2 * len ) - 1 );\n\n\t\t\t\tif ( dev->com_rslt != 0 )\n\t\t\t\t{\n\t\t\t\t\trslt = BME680_E_COM_FAIL;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\trslt = BME680_E_INVALID_LENGTH;\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nint8_t bme680_soft_reset( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t reg_addr = BME680_SOFT_RESET_ADDR;\n\tuint8_t soft_rst_cmd = BME680_SOFT_RESET_CMD;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tif ( dev->intf == BME680_SPI_INTF )\n\t\t{\n\t\t\trslt = get_mem_page( dev );\n\t\t}\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_set_regs( &reg_addr, &soft_rst_cmd, 1, dev );\n\t\t\tdev->delay_ms( BME680_RESET_PERIOD );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\tif ( dev->intf == BME680_SPI_INTF )\n\t\t\t\t{\n\t\t\t\t\trslt = get_mem_page( dev );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nint8_t bme680_set_sensor_settings( uint16_t desired_settings, struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t reg_addr;\n\tuint8_t data = 0;\n\tuint8_t count = 0;\n\tuint8_t reg_array[BME680_REG_BUFFER_LENGTH] = { 0 };\n\tuint8_t data_array[BME680_REG_BUFFER_LENGTH] = { 0 };\n\tuint8_t intended_power_mode = dev->power_mode;\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tif ( desired_settings & BME680_GAS_MEAS_SEL )\n\t\t{\n\t\t\trslt = set_gas_config( dev );\n\t\t}\n\n\t\tdev->power_mode = BME680_SLEEP_MODE;\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_set_sensor_mode( dev );\n\t\t}\n\n\t\tif ( desired_settings & BME680_FILTER_SEL )\n\t\t{\n\t\t\trslt = boundary_check( &dev->tph_sett.filter, BME680_FILTER_SIZE_0, BME680_FILTER_SIZE_127, dev );\n\t\t\treg_addr = BME680_CONF_ODR_FILT_ADDR;\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = bme680_get_regs( reg_addr, &data, 1, dev );\n\t\t\t}\n\n\t\t\tif ( desired_settings & BME680_FILTER_SEL )\n\t\t\t{\n\t\t\t\tdata = BME680_SET_BITS( data, BME680_FILTER, dev->tph_sett.filter );\n\t\t\t}\n\n\t\t\treg_array[count] = reg_addr;\n\t\t\tdata_array[count] = data;\n\t\t\tcount++;\n\t\t}\n\n\t\tif ( desired_settings & BME680_HCNTRL_SEL )\n\t\t{\n\t\t\trslt = boundary_check( &dev->gas_sett.heatr_ctrl, BME680_ENABLE_HEATER,\n\t\t\t BME680_DISABLE_HEATER, dev );\n\t\t\treg_addr = BME680_CONF_HEAT_CTRL_ADDR;\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = bme680_get_regs( reg_addr, &data, 1, dev );\n\t\t\t}\n\n\t\t\tdata = BME680_SET_BITS_POS_0( data, BME680_HCTRL, dev->gas_sett.heatr_ctrl );\n\n\t\t\treg_array[count] = reg_addr;\n\t\t\tdata_array[count] = data;\n\t\t\tcount++;\n\t\t}\n\n\t\tif ( desired_settings & ( BME680_OST_SEL | BME680_OSP_SEL ) )\n\t\t{\n\t\t\trslt = boundary_check( &dev->tph_sett.os_temp, BME680_OS_NONE, BME680_OS_16X, dev );\n\t\t\treg_addr = BME680_CONF_T_P_MODE_ADDR;\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = bme680_get_regs( reg_addr, &data, 1, dev );\n\t\t\t}\n\n\t\t\tif ( desired_settings & BME680_OST_SEL )\n\t\t\t{\n\t\t\t\tdata = BME680_SET_BITS( data, BME680_OST, dev->tph_sett.os_temp );\n\t\t\t}\n\n\t\t\tif ( desired_settings & BME680_OSP_SEL )\n\t\t\t{\n\t\t\t\tdata = BME680_SET_BITS( data, BME680_OSP, dev->tph_sett.os_pres );\n\t\t\t}\n\n\t\t\treg_array[count] = reg_addr;\n\t\t\tdata_array[count] = data;\n\t\t\tcount++;\n\t\t}\n\n\t\tif ( desired_settings & BME680_OSH_SEL )\n\t\t{\n\t\t\trslt = boundary_check( &dev->tph_sett.os_hum, BME680_OS_NONE, BME680_OS_16X, dev );\n\t\t\treg_addr = BME680_CONF_OS_H_ADDR;\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = bme680_get_regs( reg_addr, &data, 1, dev );\n\t\t\t}\n\n\t\t\tdata = BME680_SET_BITS_POS_0( data, BME680_OSH, dev->tph_sett.os_hum );\n\n\t\t\treg_array[count] = reg_addr;\n\t\t\tdata_array[count] = data;\n\t\t\tcount++;\n\t\t}\n\n\t\tif ( desired_settings & ( BME680_RUN_GAS_SEL | BME680_NBCONV_SEL ) )\n\t\t{\n\t\t\trslt = boundary_check( &dev->gas_sett.run_gas, BME680_RUN_GAS_DISABLE,\n\t\t\t BME680_RUN_GAS_ENABLE, dev );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = boundary_check( &dev->gas_sett.nb_conv, BME680_NBCONV_MIN,\n\t\t\t\t BME680_NBCONV_MAX, dev );\n\t\t\t}\n\n\t\t\treg_addr = BME680_CONF_ODR_RUN_GAS_NBC_ADDR;\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = bme680_get_regs( reg_addr, &data, 1, dev );\n\t\t\t}\n\n\t\t\tif ( desired_settings & BME680_RUN_GAS_SEL )\n\t\t\t{\n\t\t\t\tdata = BME680_SET_BITS( data, BME680_RUN_GAS, dev->gas_sett.run_gas );\n\t\t\t}\n\n\t\t\tif ( desired_settings & BME680_NBCONV_SEL )\n\t\t\t{\n\t\t\t\tdata = BME680_SET_BITS_POS_0( data, BME680_NBCONV, dev->gas_sett.nb_conv );\n\t\t\t}\n\n\t\t\treg_array[count] = reg_addr;\n\t\t\tdata_array[count] = data;\n\t\t\tcount++;\n\t\t}\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_set_regs( reg_array, data_array, count, dev );\n\t\t}\n\n\t\tdev->power_mode = intended_power_mode;\n\t}\n\n\treturn rslt;\n}\n\nint8_t bme680_get_sensor_settings( uint16_t desired_settings, struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t reg_addr = BME680_CONF_HEAT_CTRL_ADDR;\n\tuint8_t data_array[BME680_REG_BUFFER_LENGTH] = { 0 };\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\trslt = bme680_get_regs( reg_addr, data_array, BME680_REG_BUFFER_LENGTH, dev );\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\tif ( desired_settings & BME680_GAS_MEAS_SEL )\n\t\t\t{\n\t\t\t\trslt = get_gas_config( dev );\n\t\t\t}\n\n\t\t\tif ( desired_settings & BME680_FILTER_SEL )\n\t\t\t\tdev->tph_sett.filter = BME680_GET_BITS( data_array[BME680_REG_FILTER_INDEX],\n\t\t\t\t BME680_FILTER );\n\n\t\t\tif ( desired_settings & ( BME680_OST_SEL | BME680_OSP_SEL ) )\n\t\t\t{\n\t\t\t\tdev->tph_sett.os_temp = BME680_GET_BITS( data_array[BME680_REG_TEMP_INDEX], BME680_OST );\n\t\t\t\tdev->tph_sett.os_pres = BME680_GET_BITS( data_array[BME680_REG_PRES_INDEX], BME680_OSP );\n\t\t\t}\n\n\t\t\tif ( desired_settings & BME680_OSH_SEL )\n\t\t\t\tdev->tph_sett.os_hum = BME680_GET_BITS_POS_0( data_array[BME680_REG_HUM_INDEX],\n\t\t\t\t BME680_OSH );\n\n\t\t\tif ( desired_settings & BME680_HCNTRL_SEL )\n\t\t\t\tdev->gas_sett.heatr_ctrl = BME680_GET_BITS_POS_0( data_array[BME680_REG_HCTRL_INDEX],\n\t\t\t\t BME680_HCTRL );\n\n\t\t\tif ( desired_settings & ( BME680_RUN_GAS_SEL | BME680_NBCONV_SEL ) )\n\t\t\t{\n\t\t\t\tdev->gas_sett.nb_conv = BME680_GET_BITS_POS_0( data_array[BME680_REG_NBCONV_INDEX],\n\t\t\t\t BME680_NBCONV );\n\t\t\t\tdev->gas_sett.run_gas = BME680_GET_BITS( data_array[BME680_REG_RUN_GAS_INDEX],\n\t\t\t\t BME680_RUN_GAS );\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\trslt = BME680_E_NULL_PTR;\n\t}\n\n\treturn rslt;\n}\n\nint8_t bme680_set_sensor_mode( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t tmp_pow_mode;\n\tuint8_t pow_mode = 0;\n\tuint8_t reg_addr = BME680_CONF_T_P_MODE_ADDR;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tdo\n\t\t{\n\t\t\trslt = bme680_get_regs( BME680_CONF_T_P_MODE_ADDR, &tmp_pow_mode, 1, dev );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\tpow_mode = ( tmp_pow_mode & BME680_MODE_MSK );\n\n\t\t\t\tif ( pow_mode != BME680_SLEEP_MODE )\n\t\t\t\t{\n\t\t\t\t\ttmp_pow_mode = tmp_pow_mode & ( ~BME680_MODE_MSK );\n\t\t\t\t\trslt = bme680_set_regs( &reg_addr, &tmp_pow_mode, 1, dev );\n\t\t\t\t\tdev->delay_ms( BME680_POLL_PERIOD_MS );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\twhile ( pow_mode != BME680_SLEEP_MODE );\n\n\t\tif ( dev->power_mode != BME680_SLEEP_MODE )\n\t\t{\n\t\t\ttmp_pow_mode = ( tmp_pow_mode & ~BME680_MODE_MSK ) | ( dev->power_mode & BME680_MODE_MSK );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = bme680_set_regs( &reg_addr, &tmp_pow_mode, 1, dev );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nint8_t bme680_get_sensor_mode( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t mode;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\trslt = bme680_get_regs( BME680_CONF_T_P_MODE_ADDR, &mode, 1, dev );\n\t\tdev->power_mode = mode & BME680_MODE_MSK;\n\t}\n\n\treturn rslt;\n}\n\nvoid bme680_set_profile_dur( uint16_t duration, struct bme680_dev *dev )\n{\n\tuint32_t tph_dur;\n\tuint32_t meas_cycles;\n\tuint8_t os_to_meas_cycles[6] = {0, 1, 2, 4, 8, 16};\n\n\tmeas_cycles = os_to_meas_cycles[dev->tph_sett.os_temp];\n\tmeas_cycles += os_to_meas_cycles[dev->tph_sett.os_pres];\n\tmeas_cycles += os_to_meas_cycles[dev->tph_sett.os_hum];\n\n\ttph_dur = meas_cycles * UINT32_C( 1963 );\n\ttph_dur += UINT32_C( 477 * 4 );\n\ttph_dur += UINT32_C( 477 * 5 );\n\ttph_dur += UINT32_C( 500 );\n\ttph_dur /= UINT32_C( 1000 );\n\n\ttph_dur += UINT32_C( 1 );\n\tdev->gas_sett.heatr_dur = duration - ( uint16_t ) tph_dur;\n}\n\nvoid bme680_get_profile_dur( uint16_t *duration, const struct bme680_dev *dev )\n{\n\tuint32_t tph_dur;\n\tuint32_t meas_cycles;\n\tuint8_t os_to_meas_cycles[6] = {0, 1, 2, 4, 8, 16};\n\n\tmeas_cycles = os_to_meas_cycles[dev->tph_sett.os_temp];\n\tmeas_cycles += os_to_meas_cycles[dev->tph_sett.os_pres];\n\tmeas_cycles += os_to_meas_cycles[dev->tph_sett.os_hum];\n\n\ttph_dur = meas_cycles * UINT32_C( 1963 );\n\ttph_dur += UINT32_C( 477 * 4 );\n\ttph_dur += UINT32_C( 477 * 5 );\n\ttph_dur += UINT32_C( 500 );\n\ttph_dur /= UINT32_C( 1000 );\n\n\ttph_dur += UINT32_C( 1 );\n\n\t*duration = ( uint16_t ) tph_dur;\n\n\tif ( dev->gas_sett.run_gas )\n\t{\n\t\t*duration += dev->gas_sett.heatr_dur;\n\t}\n}\n\nint8_t bme680_get_sensor_data( struct bme680_field_data *data, struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\trslt = read_field_data( data, dev );\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\tif ( data->status & BME680_NEW_DATA_MSK )\n\t\t\t{\n\t\t\t\tdev->new_fields = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdev->new_fields = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nstatic int8_t get_calib_data( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t coeff_array[BME680_COEFF_SIZE] = { 0 };\n\tuint8_t temp_var = 0;\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\trslt = bme680_get_regs( BME680_COEFF_ADDR1, coeff_array, BME680_COEFF_ADDR1_LEN, dev );\n\n\t\tif ( rslt == BME680_OK )\n\t\t\trslt = bme680_get_regs( BME680_COEFF_ADDR2, &coeff_array[BME680_COEFF_ADDR1_LEN]\n\t\t\t , BME680_COEFF_ADDR2_LEN, dev );\n\n\t\tdev->calib.par_t1 = ( uint16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_T1_MSB_REG],\n\t\t coeff_array[BME680_T1_LSB_REG] ) );\n\t\tdev->calib.par_t2 = ( int16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_T2_MSB_REG],\n\t\t coeff_array[BME680_T2_LSB_REG] ) );\n\t\tdev->calib.par_t3 = ( int8_t ) ( coeff_array[BME680_T3_REG] );\n\n\t\tdev->calib.par_p1 = ( uint16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_P1_MSB_REG],\n\t\t coeff_array[BME680_P1_LSB_REG] ) );\n\t\tdev->calib.par_p2 = ( int16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_P2_MSB_REG],\n\t\t coeff_array[BME680_P2_LSB_REG] ) );\n\t\tdev->calib.par_p3 = ( int8_t ) coeff_array[BME680_P3_REG];\n\t\tdev->calib.par_p4 = ( int16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_P4_MSB_REG],\n\t\t coeff_array[BME680_P4_LSB_REG] ) );\n\t\tdev->calib.par_p5 = ( int16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_P5_MSB_REG],\n\t\t coeff_array[BME680_P5_LSB_REG] ) );\n\t\tdev->calib.par_p6 = ( int8_t ) ( coeff_array[BME680_P6_REG] );\n\t\tdev->calib.par_p7 = ( int8_t ) ( coeff_array[BME680_P7_REG] );\n\t\tdev->calib.par_p8 = ( int16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_P8_MSB_REG],\n\t\t coeff_array[BME680_P8_LSB_REG] ) );\n\t\tdev->calib.par_p9 = ( int16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_P9_MSB_REG],\n\t\t coeff_array[BME680_P9_LSB_REG] ) );\n\t\tdev->calib.par_p10 = ( uint8_t ) ( coeff_array[BME680_P10_REG] );\n\n\t\tdev->calib.par_h1 = ( uint16_t ) ( ( ( uint16_t ) coeff_array[BME680_H1_MSB_REG] << BME680_HUM_REG_SHIFT_VAL )\n\t\t | ( coeff_array[BME680_H1_LSB_REG] & BME680_BIT_H1_DATA_MSK ) );\n\t\tdev->calib.par_h2 = ( uint16_t ) ( ( ( uint16_t ) coeff_array[BME680_H2_MSB_REG] << BME680_HUM_REG_SHIFT_VAL )\n\t\t | ( ( coeff_array[BME680_H2_LSB_REG] ) >> BME680_HUM_REG_SHIFT_VAL ) );\n\t\tdev->calib.par_h3 = ( int8_t ) coeff_array[BME680_H3_REG];\n\t\tdev->calib.par_h4 = ( int8_t ) coeff_array[BME680_H4_REG];\n\t\tdev->calib.par_h5 = ( int8_t ) coeff_array[BME680_H5_REG];\n\t\tdev->calib.par_h6 = ( uint8_t ) coeff_array[BME680_H6_REG];\n\t\tdev->calib.par_h7 = ( int8_t ) coeff_array[BME680_H7_REG];\n\n\t\tdev->calib.par_gh1 = ( int8_t ) coeff_array[BME680_GH1_REG];\n\t\tdev->calib.par_gh2 = ( int16_t ) ( BME680_CONCAT_BYTES( coeff_array[BME680_GH2_MSB_REG],\n\t\t coeff_array[BME680_GH2_LSB_REG] ) );\n\t\tdev->calib.par_gh3 = ( int8_t ) coeff_array[BME680_GH3_REG];\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_get_regs( BME680_ADDR_RES_HEAT_RANGE_ADDR, &temp_var, 1, dev );\n\n\t\t\tdev->calib.res_heat_range = ( ( temp_var & BME680_RHRANGE_MSK ) / 16 );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\trslt = bme680_get_regs( BME680_ADDR_RES_HEAT_VAL_ADDR, &temp_var, 1, dev );\n\n\t\t\t\tdev->calib.res_heat_val = ( int8_t ) temp_var;\n\n\t\t\t\tif ( rslt == BME680_OK )\n\t\t\t\t{\n\t\t\t\t\trslt = bme680_get_regs( BME680_ADDR_RANGE_SW_ERR_ADDR, &temp_var, 1, dev );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdev->calib.range_sw_err = ( ( int8_t ) temp_var & ( int8_t ) BME680_RSERROR_MSK ) / 16;\n\t}\n\n\treturn rslt;\n}\n\nstatic int8_t set_gas_config( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\n\t\tuint8_t reg_addr[2] = {0};\n\t\tuint8_t reg_data[2] = {0};\n\n\t\tif ( dev->power_mode == BME680_FORCED_MODE )\n\t\t{\n\t\t\treg_addr[0] = BME680_RES_HEAT0_ADDR;\n\t\t\treg_data[0] = calc_heater_res( dev->gas_sett.heatr_temp, dev );\n\t\t\treg_addr[1] = BME680_GAS_WAIT0_ADDR;\n\t\t\treg_data[1] = calc_heater_dur( dev->gas_sett.heatr_dur );\n\t\t\tdev->gas_sett.nb_conv = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trslt = BME680_W_DEFINE_PWR_MODE;\n\t\t}\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_set_regs( reg_addr, reg_data, 2, dev );\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nstatic int8_t get_gas_config( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t reg_addr1 = BME680_ADDR_SENS_CONF_START;\n\tuint8_t reg_addr2 = BME680_ADDR_GAS_CONF_START;\n\tuint8_t reg_data = 0;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tif ( BME680_SPI_INTF == dev->intf )\n\t\t{\n\t\t\trslt = set_mem_page( reg_addr1, dev );\n\t\t}\n\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_get_regs( reg_addr1, &reg_data, 1, dev );\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\tdev->gas_sett.heatr_temp = reg_data;\n\t\t\t\trslt = bme680_get_regs( reg_addr2, &reg_data, 1, dev );\n\n\t\t\t\tif ( rslt == BME680_OK )\n\t\t\t\t{\n\t\t\t\t\tdev->gas_sett.heatr_dur = reg_data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\n#ifndef BME680_FLOAT_POINT_COMPENSATION\n\nstatic int16_t calc_temperature( uint32_t temp_adc, struct bme680_dev *dev )\n{\n\tint64_t var1;\n\tint64_t var2;\n\tint64_t var3;\n\tint16_t calc_temp;\n\n\tvar1 = ( ( int32_t ) temp_adc >> 3 ) - ( ( int32_t ) dev->calib.par_t1 << 1 );\n\tvar2 = ( var1 * ( int32_t ) dev->calib.par_t2 ) >> 11;\n\tvar3 = ( ( var1 >> 1 ) * ( var1 >> 1 ) ) >> 12;\n\tvar3 = ( ( var3 ) * ( ( int32_t ) dev->calib.par_t3 << 4 ) ) >> 14;\n\tdev->calib.t_fine = ( int32_t ) ( var2 + var3 );\n\tcalc_temp = ( int16_t ) ( ( ( dev->calib.t_fine * 5 ) + 128 ) >> 8 );\n\n\treturn calc_temp;\n}\n\nstatic uint32_t calc_pressure( uint32_t pres_adc, const struct bme680_dev *dev )\n{\n\tint32_t var1 = 0;\n\tint32_t var2 = 0;\n\tint32_t var3 = 0;\n\tint32_t pressure_comp = 0;\n\n\tvar1 = ( ( ( int32_t )dev->calib.t_fine ) >> 1 ) - 64000;\n\tvar2 = ( ( ( ( var1 >> 2 ) * ( var1 >> 2 ) ) >> 11 ) *\n\t ( int32_t )dev->calib.par_p6 ) >> 2;\n\tvar2 = var2 + ( ( var1 * ( int32_t )dev->calib.par_p5 ) << 1 );\n\tvar2 = ( var2 >> 2 ) + ( ( int32_t )dev->calib.par_p4 << 16 );\n\tvar1 = ( ( ( ( ( var1 >> 2 ) * ( var1 >> 2 ) ) >> 13 ) *\n\t ( ( int32_t )dev->calib.par_p3 << 5 ) ) >> 3 ) +\n\t ( ( ( int32_t )dev->calib.par_p2 * var1 ) >> 1 );\n\tvar1 = var1 >> 18;\n\tvar1 = ( ( 32768 + var1 ) * ( int32_t )dev->calib.par_p1 ) >> 15;\n\tpressure_comp = 1048576 - pres_adc;\n\tpressure_comp = ( int32_t )( ( pressure_comp - ( var2 >> 12 ) ) * ( ( uint32_t )3125 ) );\n\n\tif ( pressure_comp >= BME680_MAX_OVERFLOW_VAL )\n\t{\n\t\tpressure_comp = ( ( pressure_comp / ( uint32_t )var1 ) << 1 );\n\t}\n\telse\n\t{\n\t\tpressure_comp = ( ( pressure_comp << 1 ) / ( uint32_t )var1 );\n\t}\n\n\tvar1 = ( ( int32_t )dev->calib.par_p9 * ( int32_t )( ( ( pressure_comp >> 3 ) *\n\t ( pressure_comp >> 3 ) ) >> 13 ) ) >> 12;\n\tvar2 = ( ( int32_t )( pressure_comp >> 2 ) *\n\t ( int32_t )dev->calib.par_p8 ) >> 13;\n\tvar3 = ( ( int32_t )( pressure_comp >> 8 ) * ( int32_t )( pressure_comp >> 8 ) *\n\t ( int32_t )( pressure_comp >> 8 ) *\n\t ( int32_t )dev->calib.par_p10 ) >> 17;\n\n\tpressure_comp = ( int32_t )( pressure_comp ) + ( ( var1 + var2 + var3 +\n\t ( ( int32_t )dev->calib.par_p7 << 7 ) ) >> 4 );\n\n\treturn ( uint32_t )pressure_comp;\n\n}\n\nstatic uint32_t calc_humidity( uint16_t hum_adc, const struct bme680_dev *dev )\n{\n\tint32_t var1;\n\tint32_t var2;\n\tint32_t var3;\n\tint32_t var4;\n\tint32_t var5;\n\tint32_t var6;\n\tint32_t temp_scaled;\n\tint32_t calc_hum;\n\n\ttemp_scaled = ( ( ( int32_t ) dev->calib.t_fine * 5 ) + 128 ) >> 8;\n\tvar1 = ( int32_t ) ( hum_adc - ( ( int32_t ) ( ( int32_t ) dev->calib.par_h1 * 16 ) ) )\n\t - ( ( ( temp_scaled * ( int32_t ) dev->calib.par_h3 ) / ( ( int32_t ) 100 ) ) >> 1 );\n\tvar2 = ( ( int32_t ) dev->calib.par_h2\n\t * ( ( ( temp_scaled * ( int32_t ) dev->calib.par_h4 ) / ( ( int32_t ) 100 ) )\n\t + ( ( ( temp_scaled * ( ( temp_scaled * ( int32_t ) dev->calib.par_h5 ) / ( ( int32_t ) 100 ) ) ) >> 6 )\n\t / ( ( int32_t ) 100 ) ) + ( int32_t ) ( 1 << 14 ) ) ) >> 10;\n\tvar3 = var1 * var2;\n\tvar4 = ( int32_t ) dev->calib.par_h6 << 7;\n\tvar4 = ( ( var4 ) + ( ( temp_scaled * ( int32_t ) dev->calib.par_h7 ) / ( ( int32_t ) 100 ) ) ) >> 4;\n\tvar5 = ( ( var3 >> 14 ) * ( var3 >> 14 ) ) >> 10;\n\tvar6 = ( var4 * var5 ) >> 1;\n\tcalc_hum = ( ( ( var3 + var6 ) >> 10 ) * ( ( int32_t ) 1000 ) ) >> 12;\n\n\tif ( calc_hum > 100000 )\n\t{\n\t\tcalc_hum = 100000;\n\t}\n\telse if ( calc_hum < 0 )\n\t{\n\t\tcalc_hum = 0;\n\t}\n\n\treturn ( uint32_t ) calc_hum;\n}\n\nstatic uint32_t calc_gas_resistance( uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev )\n{\n\tint64_t var1;\n\tuint64_t var2;\n\tint64_t var3;\n\tuint32_t calc_gas_res;\n\tuint32_t lookupTable1[16] = { UINT32_C( 2147483647 ), UINT32_C( 2147483647 ), UINT32_C( 2147483647 ), UINT32_C( 2147483647 ),\n\t UINT32_C( 2147483647 ), UINT32_C( 2126008810 ), UINT32_C( 2147483647 ), UINT32_C( 2130303777 ),\n\t UINT32_C( 2147483647 ), UINT32_C( 2147483647 ), UINT32_C( 2143188679 ), UINT32_C( 2136746228 ),\n\t UINT32_C( 2147483647 ), UINT32_C( 2126008810 ), UINT32_C( 2147483647 ), UINT32_C( 2147483647 )\n\t };\n\tuint32_t lookupTable2[16] = { UINT32_C( 4096000000 ), UINT32_C( 2048000000 ), UINT32_C( 1024000000 ), UINT32_C( 512000000 ),\n\t UINT32_C( 255744255 ), UINT32_C( 127110228 ), UINT32_C( 64000000 ), UINT32_C( 32258064 ), UINT32_C( 16016016 ),\n\t UINT32_C( 8000000 ), UINT32_C( 4000000 ), UINT32_C( 2000000 ), UINT32_C( 1000000 ), UINT32_C( 500000 ),\n\t UINT32_C( 250000 ), UINT32_C( 125000 )\n\t };\n\n\tvar1 = ( int64_t ) ( ( 1340 + ( 5 * ( int64_t ) dev->calib.range_sw_err ) ) *\n\t ( ( int64_t ) lookupTable1[gas_range] ) ) >> 16;\n\tvar2 = ( ( ( int64_t ) ( ( int64_t ) gas_res_adc << 15 ) - ( int64_t ) ( 16777216 ) ) + var1 );\n\tvar3 = ( ( ( int64_t ) lookupTable2[gas_range] * ( int64_t ) var1 ) >> 9 );\n\tcalc_gas_res = ( uint32_t ) ( ( var3 + ( ( int64_t ) var2 >> 1 ) ) / ( int64_t ) var2 );\n\n\treturn calc_gas_res;\n}\n\nstatic uint8_t calc_heater_res( uint16_t temp, const struct bme680_dev *dev )\n{\n\tuint8_t heatr_res;\n\tint32_t var1;\n\tint32_t var2;\n\tint32_t var3;\n\tint32_t var4;\n\tint32_t var5;\n\tint32_t heatr_res_x100;\n\n\tif ( temp > 400 )\n\t{\n\t\ttemp = 400;\n\t}\n\n\tvar1 = ( ( ( int32_t ) dev->amb_temp * dev->calib.par_gh3 ) / 1000 ) * 256;\n\tvar2 = ( dev->calib.par_gh1 + 784 ) * ( ( ( ( ( dev->calib.par_gh2 + 154009 ) * temp * 5 ) / 100 ) + 3276800 ) / 10 );\n\tvar3 = var1 + ( var2 / 2 );\n\tvar4 = ( var3 / ( dev->calib.res_heat_range + 4 ) );\n\tvar5 = ( 131 * dev->calib.res_heat_val ) + 65536;\n\theatr_res_x100 = ( int32_t ) ( ( ( var4 / var5 ) - 250 ) * 34 );\n\theatr_res = ( uint8_t ) ( ( heatr_res_x100 + 50 ) / 100 );\n\n\treturn heatr_res;\n}\n\n#else\n\nstatic float calc_temperature( uint32_t temp_adc, struct bme680_dev *dev )\n{\n\tfloat var1 = 0;\n\tfloat var2 = 0;\n\tfloat calc_temp = 0;\n\n\tvar1 = ( ( ( ( float )temp_adc / 16384.0f ) - ( ( float )dev->calib.par_t1 / 1024.0f ) )\n\t * ( ( float )dev->calib.par_t2 ) );\n\n\tvar2 = ( ( ( ( ( float )temp_adc / 131072.0f ) - ( ( float )dev->calib.par_t1 / 8192.0f ) ) *\n\t ( ( ( float )temp_adc / 131072.0f ) - ( ( float )dev->calib.par_t1 / 8192.0f ) ) ) *\n\t ( ( float )dev->calib.par_t3 * 16.0f ) );\n\n\tdev->calib.t_fine = ( var1 + var2 );\n\n\tcalc_temp = ( ( dev->calib.t_fine ) / 5120.0f );\n\n\treturn calc_temp;\n}\n\nstatic float calc_pressure( uint32_t pres_adc, const struct bme680_dev *dev )\n{\n\tfloat var1 = 0;\n\tfloat var2 = 0;\n\tfloat var3 = 0;\n\tfloat calc_pres = 0;\n\n\tvar1 = ( ( ( float )dev->calib.t_fine / 2.0f ) - 64000.0f );\n\tvar2 = var1 * var1 * ( ( ( float )dev->calib.par_p6 ) / ( 131072.0f ) );\n\tvar2 = var2 + ( var1 * ( ( float )dev->calib.par_p5 ) * 2.0f );\n\tvar2 = ( var2 / 4.0f ) + ( ( ( float )dev->calib.par_p4 ) * 65536.0f );\n\tvar1 = ( ( ( ( ( float )dev->calib.par_p3 * var1 * var1 ) / 16384.0f )\n\t + ( ( float )dev->calib.par_p2 * var1 ) ) / 524288.0f );\n\tvar1 = ( ( 1.0f + ( var1 / 32768.0f ) ) * ( ( float )dev->calib.par_p1 ) );\n\tcalc_pres = ( 1048576.0f - ( ( float )pres_adc ) );\n\n\tif ( ( int )var1 != 0 )\n\t{\n\t\tcalc_pres = ( ( ( calc_pres - ( var2 / 4096.0f ) ) * 6250.0f ) / var1 );\n\t\tvar1 = ( ( ( float )dev->calib.par_p9 ) * calc_pres * calc_pres ) / 2147483648.0f;\n\t\tvar2 = calc_pres * ( ( ( float )dev->calib.par_p8 ) / 32768.0f );\n\t\tvar3 = ( ( calc_pres / 256.0f ) * ( calc_pres / 256.0f ) * ( calc_pres / 256.0f )\n\t\t * ( dev->calib.par_p10 / 131072.0f ) );\n\t\tcalc_pres = ( calc_pres + ( var1 + var2 + var3 + ( ( float )dev->calib.par_p7 * 128.0f ) ) / 16.0f );\n\t}\n\telse\n\t{\n\t\tcalc_pres = 0;\n\t}\n\n\treturn calc_pres;\n}\n\nstatic float calc_humidity( uint16_t hum_adc, const struct bme680_dev *dev )\n{\n\tfloat calc_hum = 0;\n\tfloat var1 = 0;\n\tfloat var2 = 0;\n\tfloat var3 = 0;\n\tfloat var4 = 0;\n\tfloat temp_comp;\n\n\ttemp_comp = ( ( dev->calib.t_fine ) / 5120.0f );\n\n\tvar1 = ( float )( ( float )hum_adc ) - ( ( ( float )dev->calib.par_h1 * 16.0f ) + ( ( ( float )dev->calib.par_h3 / 2.0f )\n\t * temp_comp ) );\n\n\tvar2 = var1 * ( ( float )( ( ( float ) dev->calib.par_h2 / 262144.0f ) * ( 1.0f + ( ( ( float )dev->calib.par_h4 / 16384.0f )\n\t * temp_comp ) + ( ( ( float )dev->calib.par_h5 / 1048576.0f ) * temp_comp * temp_comp ) ) ) );\n\n\tvar3 = ( float ) dev->calib.par_h6 / 16384.0f;\n\n\tvar4 = ( float ) dev->calib.par_h7 / 2097152.0f;\n\n\tcalc_hum = var2 + ( ( var3 + ( var4 * temp_comp ) ) * var2 * var2 );\n\n\tif ( calc_hum > 100.0f )\n\t{\n\t\tcalc_hum = 100.0f;\n\t}\n\telse if ( calc_hum < 0.0f )\n\t{\n\t\tcalc_hum = 0.0f;\n\t}\n\n\treturn calc_hum;\n}\n\nstatic float calc_gas_resistance( uint16_t gas_res_adc, uint8_t gas_range, const struct bme680_dev *dev )\n{\n\tfloat calc_gas_res;\n\tfloat var1 = 0;\n\tfloat var2 = 0;\n\tfloat var3 = 0;\n\n\tconst float lookup_k1_range[16] =\n\t{\n\t\t0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -0.8,\n\t\t0.0, 0.0, -0.2, -0.5, 0.0, -1.0, 0.0, 0.0\n\t};\n\tconst float lookup_k2_range[16] =\n\t{\n\t\t0.0, 0.0, 0.0, 0.0, 0.1, 0.7, 0.0, -0.8,\n\t\t-0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0\n\t};\n\n\tvar1 = ( 1340.0f + ( 5.0f * dev->calib.range_sw_err ) );\n\tvar2 = ( var1 ) * ( 1.0f + lookup_k1_range[gas_range] / 100.0f );\n\tvar3 = 1.0f + ( lookup_k2_range[gas_range] / 100.0f );\n\n\tcalc_gas_res = 1.0f / ( float )( var3 * ( 0.000000125f ) * ( float )( 1 << gas_range ) * ( ( ( ( ( float )gas_res_adc )\n\t - 512.0f ) / var2 ) + 1.0f ) );\n\n\treturn calc_gas_res;\n}\n\nstatic float calc_heater_res( uint16_t temp, const struct bme680_dev *dev )\n{\n\tfloat var1 = 0;\n\tfloat var2 = 0;\n\tfloat var3 = 0;\n\tfloat var4 = 0;\n\tfloat var5 = 0;\n\tfloat res_heat = 0;\n\n\tif ( temp > 400 )\n\t{\n\t\ttemp = 400;\n\t}\n\n\tvar1 = ( ( ( float )dev->calib.par_gh1 / ( 16.0f ) ) + 49.0f );\n\tvar2 = ( ( ( ( float )dev->calib.par_gh2 / ( 32768.0f ) ) * ( 0.0005f ) ) + 0.00235f );\n\tvar3 = ( ( float )dev->calib.par_gh3 / ( 1024.0f ) );\n\tvar4 = ( var1 * ( 1.0f + ( var2 * ( float )temp ) ) );\n\tvar5 = ( var4 + ( var3 * ( float )dev->amb_temp ) );\n\tres_heat = ( uint8_t )( 3.4f * ( ( var5 * ( 4 / ( 4 + ( float )dev->calib.res_heat_range ) ) *\n\t ( 1 / ( 1 + ( ( float ) dev->calib.res_heat_val * 0.002f ) ) ) ) - 25 ) );\n\n\treturn res_heat;\n}\n\n#endif\n\nstatic uint8_t calc_heater_dur( uint16_t dur )\n{\n\tuint8_t factor = 0;\n\tuint8_t durval;\n\n\tif ( dur >= 0xfc0 )\n\t{\n\t\tdurval = 0xff; /* Max duration*/\n\t}\n\telse\n\t{\n\t\twhile ( dur > 0x3F )\n\t\t{\n\t\t\tdur = dur / 4;\n\t\t\tfactor += 1;\n\t\t}\n\n\t\tdurval = ( uint8_t ) ( dur + ( factor * 64 ) );\n\t}\n\n\treturn durval;\n}\n\nstatic int8_t read_field_data( struct bme680_field_data *data, struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t buff[BME680_FIELD_LENGTH] = { 0 };\n\tuint8_t gas_range;\n\tuint32_t adc_temp;\n\tuint32_t adc_pres;\n\tuint16_t adc_hum;\n\tuint16_t adc_gas_res;\n\tuint8_t tries = 10;\n\n\trslt = null_ptr_check( dev );\n\n\tdo\n\t{\n\t\tif ( rslt == BME680_OK )\n\t\t{\n\t\t\trslt = bme680_get_regs( ( ( uint8_t ) ( BME680_FIELD0_ADDR ) ), buff, ( uint16_t ) BME680_FIELD_LENGTH,\n\t\t\t dev );\n\n\t\t\tdata->status = buff[0] & BME680_NEW_DATA_MSK;\n\t\t\tdata->gas_index = buff[0] & BME680_GAS_INDEX_MSK;\n\t\t\tdata->meas_index = buff[1];\n\n\t\t\tadc_pres = ( uint32_t ) ( ( ( uint32_t ) buff[2] * 4096 ) | ( ( uint32_t ) buff[3] * 16 )\n\t\t\t | ( ( uint32_t ) buff[4] / 16 ) );\n\t\t\tadc_temp = ( uint32_t ) ( ( ( uint32_t ) buff[5] * 4096 ) | ( ( uint32_t ) buff[6] * 16 )\n\t\t\t | ( ( uint32_t ) buff[7] / 16 ) );\n\t\t\tadc_hum = ( uint16_t ) ( ( ( uint32_t ) buff[8] * 256 ) | ( uint32_t ) buff[9] );\n\t\t\tadc_gas_res = ( uint16_t ) ( ( uint32_t ) buff[13] * 4 | ( ( ( uint32_t ) buff[14] ) / 64 ) );\n\t\t\tgas_range = buff[14] & BME680_GAS_RANGE_MSK;\n\n\t\t\tdata->status |= buff[14] & BME680_GASM_VALID_MSK;\n\t\t\tdata->status |= buff[14] & BME680_HEAT_STAB_MSK;\n\n\t\t\tif ( data->status & BME680_NEW_DATA_MSK )\n\t\t\t{\n\t\t\t\tdata->temperature = calc_temperature( adc_temp, dev );\n\t\t\t\tdata->pressure = calc_pressure( adc_pres, dev );\n\t\t\t\tdata->humidity = calc_humidity( adc_hum, dev );\n\t\t\t\tdata->gas_resistance = calc_gas_resistance( adc_gas_res, gas_range, dev );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdev->delay_ms( BME680_POLL_PERIOD_MS );\n\t\t}\n\n\t\ttries--;\n\t}\n\twhile ( tries );\n\n\tif ( !tries )\n\t{\n\t\trslt = BME680_W_NO_NEW_DATA;\n\t}\n\n\treturn rslt;\n}\n\nstatic int8_t set_mem_page( uint8_t reg_addr, struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t reg;\n\tuint8_t mem_page;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tif ( reg_addr > 0x7f )\n\t\t{\n\t\t\tmem_page = BME680_MEM_PAGE1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmem_page = BME680_MEM_PAGE0;\n\t\t}\n\n\t\tif ( mem_page != dev->mem_page )\n\t\t{\n\t\t\tdev->mem_page = mem_page;\n\n\t\t\tdev->com_rslt = dev->read( dev->dev_id, BME680_MEM_PAGE_ADDR | BME680_SPI_RD_MSK, &reg, 1 );\n\n\t\t\tif ( dev->com_rslt != 0 )\n\t\t\t{\n\t\t\t\trslt = BME680_E_COM_FAIL;\n\t\t\t}\n\n\t\t\tif ( rslt == BME680_OK )\n\t\t\t{\n\t\t\t\treg = reg & ( ~BME680_MEM_PAGE_MSK );\n\t\t\t\treg = reg | ( dev->mem_page & BME680_MEM_PAGE_MSK );\n\n\t\t\t\tdev->com_rslt = dev->write( dev->dev_id, BME680_MEM_PAGE_ADDR & BME680_SPI_WR_MSK,\n\t\t\t\t &reg, 1 );\n\n\t\t\t\tif ( dev->com_rslt != 0 )\n\t\t\t\t{\n\t\t\t\t\trslt = BME680_E_COM_FAIL;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nstatic int8_t get_mem_page( struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\tuint8_t reg;\n\n\trslt = null_ptr_check( dev );\n\n\tif ( rslt == BME680_OK )\n\t{\n\t\tdev->com_rslt = dev->read( dev->dev_id, BME680_MEM_PAGE_ADDR | BME680_SPI_RD_MSK, &reg, 1 );\n\n\t\tif ( dev->com_rslt != 0 )\n\t\t{\n\t\t\trslt = BME680_E_COM_FAIL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdev->mem_page = reg & BME680_MEM_PAGE_MSK;\n\t\t}\n\t}\n\n\treturn rslt;\n}\n\nstatic int8_t boundary_check( uint8_t *value, uint8_t min, uint8_t max, struct bme680_dev *dev )\n{\n\tint8_t rslt = BME680_OK;\n\n\tif ( value != NULL )\n\t{\n\t\tif ( *value < min )\n\t\t{\n\t\t\t*value = min;\n\t\t\tdev->info_msg |= BME680_I_MIN_CORRECTION;\n\t\t}\n\n\t\tif ( *value > max )\n\t\t{\n\t\t\t*value = max;\n\t\t\tdev->info_msg |= BME680_I_MAX_CORRECTION;\n\t\t}\n\t}\n\telse\n\t{\n\t\trslt = BME680_E_NULL_PTR;\n\t}\n\n\treturn rslt;\n}\n\nstatic int8_t null_ptr_check( const struct bme680_dev *dev )\n{\n\tint8_t rslt;\n\n\tif ( ( dev == NULL ) || ( dev->read == NULL ) || ( dev->write == NULL ) || ( dev->delay_ms == NULL ) )\n\t{\n\t\trslt = BME680_E_NULL_PTR;\n\t}\n\telse\n\t{\n\t\trslt = BME680_OK;\n\t}\n\n\treturn rslt;\n}\n"
}
}
},
"md5": "beec437787975a2dac4ad728546aab28"
}
},
"drivers": {
"adc": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_ADC_ADC1"
}
],
"ble": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_BLE_BLE1"
}
],
"block": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_BLOCK_BLOCK1"
}
],
"embeddedCloud": [
{
"id": 1,
"name": "ATMO_DRIVERINSTANCE_CLOUD_WIFI"
}
],
"datetime": [],
"filesytem": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_FILESYSTEM_FILESYSTEM1"
}
],
"gpio": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_GPIO_GPIO1"
}
],
"http": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_HTTP_HTTP1",
"primary": true
}
],
"i2c": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_I2C_I2C1",
"primary": true
}
],
"interval": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_INTERVAL_INTERVAL1"
}
],
"nfc": [],
"pwm": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_PWM_PWM1"
}
],
"spi": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_SPI_SPI1"
}
],
"uart": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_UART_UART1"
},
{
"id": 1,
"name": "ATMO_DRIVERINSTANCE_UART_UART2",
"primary": true
}
],
"wifi": [
{
"id": 0,
"name": "ATMO_DRIVERINSTANCE_WIFI_WIFI1"
}
]
},
"firmwareFiles": {
"artifactName": "firmware",
"fileName": "firmware.zip"
},
"static": {
"header": "",
"footer": "",
"functions": {
"ATMO_Setup": {
"returnType": "void",
"code": "",
"arguments": []
}
}
}
},
"Application": {
"type": "app",
"compilerVersion": "latest",
"variants": [],
"meta": {
"appViewLayouts": {
"375": {
"812": true
}
}
},
"elements": [
{
"name": "ImageDoorClosed",
"type": "AppUIImage",
"variants": [
"app",
"ui"
],
"properties": {
"errorData": null,
"layouts": {
"375": {
"812": {
"width": 100,
"height": 99.48979591836735,
"x": 230,
"y": 610,
"rotation": 0,
"propertyOverlay": {}
}
}
},
"visible": true,
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACm8AAAhaCAYAAABnMh6dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEwLTIzVDE2OjE0OjAyLTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMS0yMFQxMTozNjo0MS0wNTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMS0yMFQxMTozNjo0MS0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiMTg4YzExYS1jODg3LTQzOWYtOTU0NS1lNTY0NzM1NjM4ZjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6YjE4OGMxMWEtYzg4Ny00MzlmLTk1NDUtZTU2NDczNTYzOGY3IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YjE4OGMxMWEtYzg4Ny00MzlmLTk1NDUtZTU2NDczNTYzOGY3Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMTg4YzExYS1jODg3LTQzOWYtOTU0NS1lNTY0NzM1NjM4ZjciIHN0RXZ0OndoZW49IjIwMTktMTAtMjNUMTY6MTQ6MDItMDQ6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6TD+rPAAB0kklEQVR4nOzdvZkbRwJFUZCfgtkQlL+lEDYbyNCOyCU5HAzQfbt+zrFgwn51q/rL/X6/AQAAAAAAAAAAAND4evUfAAAAAAAAAAAAANjJH28//vvnn1f+DwAAGJWn6gEAAADgOV+u/gMAADCa//z11+12+y7eBACATYkzAQAAAOAcH21v4k4AALYl3gQAYBciTQAAAAAYy3ubnagTAIDliTcBAFiRUBMAAAAA5vWrfU/QCQDAUsSbAADMTqgJAAAAAOsTdAIAsBTxJgAAsxFrAgAAAAC3289boZgTAIBpiDcBABidWBMAAAAAeISYEwCAaYg3AQAYkWATAAAAAHjV9zujkBMAgKGINwEAGIFYEwAAAAA4k1c5AQAYingTAICrCDYBAAAAgKt4lRMAgEuJNwEAKAk2AQAAAIDRvO2WIk4AADLiTQAACqJNAAAAAGB0XuMEACAj3gQA4CyCTQAAAABgVkJOAABOJd4EAOBook0AAAAAYCU+qw4AwOHEmwAAHEGwCQAAAACszmucAAAcRrwJAMArRJsAAAAAwI68xgkAwEvEmwAAPEO0CQAAAAAg4gQA4EniTQAAHiXYBAAAAAD4NZ9UBwDgU8SbAAB8RLQJAAAAAPA4r3ECAPAh8SYAAO8RbQIAAAAAPE/ECQDAu8SbAAD8SLQJAAAAAHAcEScAAD8RbwIA8Ea0CQAAAABwHhEnAAD/Em8CACDaBAAAAADoiDgBALh9vfoPAABwKeEmAAAAAMA17LMAABvz8iYAwJ6MggAAAAAA1/MKJwDApsSbAAB7EW0CAAAAAIxHxAkAsBnxJgDAHkSbAAAAAADjE3ECAGzi69V/AACA0wk3AQAAAADmYtcFAFiclzcBANZl3AMAAAAAmJdXOAEAFublTQCA9dxvwk0AAAAAgFXYewEAFiTeBABYixEPAAAAAGA9Lu0DACzGZ9MBANZgtAMAAAAAWJ9PqQMALMLLmwAA8xNuAgAAAADsxS4MADA5L28CAMzLOAcAAAAAsC+vcAIATMzLmwAAcxJuAgAAAABwu9mLAQCmJN4EAJiPIQ4AAAAAgO/ZjQEAJuOz6QAA8zC+AQAAAADwHp9RBwCYiJc3AQDmINwEAAAAAOAR9mQAgAl4eRMAYGxGNgAAAAAAPssrnAAAg/PyJgDAuISbAAAAAAC8ws4MADAo8SYAwJgMagAAAAAAHMHeDAAwIPEmAMB4DGkAAAAAABzJ7gwAMJg/rv4DAAD8y3gGAAAAAMBZ3jboL5f+CwAAbreblzcBAEYh3AQAAAAAoGCPBgAYgHgTAOB6hjIAAAAAAEp2aQCAi4k3AQCuZSADAAAAAOAK9mkAgAuJNwEArnG/GcYAAAAAALiWnRoA4CLiTQCAnjEMAAAAAIBReGwAAOAC4k0AgJYBDAAAAACAEdmvAQBC4k0AgI7hCwAAAACAkdmxAQAi4k0AgIbBCwAAAACAGdizAQAC4k0AgPMZugAAAAAAmIldGwDgZOJNAIBzGbgAAAAAAJiRfRsA4ETiTQCA8xi2AAAAAACYmZ0bAOAk4k0AgHMYtAAAAAAAWIG9GwDgBOJNAIDjGbIAAAAAAFiJ3RsA4GDiTQCAYxmwAAAAAABYkf0bAOBA4k0AgOMYrgAAAAAAWJkdHADgIOJNAIBjGKwAAAAAANiBPRwA4ADiTQCA1xmqAAAAAADYiV0cAOBF4k0AgNcYqAAAAAAA2JF9HADgBeJNAIDnGaYAAAAAANiZnRwA4EniTQCA5xikAAAAAADAXg4A8BTxJgDA5xmiAAAAAADgG7s5AMAniTcBAD7HAAUAAAAAAD+znwMAfIJ4EwDgcYYnAAAAAAB4nx0dAOBB4k0AgMcYnAAAAAAA4GP2dACAB4g3AQA+ZmgCAAAAAIDH2dUBAD4g3gQA+D0DEwAAAAAAfJ59HQDgN8SbAAAAAAAAAAAAACHxJgDA+9wKBgAAAACA59nZAQDeId4EAPg1gxIAAAAAALzO3g4A8AviTQCAnxmSAAAAAADgOHZ3AIAfiDcBAP6fAQkAAAAAAI5nfwcA+I54EwDgG8MRAAAAAACcxw4PAPA/4k0AAAAAAAAAAACAkHgTAOAfbvsCAAAAAMD57PEAADfxJgDA7WYoAgAAAACAkl0eANieeBMA2J2BCAAAAAAAevZ5AGBr4k0AYGeGIQAAAAAAAAAgJ94EAAAAAAAAAK7gkQUAYFviTQBgVwYhAAAAAAC4nr0eANiSeBMA2JEhCAAAAAAAxmG3BwC2I94EAAAAAAAAAAAACIk3AYDduL0LAAAAAADjsd8DAFsRbwIAOzH8AAAAAADAuOz4AMA2xJsAwC4MPgAAAAAAMD57PgCwBfEmAAAAAAAAAAAAQEi8CQDswC1dAAAAAACYh10fAFieeBMAWJ2BBwAAAAAA5mPfBwCWJt4EAAAAAAAAAAAACIk3AYCVuZULAAAAAADzsvMDAMsSbwIAqzLoAAAAAADA/Oz9AMCSxJsAAAAAAAAAAAAAIfEmALAit3ABAAAAAGAddn8AYDniTQAAAAAAAAAAAICQeBMAWI3btwAAAAAAsB77PwCwFPEmALASww0AAAAAAKzLOQAAsAzxJgAAAAAAAAAAAEBIvAkArMJtWwAAAAAAWJ/zAABgCeJNAAAAAAAAAAAAgJB4EwBYgVu2AAAAAACwD+cCAMD0xJsAwOwMNAAAAAAAsB/nAwDA1MSbAAAAAAAAAAAAACHxJgAwM7dqAQAAAABgX84JAIBpiTcBAAAAAAAAAAAAQuJNAGBWbtMCAAAAAADOCwCAKYk3AQAAAAAAAAAAAELiTQBgRm7RAgAAAAAAb5wbAADTEW8CAAAAAAAAAAAAhMSbAMBs3J4FAAAAAAB+5PwAAJiKeBMAAAAAAAAAAAAgJN4EAGbi1iwAAAAAAPAe5wgAwDTEmwAAAAAAAAAAAAAh8SYAMAu3ZQEAAAAAgI84TwAApiDeBAAAAAAAAAAAAAiJNwGAGbglCwAAAAAAPMq5AgAwPPEmAAAAAAAAAAAAQEi8CQCMzu1YAAAAAADgs5wvAABDE28CAAAAAAAAAAAAhMSbAMDI3IoFAAAAAACe5ZwBABiWeBMAAAAAAAAAAAAgJN4EAEblNiwAAAAAAPAq5w0AwJDEmwAAAAAAAAAAAAAh8SYAMCK3YAEAAAAAAACAZYk3AQAAAAAAAICVeTQCABiOeBMAAAAAAAAAAAAgJN4EAEbj9isAAAAAAHA05w8AwFDEmwAAAAAAAAAAAAAh8SYAMBK3XgEAAAAAgLM4hwAAhiHeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AYBQ+VQIAAAAAAJzNeQQAMATxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CACPwiRIAAAAAAKDiXAIAuJx4EwAAAAAAAAAAACAk3gQAruZ2KwAAAAAAUHM+AQBcSrwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwDAlXySBAAAAAAAuIpzCgDgMuJNAAAAAAAAAAAAgJB4EwAAAAAAAAAAACAk3gQAruJTJAAAAAAAwNWcVwAAlxBvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAcAWfIAEAAAAAAAAAtiXeBAAAAAAAAAB25tEJACAn3gQAAAAAAAAAAAAIiTcBAAAAAAAAAAAAQuJNAKDm0yMAAAAAAMBonF8AACnxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CACWfHAEAAAAAAAAAtifeBAAAAAAAAADwCAUAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAUPGpEQAAAAAAYHTOMwCAhHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AoHC/+g8AAAAAAAAAAIxCvAkAAAAAAAAA8I1HKQCA04k3AQAAAAAAAAAAAELiTQAAAAAAAAAAAICQeBMAAAAAAAAAAAAgJN4EAM52v/oPAAAAAAAAfJLzDQDgVOJNAAAAAAAAAAAAgJB4EwAAAAAAAAAAACAk3gQAAAAAAAAAAAAIiTcBAAAAAAAAAAAAQuJNAOBM96v/AAAAAAAAwJOccwAApxFvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwDAWe5X/wEAAAAAAIAXOe8AAE4h3gQAAAAAAAAAAAAIiTcBAAAAAAAAAAAAQuJNAAAAAAAAAAAAgJB4EwAAAAAAAAAAACAk3gQAAAAAAAAAAAAIiTcBAAAAAAAAAAAAQuJNAAAAAAAAAAAAgJB4EwA4w/3qPwAAAAAAAHAQ5x4AwOHEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAcLT71X8AAAAAAAAAAGBk4k0AAAAAAAAAgN/zeAUAcCjxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAADA3+zdS1JjVxBAQePo/W8ZD+z+mG5ASE/n/jIXABeiSqMTJQAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAA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AAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAP5p716S28aiKAhCDu9/y+qBGw7YpiiCAAq/zA3wkZpoUHEuAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACE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AAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABA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",
"scaling": "targetWidth",
"pressedData": {
"x": 0,
"y": 0
},
"releasedData": {
"x": 0,
"y": 0
},
"overData": {
"x": 0,
"y": 0
},
"leftData": {
"x": 0,
"y": 0
}
},
"meta": {
"editorX": 423,
"editorY": 814,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": [],
"pressed": [],
"released": [],
"over": [],
"imageSet": []
}
},
{
"name": "ImageDoorOpen",
"type": "AppUIImage",
"variants": [
"app",
"ui"
],
"properties": {
"errorData": null,
"layouts": {
"375": {
"812": {
"width": 100,
"height": 80.04492699363534,
"x": 230,
"y": 610,
"rotation": 0,
"propertyOverlay": {}
}
}
},
"visible": true,
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACm8AAAhaCAYAAABnMh6dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEwLTIzVDE2OjEzOjU0LTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMS0yMFQxMTozNjo0NS0wNTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMS0yMFQxMTozNjo0NS0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjOTJlNzA1YS1iMzA4LTQ0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EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACDo6+gDAAAAAAAAnOhj9AEAKOky+gAAAPRmeRMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJNwEAAAAAAAAAAACCxJsAAAAAAAAAAAAAQeJNAAAAAAAAAAAAgCDxJgAAAAAAAAAAAECQeBMAAAAAAAAAAAAgSLwJAAAAAAAAAAAAECTeBAAAAAAAAAAAAAgSbwIAAAAAAAAAAAAEiTcBAAAAAAAAAAAAgsSbAAAAAAAAAAAAAEHiTQAAAAAAAAAAAIAg8SYAAAAAAAAAAABAkHgTAAAAAAAAAAAAIEi8CQAAAAAAAAAAABAk3gQAAAAAAAAAAAAIEm8CAAAAAAAAAAAABIk3AQAAAAAAAAAAAILEmwAAAAAAAAAAAABB4k0AAAAAAAAAAACAIPEmAAAAAAAAAAAAQJB4EwAAAAAAAAAAACBIvAkAAAAAAAAAAAAQJN4EAAAAAAAAAAAACBJvAgAAAAAAAAAAAASJN+H/7N3LThxJEEBRGM3//zKzGGMhREPTXXUrH+fsbac7YnkVBQAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhMSbAAAAAAAAAAAAACHxJgAAAAAAAAAAAEBIvAkAAAAAAAAAAAAQ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SLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAAAAAAAAAITEmwAAAAAAAAAAAAAh8SYAAAAAAAAAAABASLwJAAAAAAAAAAAAEBJvAgAAAADwX3v3ktw2FkVBEHJ4/1tWD9xwwDZFEQRQ+GVugI/UQJOKcwEAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAiJNwEAAAAA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QEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABASbwIAAAAAAAAAAACExJsAAAAAAAAAAAAAIfEmAAAAAAAAAAAAQEi8CQAAAAAAAAAAABCaxpsfu70CAAAAAAAAAAAA4Np+d5qWNwEAAAAAAAAAAABC4k0AAAAAAAAAAACAkHgTAAAAAAAAAAAAICTeBAAAAAAAAAAAAAj9HW9+7PIKAAAAAAAAAAAAgOv6o8+0vAkAAAAAAAAAAAAQEm8CAAAAAAAAAAAAhB7Fm06nAwAAAAAAAAAAAKzjny7T8iYAAAAAAAAAAABASLwJAAAAAAAAAAAAEPoq3nQ6HQAAAAAAAAAAAGCZhz2m5U0AAAAAAAAAAACAkHgTAAAAAAAAAAAAIPQs3nQ6HQAAAAAAAAAAAOA9X3aYljcBAAAAAAAAAAAAQt/Fm9Y3AQAAAAAAAAAAAOZ52l9a3gQAAAAAAAAAAAAIvRJvWt8EAAAAAAAAAAAAeM233aXlTQAAAAAAAAAAAIDQq/Gm9U0AAAAAAAAAAACA517qLS1vAgAAAAAAAAAAAITmxJvWNwEAAAAAAAAAAAAee7mztLwJAAAAAAAAAAAAEJobb1rfBAAAAAAAAAAAAPjTrL7yneVNAScAAAAAAAAAAADAL7O7SmfTAQAAAAAAAAAAAELvxpvWNwEAAAAAAAAAAIC7e6unXLK8KeAEAAAAAAAAAAAA7urtjtLZdAAAAAAAAAAAAIDQ0njT+iYAAAAAAAAAAABwN4v6yTWWNwWcAAAAAAAAAAAAwF0s7ibXOpsu4AQAAAAAAAAAAACubpVecq14cxgEnAAAAAAAAAAAAMB1rdZJrhlvDoOAEwAAAAAAAAAAALieVfvItePNYRBwAgAAAAAAAAAAANexehe5Rbw5DAJOAAAAAAAAAAAA4Pw26SG3ijeHQcAJAAAAAAAAAAAAnNdmHeSW8eYwCDgBAAAAAAAAAACA89m0f9w63hwGAScAAAAAAAAAAABwHpt3j0W8OQwCTgAAAAAAAAAAAOD4kt6xijeHQcAJAAAAAAAAAAAAHFfWOf6sPuh/4xf7jD8XAAAAAAAAAAAA4JF8nLJc3pyywgkAAAAAAAAAAADsbZeesV7enLLCCQAAAAAAAAAAAOxh1xHKvZY3p6xwAgAAAAAAAAAAAJXdu8U9lzenrHACAAAAAAAAAAAAW9o92hwdJd4ciTgBAAAAAAAAAACANR0m2hwdLd4ciTgBAAAAAAAAAACAJQ4XbY6OGm+ORJwAAAAAAAAAAADAHIeNNkdHjzdHIk4AAAAAAAAAAADgmcNHm6OzxJuj6Q8r5AQAAAAAAAAAAIB7O02wOXW2eHNKyAkAAAAAAAAAAAD3c8pgc+rM8eaUkBMAAAAAAAAAAACu6/TB5tRV4s2pR38gQScAAAAAAAAAAACcw6VCzUc+Pj91jQAAAAAAAAAAAACVH3s/AAAAAAAAAAAAAOBO/gM/2grMorqx7wAAAABJRU5ErkJggg==",
"scaling": "targetWidth",
"pressedData": {
"x": 0,
"y": 0
},
"releasedData": {
"x": 0,
"y": 0
},
"overData": {
"x": 0,
"y": 0
},
"leftData": {
"x": 0,
"y": 0
}
},
"meta": {
"editorX": 423,
"editorY": 712,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": [],
"pressed": [],
"released": [],
"over": [],
"imageSet": []
}
},
{
"name": "LabelGas",
"type": "AppUILabel",
"variants": [
"app",
"ui"
],
"properties": {
"errorData": null,
"layouts": {
"375": {
"812": {
"width": 130,
"height": 10,
"x": 40,
"y": 700,
"rotation": 0,
"propertyOverlay": {}
}
}
},
"visible": true,
"text": "11671 Kohms",
"font": "18px Helvetica",
"color": "black",
"alignment": "center"
},
"meta": {
"editorX": 324,
"editorY": 566,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": []
}
},
{
"name": "LabelHumid",
"type": "AppUILabel",
"variants": [
"app",
"ui"
],
"properties": {
"errorData": null,
"layouts": {
"375": {
"812": {
"width": 100,
"height": 100,
"x": 220,
"y": 520,
"rotation": 0,
"propertyOverlay": {}
}
}
},
"visible": true,
"text": "15%",
"font": "18px Helvetica",
"color": "black",
"alignment": "center"
},
"meta": {
"editorX": 327,
"editorY": 416,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": []
}
},
{
"name": "LabelTemp",
"type": "AppUILabel",
"variants": [
"app",
"ui"
],
"properties": {
"errorData": null,
"layouts": {
"375": {
"812": {
"width": 100,
"height": 100,
"x": 50,
"y": 520,
"rotation": 0,
"propertyOverlay": {}
}
}
},
"visible": true,
"text": "25°C",
"font": "18px Helvetica",
"color": "black",
"alignment": "center"
},
"meta": {
"editorX": 326,
"editorY": 263,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": []
}
},
{
"name": "Toggle",
"type": "AppUIToggle",
"variants": [
"app",
"ui"
],
"properties": {
"errorData": null,
"layouts": {
"375": {
"812": {
"width": 100,
"height": 100,
"x": 160,
"y": 360,
"rotation": 0,
"propertyOverlay": {}
}
}
},
"visible": true,
"value": false
},
"meta": {
"editorX": 28,
"editorY": 117,
"lastTrigger": "changed"
},
"triggers": {
"triggered": [],
"changed": [
{
"mapping": {
"value": {
"code": "value"
}
},
"targetOrder": [
"value"
],
"targetElement": "BLECharacteristicLights",
"targetAbility": "write"
}
],
"checked": [],
"unchecked": []
}
},
{
"name": "BLECharacteristicLights",
"type": "AppBLECharacteristicCustom",
"variants": [
"app",
"ble"
],
"properties": {
"errorData": {},
"readData": null,
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicLights, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicLights, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicLights, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicLights, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicLights, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicLights, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicLights, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicLights, writeDataType), ATMO_PROPERTY(BLECharacteristicLights, readDataType), ATMO_PROPERTY(BLECharacteristicLights, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicLights, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicLights, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicLights, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\tATMO_VARIABLE(BLECharacteristicLights, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicLights, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicLights, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicLights, instance),\n\t\tATMO_VARIABLE(BLECharacteristicLights, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicLights, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a974",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_BOOL",
"writeDataType": "ATMO_DATATYPE_BOOL",
"notifyDataType": "ATMO_DATATYPE_BOOL"
},
"meta": {
"editorX": 176,
"editorY": 116,
"lastTrigger": "read"
},
"triggers": {
"triggered": [],
"read": [],
"written": [],
"notification": [],
"indication": [],
"subscribed": [],
"unsubscribed": []
},
"coupledElementName": "BLECharacteristicLights",
"coupledElementPlaneName": "Adafruit Huzzah32"
},
{
"name": "ImageBackground",
"type": "AppUIImage",
"variants": [
"app",
"ui"
],
"properties": {
"errorData": null,
"layouts": {
"375": {
"812": {
"width": 375,
"height": 667,
"x": 0,
"y": 0,
"rotation": 0,
"propertyOverlay": {}
}
}
},
"visible": true,
"image": "data:image/png;base64,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",
"scaling": "none",
"pressedData": {
"x": 0,
"y": 0
},
"releasedData": {
"x": 0,
"y": 0
},
"overData": {
"x": 0,
"y": 0
},
"leftData": {
"x": 0,
"y": 0
}
},
"meta": {
"editorX": 32,
"editorY": 16,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": [],
"pressed": [],
"released": [],
"over": [],
"imageSet": []
}
},
{
"name": "BLECharacteristicTemp",
"type": "AppBLECharacteristicCustom",
"variants": [
"app",
"ble"
],
"properties": {
"errorData": {},
"readData": null,
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicTemp, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicTemp, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicTemp, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicTemp, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicTemp, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicTemp, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicTemp, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicTemp, writeDataType), ATMO_PROPERTY(BLECharacteristicTemp, readDataType), ATMO_PROPERTY(BLECharacteristicTemp, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicTemp, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicTemp, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicTemp, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\tATMO_VARIABLE(BLECharacteristicTemp, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicTemp, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicTemp, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicTemp, instance),\n\t\tATMO_VARIABLE(BLECharacteristicTemp, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicTemp, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a975",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_STRING",
"writeDataType": "ATMO_DATATYPE_STRING",
"notifyDataType": "ATMO_DATATYPE_STRING"
},
"meta": {
"editorX": 175,
"editorY": 263,
"lastTrigger": "read"
},
"triggers": {
"triggered": [],
"read": [
{
"mapping": {
"text": {
"code": "readData+\"°C\""
}
},
"targetOrder": [
"text"
],
"targetElement": "LabelTemp",
"targetAbility": "setText"
},
{
"mapping": {
"value": {
"code": "readData"
}
},
"targetOrder": [
"value"
],
"targetElement": "CloudEventTemp",
"targetAbility": "send"
}
],
"written": [],
"notification": [],
"indication": [],
"subscribed": [],
"unsubscribed": []
},
"coupledElementName": "BLECharacteristicTemp",
"coupledElementPlaneName": "Adafruit Huzzah32"
},
{
"name": "BLECharacteristicHumid",
"type": "AppBLECharacteristicCustom",
"variants": [
"app",
"ble"
],
"properties": {
"errorData": {},
"readData": null,
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicHumid, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicHumid, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicHumid, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicHumid, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicHumid, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicHumid, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicHumid, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicHumid, writeDataType), ATMO_PROPERTY(BLECharacteristicHumid, readDataType), ATMO_PROPERTY(BLECharacteristicHumid, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicHumid, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicHumid, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicHumid, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\tATMO_VARIABLE(BLECharacteristicHumid, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicHumid, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicHumid, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicHumid, instance),\n\t\tATMO_VARIABLE(BLECharacteristicHumid, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicHumid, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a976",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_STRING",
"writeDataType": "ATMO_DATATYPE_STRING",
"notifyDataType": "ATMO_DATATYPE_STRING"
},
"meta": {
"editorX": 175,
"editorY": 414,
"lastTrigger": "read"
},
"triggers": {
"triggered": [],
"read": [
{
"mapping": {
"text": {
"code": "readData+\"%RH\""
}
},
"targetOrder": [
"text"
],
"targetElement": "LabelHumid",
"targetAbility": "setText"
},
{
"mapping": {
"value": {
"code": "readData"
}
},
"targetOrder": [
"value"
],
"targetElement": "CloudEventHumid",
"targetAbility": "send"
}
],
"written": [],
"notification": [],
"indication": [],
"subscribed": [],
"unsubscribed": []
},
"coupledElementName": "BLECharacteristicHumid",
"coupledElementPlaneName": "Adafruit Huzzah32"
},
{
"name": "BLECharacteristicGas",
"type": "AppBLECharacteristicCustom",
"variants": [
"app",
"ble"
],
"properties": {
"errorData": {},
"readData": null,
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicGas, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicGas, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicGas, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicGas, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicGas, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicGas, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicGas, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicGas, writeDataType), ATMO_PROPERTY(BLECharacteristicGas, readDataType), ATMO_PROPERTY(BLECharacteristicGas, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicGas, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicGas, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicGas, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\tATMO_VARIABLE(BLECharacteristicGas, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicGas, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicGas, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicGas, instance),\n\t\tATMO_VARIABLE(BLECharacteristicGas, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicGas, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a977",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_STRING",
"writeDataType": "ATMO_DATATYPE_STRING",
"notifyDataType": "ATMO_DATATYPE_STRING"
},
"meta": {
"editorX": 177,
"editorY": 564,
"lastTrigger": "read"
},
"triggers": {
"triggered": [],
"read": [
{
"mapping": {
"text": {
"code": "(readData/1000).toFixed(2)+\"Kohms\""
}
},
"targetOrder": [
"text"
],
"targetElement": "LabelGas",
"targetAbility": "setText"
},
{
"mapping": {
"value": {
"code": "readData/1000"
}
},
"targetOrder": [
"value"
],
"targetElement": "CloudEventGas",
"targetAbility": "send"
}
],
"written": [],
"notification": [],
"indication": [],
"subscribed": [],
"unsubscribed": []
},
"coupledElementName": "BLECharacteristicGas",
"coupledElementPlaneName": "Adafruit Huzzah32"
},
{
"name": "Interval1",
"type": "AppInterval",
"variants": [
"app"
],
"properties": {
"errorData": null,
"time": 1000,
"startOnInitialize": true
},
"meta": {
"editorX": 31,
"editorY": 416,
"lastTrigger": "interval"
},
"triggers": {
"triggered": [],
"interval": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicTemp",
"targetAbility": "read"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicHumid",
"targetAbility": "read"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicGas",
"targetAbility": "read"
}
],
"started": [],
"paused": []
}
},
{
"name": "CloudEventTemp",
"type": "AppCloudEvent",
"variants": [
"app"
],
"properties": {
"errorData": null
},
"meta": {
"editorX": 327,
"editorY": 342,
"lastTrigger": "sent"
},
"triggers": {
"triggered": [],
"sent": []
}
},
{
"name": "CloudEventHumid",
"type": "AppCloudEvent",
"variants": [
"app"
],
"properties": {
"errorData": null
},
"meta": {
"editorX": 327,
"editorY": 492,
"lastTrigger": "sent"
},
"triggers": {
"triggered": [],
"sent": []
}
},
{
"name": "CloudEventGas",
"type": "AppCloudEvent",
"variants": [
"app"
],
"properties": {
"errorData": null
},
"meta": {
"editorX": 325,
"editorY": 645,
"lastTrigger": "sent"
},
"triggers": {
"triggered": [],
"sent": []
}
},
{
"name": "BLECharacteristicDoor",
"type": "AppBLECharacteristicCustom",
"variants": [
"app",
"ble"
],
"properties": {
"errorData": {},
"readData": null,
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicDoor, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicDoor, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(BLECharacteristicDoor, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicDoor, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(BLECharacteristicDoor, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(BLECharacteristicDoor, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(BLECharacteristicDoor, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(BLECharacteristicDoor, writeDataType), ATMO_PROPERTY(BLECharacteristicDoor, readDataType), ATMO_PROPERTY(BLECharacteristicDoor, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\t&ATMO_VARIABLE(BLECharacteristicDoor, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(BLECharacteristicDoor, bleServiceHandle), \n\t\tATMO_PROPERTY(BLECharacteristicDoor, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\tATMO_VARIABLE(BLECharacteristicDoor, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(BLECharacteristicDoor, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(BLECharacteristicDoor, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(BLECharacteristicDoor, instance),\n\t\tATMO_VARIABLE(BLECharacteristicDoor, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(BLECharacteristicDoor, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": "ATMO_DRIVERINSTANCE_BLE_BLE1",
"bleServiceUuid": "fc213d9c-2fce-4456-a6d9-300be807a973",
"bleCharacteristicUuid": "fc213d9c-2fce-4456-a6d9-300be807a978",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_BOOL",
"writeDataType": "ATMO_DATATYPE_BOOL",
"notifyDataType": "ATMO_DATATYPE_BOOL"
},
"meta": {
"editorX": 181,
"editorY": 763,
"lastTrigger": "read"
},
"triggers": {
"triggered": [],
"read": [
{
"mapping": {
"value": {
"code": "readData"
}
},
"targetOrder": [
"value"
],
"targetElement": "Condition",
"targetAbility": "check"
}
],
"written": [],
"notification": [],
"indication": [],
"subscribed": [],
"unsubscribed": []
},
"coupledElementName": "BLECharacteristicDoor",
"coupledElementPlaneName": "Adafruit Huzzah32"
},
{
"name": "IntervalF",
"type": "AppInterval",
"variants": [
"app"
],
"properties": {
"errorData": null,
"time": "50",
"startOnInitialize": true
},
"meta": {
"editorX": 28,
"editorY": 765,
"lastTrigger": "interval"
},
"triggers": {
"triggered": [],
"interval": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "BLECharacteristicDoor",
"targetAbility": "read"
}
],
"started": [],
"paused": []
}
},
{
"name": "Condition",
"type": "AppCondition",
"variants": [
"app"
],
"properties": {
"errorData": null,
"value": null
},
"meta": {
"editorX": 328,
"editorY": 765,
"lastTrigger": "conditionFalse"
},
"triggers": {
"triggered": [],
"conditionTrue": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "ImageDoorOpen",
"targetAbility": "show"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "ImageDoorClosed",
"targetAbility": "hide"
}
],
"conditionFalse": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "ImageDoorOpen",
"targetAbility": "hide"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "ImageDoorClosed",
"targetAbility": "show"
}
]
}
}
]
},
"Cloud": {
"type": "cloud",
"compilerVersion": "latest",
"variants": [],
"meta": {},
"elements": [
{
"name": "CloudEventTemp",
"type": "CloudEvent",
"variants": [
"cloud"
],
"properties": {
"errorData": null,
"value": null
},
"meta": {
"editorX": 78,
"editorY": 14,
"lastTrigger": "eventReceived"
},
"triggers": {
"triggered": [],
"eventReceived": [
{
"mapping": {
"value": {
"code": "{temperature:value}"
}
},
"targetOrder": [
"value"
],
"targetElement": "CloudStorage",
"targetAbility": "addData"
}
]
},
"coupledElementName": "CloudEventTemp",
"coupledElementPlaneName": "Application"
},
{
"name": "CloudEventHumid",
"type": "CloudEvent",
"variants": [
"cloud"
],
"properties": {
"errorData": null,
"value": null
},
"meta": {
"editorX": 77,
"editorY": 116,
"lastTrigger": "eventReceived"
},
"triggers": {
"triggered": [],
"eventReceived": [
{
"mapping": {
"value": {
"code": "{humid:value}"
}
},
"targetOrder": [
"value"
],
"targetElement": "CloudStorage",
"targetAbility": "addData"
}
]
},
"coupledElementName": "CloudEventHumid",
"coupledElementPlaneName": "Application"
},
{
"name": "CloudEventGas",
"type": "CloudEvent",
"variants": [
"cloud"
],
"properties": {
"errorData": null,
"value": null
},
"meta": {
"editorX": 77,
"editorY": 213,
"lastTrigger": "eventReceived"
},
"triggers": {
"triggered": [],
"eventReceived": [
{
"mapping": {
"value": {
"code": "{gas:value}"
}
},
"targetOrder": [
"value"
],
"targetElement": "CloudStorage",
"targetAbility": "addData"
}
]
},
"coupledElementName": "CloudEventGas",
"coupledElementPlaneName": "Application"
},
{
"name": "CloudStorage",
"type": "CloudStorage",
"variants": [
"cloud"
],
"properties": {
"errorData": null,
"value": null
},
"meta": {
"editorX": 228,
"editorY": 117,
"lastTrigger": "dataAdded"
},
"triggers": {
"triggered": [],
"dataAdded": [],
"dataUpdated": [],
"dataRemoved": [],
"dataQueried": []
}
}
],
"layout": {
"height": 1000,
"width": 1000,
"zIndexOrder": []
}
}
}
}