# Copyright (C) 2019 Google Inc.
#
# Licensed 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.
# Datasheet: https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf
cyanobyte: 0.1.0
info:
  contact:
    name: Nick Felker
    url: https://github.com/google/cyanobyte
    email: felker@google.com
  package: com.cyanobyte
  title: BMP280
  description: Bosch Digital Pressure Sensor
  copyright:
    name: Google Inc.
    date: '2019'
  license:
    name: Apache-2.0
  version: 0.1.0

i2c:
  addressType: 7-bit
  address: 0x77
  addressMask: 0xFF

registers:
  # Raw temperature value is defined as:
  #   (msb << 12) + (lsb << 4) + (xlsb >> 4)
  TempMsb:
    address: 0xFA
    length: 8
    title: Temperature MSB
    description: Part 1 of temperature
    readWrite: R
  TempLsb:
    address: 0xFB
    length: 8
    title: Temperature LSB
    description: Part 2 of temperature
    readWrite: R
  TempXlsb:
    address: 0xFC
    length: 8
    title: Temperature XLSB
    description: Final part of temperature
    readWrite: R
  DigT1:
    address: 0x88
    length: 16
    title: Digital Temperature Compensation 1
    description: Used for Celcius conversion
    readWrite: R
    signed: false
  DigT2:
    address: 0x8A
    length: 16
    title: Digital Temperature Compensation 2
    description: Used for Celcius conversion
    readWrite: R
    signed: true
  DigT3:
    address: 0x8C
    length: 16
    title: Digital Temperature Compensation 3
    description: Used for Celcius conversion
    readWrite: R
    signed: true
  PressureMsb:
    address: 0xF7
    length: 8
    title: Pressure MSB
    description: Part 1 of Pressure
    readWrite: R
  PressureLsb:
    address: 0xF8
    length: 8
    title: Pressure LSB
    description: Part 2 of Pressure
    readWrite: R
  PressureXlsb:
    address: 0xF9
    length: 8
    title: Pressure XLSB
    description: Part 3 of Pressure
    readWrite: R
  DigP1:
    address: 0x8E
    length: 16
    signed: false
    title: Digital Pressure Compensation 1
    description: Used for Pascals conversion
    readWrite: R
  DigP2:
    address: 0x90
    length: 16
    signed: true
    title: Digital Pressure Compensation 2
    description: Used for Pascals conversion
    readWrite: R
  DigP3:
    address: 0x92
    length: 16
    signed: true
    title: Digital Pressure Compensation 3
    description: Used for Pascals conversion
    readWrite: R
  DigP4:
    address: 0x94
    length: 16
    signed: true
    title: Digital Pressure Compensation 4
    description: Used for Pascals conversion
    readWrite: R
  DigP5:
    address: 0x96
    length: 16
    signed: true
    title: Digital Pressure Compensation 5
    description: Used for Pascals conversion
    readWrite: R
  DigP6:
    address: 0x98
    length: 16
    signed: true
    title: Digital Pressure Compensation 6
    description: Used for Pascals conversion
    readWrite: R
  DigP7:
    address: 0x9A
    length: 16
    signed: true
    title: Digital Pressure Compensation 7
    description: Used for Pascals conversion
    readWrite: R
  DigP8:
    address: 0x9C
    length: 16
    signed: true
    title: Digital Pressure Compensation 8
    description: Used for Pascals conversion
    readWrite: R
  DigP9:
    address: 0x9E
    length: 16
    signed: true
    title: Digital Pressure Compensation 9
    description: Used for Pascals conversion
    readWrite: R
functions:
  temperature:
    title: Temperature as read by sensor
    description: Reads the temperature
    computed:
      asRaw:
        variables:
          valueMsb: int8
          valueLsb: int8
          valueXlsb: int8
          output: int32
        logic:
          - valueMsb: '#/registers/TempMsb'
          - valueLsb: '#/registers/TempLsb'
          - valueXlsb: '#/registers/TempXlsb'
          - output:
            - sum:
              - bitShiftLeft:
                var: valueMsb
                bits: 12
              - bitShiftLeft:
                var: valueLsb
                bits: 4
              - bitShiftRight:
                var: valueXlsb
                bits: 4
        return: output
      asCelsius:
        variables:
          valueMsb: int8
          valueLsb: int8
          valueXlsb: int8
          valueDT1: int16
          valueDT2: int16
          valueDT3: int16
          rawTemp: int32
          rawComp1: int32
          rawComp2: int32
          rawComp3: int32
          celsius: float32
        logic:
          - valueMsb: '#/registers/TempMsb'
          - valueLsb: '#/registers/TempLsb'
          - valueXlsb: '#/registers/TempXlsb'
          - valueDT1: '#/registers/DigT1'
          - valueDT2: '#/registers/DigT2'
          - valueDT3: '#/registers/DigT3'
          - rawTemp:
            - sum:
              - bitShiftLeft:
                var: valueMsb
                bits: 12
              - bitShiftLeft:
                var: valueLsb
                bits: 4
              - bitShiftRight:
                var: valueXlsb
                bits: 4
          - rawComp1:
            - product:
              - difference:
                - division:
                  - rawTemp
                  - 16384.0
                - division:
                  - valueDT1
                  - 1024.0
              - valueDT2
          - rawComp3:
            - difference:
              - division:
                - rawTemp
                - 131072.0
              - division:
                - valueDT1
                - 8192.0
          - rawComp2:
            - product:
              - rawComp3
              - rawComp3
              - valueDT3
          - celsius:
            - division:
              - sum:
                - rawComp1
                - rawComp2
              - 5120.0
        return: celsius
  pressure:
    title: Pressure as read by sensor
    description: Reads the atmospheric pressure
    computed:
      asRaw:
        variables:
          valueMsb: int8
          valueLsb: int8
          valueXlsb: int8
          output: int32
        logic:
          - valueMsb: '#/registers/PressureMsb'
          - valueLsb: '#/registers/PressureLsb'
          - valueXlsb: '#/registers/PressureXlsb'
          - output:
            - sum:
              - bitShiftLeft:
                var: valueMsb
                bits: 12
              - bitShiftLeft:
                var: valueLsb
                bits: 4
              - bitShiftRight:
                var: valueXlsb
                bits: 4
        return: output
      asHpa:
        variables:
          valueMsb: int8
          valueLsb: int8
          valueXlsb: int8
          valueDP1: int16
          valueDP2: int16
          valueDP3: int16
          valueDP4: int16
          valueDP5: int16
          valueDP6: int16
          valueDP7: int16
          valueDP8: int16
          valueDP9: int16
          rawPressure: int32
          rawTemperature: int32
          rawComp1: int32
          rawComp2: int32
          rawComp3: int32
          hpa: float32
        logic:
          - valueMsb: '#/registers/PressureMsb'
          - valueLsb: '#/registers/PressureLsb'
          - valueXlsb: '#/registers/PressureXlsb'
          - valueDP1: '#/registers/DigP1'
          - valueDP2: '#/registers/DigP2'
          - valueDP3: '#/registers/DigP3'
          - valueDP4: '#/registers/DigP4'
          - valueDP5: '#/registers/DigP5'
          - valueDP6: '#/registers/DigP6'
          - valueDP7: '#/registers/DigP7'
          - valueDP8: '#/registers/DigP8'
          - valueDP9: '#/registers/DigP9'
          - rawTemperature: '#/functions/temperature/asCelsius'
          - rawTemperature:
            - product:
              - rawTemperature
              - 5120.0 # Undivide the function value
          - rawPressure:
            - sum:
              - bitShiftLeft:
                var: valueMsb
                bits: 12
              - bitShiftLeft:
                var: valueLsb
                bits: 4
              - bitShiftRight:
                var: valueXlsb
                bits: 4
          - rawComp1:
            - difference:
              - division:
                - rawTemperature
                - 2
              - 64000.0
          - rawComp2:
            - division:
              - product:
                - rawComp1
                - rawComp1
                - valueDP6
              - 32768.0
          - rawComp2:
            - sum:
              - rawComp2
              - product:
                - rawComp1
                - valueDP5
                - 2.0
          - rawComp2:
            - sum:
              - division:
                - rawComp2
                - 4.0
              - product:
                - valueDP4
                - 65536.0
          - rawComp3:
            - product:
              - valueDP3
              - rawComp1
              - rawComp1
          - rawComp1:
            - division:
              - sum:
                - division:
                  - rawComp3
                  - 524288.0
                - product:
                  - valueDP2
                  - rawComp1
              - 524288.0
          - rawComp1:
            - product:
              - sum:
                - 1.0
                - division:
                  - rawComp1
                  - 32768.0
              - valueDP1
          - hpa:
            - difference:
              - 1048576.0
              - rawPressure
          - hpa:
            - product:
              - difference:
                - hpa
                - division:
                  - rawComp2
                  - 4096.0
              - division:
                - 6250.0
                - rawComp1
          - rawComp1:
            - division:
              - product:
                - valueDP9
                - hpa
                - hpa
              - 2147483648.0
          - rawComp2:
            - division:
              - product:
                - hpa
                - valueDP8
              - 32768.0
          - hpa:
            - sum:
              - hpa
              - division:
                - sum:
                  - rawComp1
                  - rawComp2
                  - valueDP7
                - 16.0
          - hpa:
            - division:
              - hpa
              - 100.0
        return: hpa