# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

syscfg.defs:
    CONFIG_FCB:
        description: 'Config default storage is in FCB'
        value: 0
        restrictions:
            - '!CONFIG_NFFS'
            - '!CONFIG_LITTLEFS'
            - '!CONFIG_FCB2'
            - 'CONFIG_FCB_FLASH_AREA'
    CONFIG_NFFS:
        description: 'Config default storage is in NFFS'
        value: 0
        restrictions:
            - '!CONFIG_LITTLEFS'
            - '!CONFIG_FCB'
            - '!CONFIG_FCB2'
    CONFIG_FCB2:
        description: 'Config default storage is in FCB2'
        value: 0
        restrictions:
            - '!CONFIG_FCB'
            - '!CONFIG_NFFS'
            - '!CONFIG_LITTLEFS'
            - 'CONFIG_FCB_FLASH_AREA'
    CONFIG_LITTLEFS:
        description: 'Config default storage is in littefs'
        value: 0
        restrictions:
            - '!CONFIG_NFFS'
            - '!CONFIG_FCB'
            - '!CONFIG_FCB2'

    CONFIG_MGMT:
        description: 'SMP access to config'
        value: 0

    CONFIG_MGMT_RW:
        description: >
            Config management access: 1=read-only, 2=write-only, 3=read/write
            No effect if `CONFIG_MGMT` is 0.
        value: 3
        range: 1,2,3

    CONFIG_CLI:
        description: 'CLI commands for accessing config'
        value: 0
        restrictions:
            - 'SHELL_TASK'

    CONFIG_CLI_DEBUG:
        description: 'CLI debug commands for accessing config'
        value: 0
        restrictions:
            - 'SHELL_TASK'
            - 'CONFIG_CLI'

    CONFIG_AUTO_INIT:
        description: 'Automatically configure a single config region at bootup'
        value: 1

    CONFIG_SYSINIT_STAGE_1:
        description: >
            Primary sysinit stage for the config package.
        value: 50
    CONFIG_SYSINIT_STAGE_2:
        description: >
            Secondary sysinit stage for the config package; populates the
            underlying storage medium for config if it is has not been done.
        value: 220
    CONFIG_CLI_RW:
        description: >
            Config CLI commands read 1, write 2, read/write 3
        value: 3

syscfg.defs.(CONFIG_FCB || CONFIG_FCB2):
    CONFIG_FCB_FLASH_AREA:
        description: 'BSP flash area for config'
        type: 'flash_owner'
        value:
    CONFIG_FCB_MAGIC:
        description: 'Magic to identify valid configuration area'
        value: 0xc0ffeeee
    CONFIG_FCB_NUM_AREAS:
        description: >
            Number of areas to allocate in the config FCB.  A smaller number is
            used if the flash hardware cannot support this value.
        value: 8

syscfg.defs.CONFIG_NFFS:
    CONFIG_NFFS_DIR:
        description: 'Directory where config is stored'
        value: '"/cfg"'
    CONFIG_NFFS_FILE:
        description: 'Name for the default config file'
        value: '"/cfg/run"'
    CONFIG_NFFS_MAX_LINES:
        description: 'Limit how many items stored in file before compressing'
        value: 32

syscfg.vals.CONFIG_FCB2:
    CONFIG_FCB_MAGIC: 0xd0b1d0b1

syscfg.vals.CONFIG_NEWTMGR:
    CONFIG_MGMT: MYNEWT_VAL(CONFIG_NEWTMGR)
