Skip to content

Instantly share code, notes, and snippets.

@fuzzy
Created September 21, 2017 18:00
Show Gist options
  • Save fuzzy/1d5b5bdb7fc99b6a6dca6b87123b77d0 to your computer and use it in GitHub Desktop.
Save fuzzy/1d5b5bdb7fc99b6a6dca6b87123b77d0 to your computer and use it in GitHub Desktop.
// Warning (TypedefDecl): %!s(int=333): function pointers are not supported
// Warning (TypedefDecl): %!s(int=341): function pointers are not supported
// Warning (TypedefDecl): %!s(int=350): function pointers are not supported
// Warning (TypedefDecl): %!s(int=353): function pointers are not supported
// Warning (VarDecl): %!s(int=27): probably an incorrect type translation 2
// Warning (TypedefDecl): %!s(int=266): function pointers are not supported
// Warning (TypedefDecl): %!s(int=269): function pointers are not supported
// Warning (CallExpr): %!s(int=406): unknown function: delay_ms
// Warning (MemberExpr): %!s(int=429): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (CallExpr): %!s(int=432): unknown function: read
// Warning (MemberExpr): %!s(int=432): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (BinaryOperator): %!s(int=432): probably an incorrect type translation 1
// Warning (MemberExpr): %!s(int=462): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (CallExpr): %!s(int=475): unknown function: write
// Warning (MemberExpr): %!s(int=475): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (BinaryOperator): %!s(int=475): probably an incorrect type translation 1
// Warning (MemberExpr): %!s(int=510): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=514): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (CallExpr): %!s(int=604): unknown function: delay_ms
// Warning (InitListExpr): %!s(int=620): cannot transpile to expr
// Warning (VarDecl): %!s(int=620): probably an incorrect type translation 1
// Warning (InitListExpr): %!s(int=621): cannot transpile to expr
// Warning (VarDecl): %!s(int=621): probably an incorrect type translation 1
// Warning (MemberExpr): %!s(int=671): cannot determine type for LHS 'const struct bme280_settings *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=742): cannot determine type for LHS 'const struct bme280_settings *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=751): cannot determine type for LHS 'const struct bme280_settings *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=760): cannot determine type for LHS 'const struct bme280_settings *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=769): cannot determine type for LHS 'const struct bme280_settings *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1023): cannot determine type for LHS 'const struct bme280_uncomp_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1025): cannot determine type for LHS 'const struct bme280_uncomp_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1054): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1055): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1056): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1057): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1058): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1058): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1060): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1064): cannot determine type for LHS 'const struct bme280_uncomp_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1066): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1067): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1068): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1146): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1147): cannot determine type for LHS 'const struct bme280_uncomp_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1148): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1149): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1151): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1152): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1154): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1157): cannot determine type for LHS 'const struct bme280_calib_data *', will use 'void *' for all fields
// Warning (InitListExpr): %!s(int=1178): cannot transpile to expr
// Warning (VarDecl): %!s(int=1178): probably an incorrect type translation 1
// Warning (MemberExpr): %!s(int=1291): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1291): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
// Warning (MemberExpr): %!s(int=1291): cannot determine type for LHS 'const struct bme280_dev *', will use 'void *' for all fields
package main
import "io/ioutil"
import "testing"
import "unsafe"
import "os"
import "github.com/elliotchance/c2go/noarch"
type __int128_t int64
type __uint128_t uint64
type __builtin_ms_va_list []byte
type int8_t int8
type int16_t int16
type int32_t int
type int64_t int32
type uint8_t uint8
type uint16_t uint16
type uint32_t uint32
type uint64_t uint32
type int_least8_t int8
type int_least16_t int16
type int_least32_t int
type int_least64_t int32
type uint_least8_t uint8
type uint_least16_t uint16
type uint_least32_t uint32
type uint_least64_t uint32
type int_fast8_t int8
type int_fast16_t int32
type int_fast32_t int32
type int_fast64_t int32
type uint_fast8_t uint8
type uint_fast16_t uint32
type uint_fast32_t uint32
type uint_fast64_t uint32
type intptr_t int32
type uintptr_t uint32
type intmax_t int32
type uintmax_t uint32
type size_t uint32
type __u_char uint8
type __u_short uint16
type __u_int uint32
type __u_long uint32
type __int8_t int8
type __uint8_t uint8
type __int16_t int16
type __uint16_t uint16
type __int32_t int
type __uint32_t uint32
type __int64_t int32
type __uint64_t uint32
type __quad_t int32
type __u_quad_t uint32
type __dev_t uint32
type __uid_t uint32
type __gid_t uint32
type __ino_t uint32
type __ino64_t uint32
type __mode_t uint32
type __nlink_t uint32
type __off_t int32
type __off64_t int32
type __pid_t int
type __clock_t int32
type __rlim_t uint32
type __rlim64_t uint32
type __id_t uint32
type __time_t int32
type __useconds_t uint32
type __suseconds_t int32
type __daddr_t int
type __key_t int
type __clockid_t int
type __timer_t []byte
type __blksize_t int32
type __blkcnt_t int32
type __blkcnt64_t int32
type __fsblkcnt_t uint32
type __fsblkcnt64_t uint32
type __fsfilcnt_t uint32
type __fsfilcnt64_t uint32
type __fsword_t int32
type __ssize_t int32
type __syscall_slong_t int32
type __syscall_ulong_t uint32
type __loff_t __off64_t
type __caddr_t []byte
type __intptr_t int32
type __socklen_t uint32
type _IO_FILE struct {
}
type FILE _IO_FILE
type __FILE _IO_FILE
type __mbstate_t int64
type __gnuc_va_list int64
type _IO_jump_t struct {
}
type _IO_marker struct {
_next []_IO_marker
_sbuf []_IO_FILE
_pos int
}
const __codecvt_ok int = iota
const __codecvt_partial int = iota
const __codecvt_error int = iota
const __codecvt_noconv int = iota
type _IO_FILE_plus struct {
}
type __io_read_fn interface {
}
type __io_write_fn interface {
}
type __io_seek_fn interface {
}
type __io_close_fn interface {
}
type off_t __off_t
type ssize_t __ssize_t
var stdin *noarch.File
var stdout *noarch.File
var stderr *noarch.File
var sys_nerr int
var sys_errlist interface {
}
const BME280_SPI_INTF int = iota
const BME280_I2C_INTF int = iota
type bme280_com_fptr_t interface {
}
type bme280_delay_fptr_t interface {
}
type bme280_calib_data struct {
dig_T1 uint16_t
dig_T2 int16_t
dig_T3 int16_t
dig_P1 uint16_t
dig_P2 int16_t
dig_P3 int16_t
dig_P4 int16_t
dig_P5 int16_t
dig_P6 int16_t
dig_P7 int16_t
dig_P8 int16_t
dig_P9 int16_t
dig_H1 uint8_t
dig_H2 int16_t
dig_H3 uint8_t
dig_H4 int16_t
dig_H5 int16_t
dig_H6 int8_t
t_fine int32_t
}
type bme280_data struct {
pressure uint32_t
temperature int32_t
humidity uint32_t
}
type bme280_uncomp_data struct {
pressure uint32_t
temperature uint32_t
humidity uint32_t
}
type bme280_settings struct {
osr_p uint8_t
osr_t uint8_t
osr_h uint8_t
filter uint8_t
standby_time uint8_t
}
type bme280_dev struct {
chip_id uint8_t
dev_id uint8_t
intf bme280_intf
read bme280_com_fptr_t
write bme280_com_fptr_t
delay_ms bme280_delay_fptr_t
calib_data bme280_calib_data
settings bme280_settings
}
func bme280_init(dev []bme280_dev) int8_t {
var rslt int8_t
var try_count uint8_t = noarch.IntToUint8_t(5)
var chip_id uint8_t = noarch.IntToUint8_t(0)
rslt = null_ptr_check(dev)
if rslt == noarch.IntToInt8_t(0) {
for noarch.Uint8_tToBool(try_count) {
rslt = bme280_get_regs(noarch.IntToUint8_t(208), (*[1]uint8_t)(unsafe.Pointer(&chip_id))[:], noarch.IntToUint16_t(1), dev)
if (rslt == noarch.IntToInt8_t(0)) && (chip_id == noarch.IntToUint8_t(96)) {
dev[0].chip_id = chip_id
rslt = bme280_soft_reset(dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = get_calib_data(dev)
}
break
}
delay_ms(1)
func() uint8_t {
try_count -= 1
return try_count
}()
}
if noarch.Uint8_tToBool(noarch.NotUint8_t(try_count)) {
rslt = noarch.IntToInt8_t(-2)
}
}
return rslt
}
func bme280_get_regs(reg_addr uint8_t, reg_data []uint8_t, len uint16_t, dev []bme280_dev) int8_t {
var rslt int8_t
rslt = null_ptr_check(dev)
if rslt == noarch.IntToInt8_t(0) {
if dev[0].intf != BME280_I2C_INTF {
reg_addr = reg_addr|128
}
rslt = read(dev[0].dev_id, reg_addr, reg_data, len)
if rslt != noarch.IntToInt8_t(0) {
rslt = noarch.IntToInt8_t(-4)
}
}
return rslt
}
func bme280_set_regs(reg_addr []uint8_t, reg_data []uint8_t, len uint8_t, dev []bme280_dev) int8_t {
var rslt int8_t
var temp_buff []uint8_t = make([]uint8_t, 20, 20)
if len > 10 {
len = noarch.IntToUint8_t(10)
}
var temp_len uint16_t
var reg_addr_cnt uint8_t
rslt = null_ptr_check(dev)
if (rslt == noarch.IntToInt8_t(0)) && (reg_addr != nil) && (reg_data != nil) {
if len != noarch.IntToUint8_t(0) {
temp_buff[0] = reg_data[0]
if dev[0].intf != BME280_I2C_INTF {
for reg_addr_cnt = noarch.IntToUint8_t(0); reg_addr_cnt < len; func() uint8_t {
reg_addr_cnt += 1
return reg_addr_cnt
}() {
reg_addr[reg_addr_cnt] = reg_addr[reg_addr_cnt]&127
}
}
if len > 1 {
interleave_reg_addr(reg_addr, temp_buff, reg_data, len)
temp_len = noarch.Uint8_tToUint16_t(len*2)
} else {
temp_len = noarch.Uint8_tToUint16_t(len)
}
rslt = write(dev[0].dev_id, reg_addr[0], temp_buff, temp_len)
if rslt != noarch.IntToInt8_t(0) {
rslt = noarch.IntToInt8_t(-4)
}
} else {
rslt = noarch.IntToInt8_t(-3)
}
} else {
rslt = noarch.IntToInt8_t(-1)
}
return rslt
}
func bme280_set_sensor_settings(desired_settings uint8_t, dev []bme280_dev) int8_t {
var rslt int8_t
var sensor_mode uint8_t
rslt = null_ptr_check(dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = bme280_get_sensor_mode((*[1]uint8_t)(unsafe.Pointer(&sensor_mode))[:], dev)
if (rslt == noarch.IntToInt8_t(0)) && (sensor_mode != noarch.IntToUint8_t(0)) {
rslt = put_device_to_sleep(dev)
}
if rslt == noarch.IntToInt8_t(0) {
if noarch.Uint8_tToBool(are_settings_changed(noarch.IntToUint8_t(7), desired_settings)) {
rslt = set_osr_settings(desired_settings, noarch.ByteSliceSliceToBme280_settingsSlice((*[1][]byte)(unsafe.Pointer(&dev[0].settings))[:]), dev)
}
if (rslt == noarch.IntToInt8_t(0)) && noarch.Uint8_tToBool(are_settings_changed(noarch.IntToUint8_t(24), desired_settings)) {
rslt = set_filter_standby_settings(desired_settings, noarch.ByteSliceSliceToBme280_settingsSlice((*[1][]byte)(unsafe.Pointer(&dev[0].settings))[:]), dev)
}
}
}
return rslt
}
func bme280_get_sensor_settings(dev []bme280_dev) int8_t {
var rslt int8_t
var reg_data []uint8_t = make([]uint8_t, 4, 4)
rslt = null_ptr_check(dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = bme280_get_regs(noarch.IntToUint8_t(242), reg_data, noarch.IntToUint16_t(4), dev)
if rslt == noarch.IntToInt8_t(0) {
parse_device_settings(reg_data, (*[1]bme280_settings)(unsafe.Pointer(&dev[0].settings))[:])
}
}
return rslt
}
func bme280_set_sensor_mode(sensor_mode uint8_t, dev []bme280_dev) int8_t {
var rslt int8_t
var last_set_mode uint8_t
rslt = null_ptr_check(dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = bme280_get_sensor_mode((*[1]uint8_t)(unsafe.Pointer(&last_set_mode))[:], dev)
if (rslt == noarch.IntToInt8_t(0)) && (last_set_mode != noarch.IntToUint8_t(0)) {
rslt = put_device_to_sleep(dev)
}
if rslt == noarch.IntToInt8_t(0) {
rslt = write_power_mode(sensor_mode, dev)
}
}
return rslt
}
func bme280_get_sensor_mode(sensor_mode []uint8_t, dev []bme280_dev) int8_t {
var rslt int8_t
rslt = null_ptr_check(dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = bme280_get_regs(noarch.IntToUint8_t(244), sensor_mode, noarch.IntToUint16_t(1), dev)
sensor_mode[0] = (sensor_mode[0] & (3))
}
return rslt
}
func bme280_soft_reset(dev []bme280_dev) int8_t {
var rslt int8_t
var reg_addr uint8_t = noarch.IntToUint8_t(224)
var soft_rst_cmd uint8_t = noarch.IntToUint8_t(182)
rslt = null_ptr_check(dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(&reg_addr))[:], (*[1]uint8_t)(unsafe.Pointer(&soft_rst_cmd))[:], noarch.IntToUint8_t(1), dev)
delay_ms(2)
}
return rslt
}
func bme280_get_sensor_data(sensor_comp uint8_t, comp_data []bme280_data, dev []bme280_dev) int8_t {
var rslt int8_t
var reg_data []uint8_t = make([]uint8_t, 8, 8)
var uncomp_data bme280_uncomp_data
rslt = null_ptr_check(dev)
if (rslt == noarch.IntToInt8_t(0)) && (comp_data != nil) {
rslt = bme280_get_regs(noarch.IntToUint8_t(247), reg_data, noarch.IntToUint16_t(8), dev)
if rslt == noarch.IntToInt8_t(0) {
parse_sensor_data(reg_data, (*[1]bme280_uncomp_data)(unsafe.Pointer(&uncomp_data))[:])
rslt = compensate_data(sensor_comp, (*[1]bme280_uncomp_data)(unsafe.Pointer(&uncomp_data))[:], comp_data, (*[1]bme280_calib_data)(unsafe.Pointer(&dev[0].calib_data))[:])
}
} else {
rslt = noarch.IntToInt8_t(-1)
}
return rslt
}
func set_osr_settings(desired_settings uint8_t, settings []bme280_settings, dev []bme280_dev) int8_t {
var rslt int8_t = noarch.IntToInt8_t(1)
if noarch.Uint8_tToBool(desired_settings & (1 << uint64(2))) {
rslt = set_osr_humidity_settings(settings, dev)
}
if noarch.Uint8_tToBool(desired_settings & (1 | 1<<uint64(1))) {
rslt = set_osr_press_temp_settings(desired_settings, settings, dev)
}
return rslt
}
func set_osr_humidity_settings(settings []bme280_settings, dev []bme280_dev) int8_t {
var rslt int8_t
var ctrl_hum uint8_t
var ctrl_meas uint8_t
var reg_addr uint8_t = noarch.IntToUint8_t(242)
ctrl_hum = noarch.ByteSliceToUint8_t(settings[0].osr_h&7)
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(&reg_addr))[:], (*[1]uint8_t)(unsafe.Pointer(&ctrl_hum))[:], noarch.IntToUint8_t(1), dev)
if rslt == noarch.IntToInt8_t(0) {
reg_addr = noarch.IntToUint8_t(244)
rslt = bme280_get_regs(reg_addr, (*[1]uint8_t)(unsafe.Pointer(&ctrl_meas))[:], noarch.IntToUint16_t(1), dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(&reg_addr))[:], (*[1]uint8_t)(unsafe.Pointer(&ctrl_meas))[:], noarch.IntToUint8_t(1), dev)
}
}
return rslt
}
func set_osr_press_temp_settings(desired_settings uint8_t, settings []bme280_settings, dev []bme280_dev) int8_t {
var rslt int8_t
var reg_addr uint8_t = noarch.IntToUint8_t(244)
var reg_data uint8_t
rslt = bme280_get_regs(reg_addr, (*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], noarch.IntToUint16_t(1), dev)
if rslt == noarch.IntToInt8_t(0) {
if noarch.Uint8_tToBool(desired_settings & 1) {
fill_osr_press_settings((*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], settings)
}
if noarch.Uint8_tToBool(desired_settings & (1 << uint64(1))) {
fill_osr_temp_settings((*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], settings)
}
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(&reg_addr))[:], (*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], noarch.IntToUint8_t(1), dev)
}
return rslt
}
func set_filter_standby_settings(desired_settings uint8_t, settings []bme280_settings, dev []bme280_dev) int8_t {
var rslt int8_t
var reg_addr uint8_t = noarch.IntToUint8_t(245)
var reg_data uint8_t
rslt = bme280_get_regs(reg_addr, (*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], noarch.IntToUint16_t(1), dev)
if rslt == noarch.IntToInt8_t(0) {
if noarch.Uint8_tToBool(desired_settings & (1 << uint64(3))) {
fill_filter_settings((*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], settings)
}
if noarch.Uint8_tToBool(desired_settings & (1 << uint64(4))) {
fill_standby_settings((*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], settings)
}
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(&reg_addr))[:], (*[1]uint8_t)(unsafe.Pointer(&reg_data))[:], noarch.IntToUint8_t(1), dev)
}
return rslt
}
func fill_filter_settings(reg_data []uint8_t, settings []bme280_settings) {
reg_data[0] = ((reg_data[0] & ^(28)) | ((settings[0].filter << uint64(2)) & 28))
}
func fill_standby_settings(reg_data []uint8_t, settings []bme280_settings) {
reg_data[0] = ((reg_data[0] & ^(224)) | ((settings[0].standby_time << uint64(5)) & 224))
}
func fill_osr_press_settings(reg_data []uint8_t, settings []bme280_settings) {
reg_data[0] = ((reg_data[0] & ^(28)) | ((settings[0].osr_p << uint64(2)) & 28))
}
func fill_osr_temp_settings(reg_data []uint8_t, settings []bme280_settings) {
reg_data[0] = ((reg_data[0] & ^(224)) | ((settings[0].osr_t << uint64(5)) & 224))
}
func parse_device_settings(reg_data []uint8_t, settings []bme280_settings) {
settings[0].osr_h = (reg_data[0] & (7))
settings[0].osr_p = ((reg_data[2] & (28)) >> uint64((2)))
settings[0].osr_t = ((reg_data[2] & (224)) >> uint64((5)))
settings[0].filter = ((reg_data[3] & (28)) >> uint64((2)))
settings[0].standby_time = ((reg_data[3] & (224)) >> uint64((5)))
}
func write_power_mode(sensor_mode uint8_t, dev []bme280_dev) int8_t {
var rslt int8_t
var reg_addr uint8_t = noarch.IntToUint8_t(244)
var sensor_mode_reg_val uint8_t
rslt = bme280_get_regs(reg_addr, (*[1]uint8_t)(unsafe.Pointer(&sensor_mode_reg_val))[:], noarch.IntToUint16_t(1), dev)
if rslt == noarch.IntToInt8_t(0) {
sensor_mode_reg_val = ((sensor_mode_reg_val & ^(3)) | (sensor_mode & 3))
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(&reg_addr))[:], (*[1]uint8_t)(unsafe.Pointer(&sensor_mode_reg_val))[:], noarch.IntToUint8_t(1), dev)
}
return rslt
}
func put_device_to_sleep(dev []bme280_dev) int8_t {
var rslt int8_t
var reg_data []uint8_t = make([]uint8_t, 4, 4)
var settings bme280_settings
rslt = bme280_get_regs(noarch.IntToUint8_t(242), reg_data, noarch.IntToUint16_t(4), dev)
if rslt == noarch.IntToInt8_t(0) {
parse_device_settings(reg_data, (*[1]bme280_settings)(unsafe.Pointer(&settings))[:])
rslt = bme280_soft_reset(dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = reload_device_settings((*[1]bme280_settings)(unsafe.Pointer(&settings))[:], dev)
}
}
return rslt
}
func reload_device_settings(settings []bme280_settings, dev []bme280_dev) int8_t {
var rslt int8_t
rslt = set_osr_settings(noarch.IntToUint8_t(31), settings, dev)
if rslt == noarch.IntToInt8_t(0) {
rslt = set_filter_standby_settings(noarch.IntToUint8_t(31), settings, dev)
}
return rslt
}
func parse_sensor_data(reg_data []uint8_t, uncomp_data []bme280_uncomp_data) {
var data_xlsb uint32_t
var data_lsb uint32_t
var data_msb uint32_t
data_msb = noarch.Uint8_tToUint32_t(reg_data[0]<<uint64(12))
data_lsb = noarch.Uint8_tToUint32_t(reg_data[1]<<uint64(4))
data_xlsb = noarch.Uint8_tToUint32_t(reg_data[2]>>uint64(4))
uncomp_data[0].pressure = data_msb|data_lsb|data_xlsb
data_msb = noarch.Uint8_tToUint32_t(reg_data[3]<<uint64(12))
data_lsb = noarch.Uint8_tToUint32_t(reg_data[4]<<uint64(4))
data_xlsb = noarch.Uint8_tToUint32_t(reg_data[5]>>uint64(4))
uncomp_data[0].temperature = data_msb|data_lsb|data_xlsb
data_lsb = noarch.Uint8_tToUint32_t(reg_data[6]<<uint64(8))
data_msb = noarch.Uint8_tToUint32_t(reg_data[7])
uncomp_data[0].humidity = data_msb|data_lsb
}
func compensate_data(sensor_comp uint8_t, uncomp_data []bme280_uncomp_data, comp_data []bme280_data, calib_data []bme280_calib_data) int8_t {
var rslt int8_t = noarch.IntToInt8_t(0)
if (uncomp_data != nil) && (comp_data != nil) && (calib_data != nil) {
comp_data[0].temperature = noarch.IntToInt32_t(0)
comp_data[0].pressure = noarch.IntToUint32_t(0)
comp_data[0].humidity = noarch.IntToUint32_t(0)
if noarch.Uint8_tToBool(sensor_comp & (1 | 1<<uint64(1) | 1<<uint64(2))) {
comp_data[0].temperature = compensate_temperature(uncomp_data, calib_data)
}
if noarch.Uint8_tToBool(sensor_comp & 1) {
comp_data[0].pressure = compensate_pressure(uncomp_data, calib_data)
}
if noarch.Uint8_tToBool(sensor_comp & (1 << uint64(2))) {
comp_data[0].humidity = compensate_humidity(uncomp_data, calib_data)
}
} else {
rslt = noarch.IntToInt8_t(-1)
}
return rslt
}
func compensate_temperature(uncomp_data []bme280_uncomp_data, calib_data []bme280_calib_data) int32_t {
var var1 int32_t
var var2 int32_t
var temperature int32_t
var temperature_min int32_t = noarch.IntToInt32_t(-4000)
var temperature_max int32_t = noarch.IntToInt32_t(8500)
var1 = noarch.ByteSliceToInt32_t(((uncomp_data[0].temperature / 8) - (calib_data[0].dig_T1 * 2)))
var1 = (var1*(calib_data[0].dig_T2))/2048
var2 = noarch.ByteSliceToInt32_t(((uncomp_data[0].temperature / 16) - (calib_data[0].dig_T1)))
var2 = (((var2*var2)/4096)*(calib_data[0].dig_T3))/16384
calib_data[0].t_fine = var1+var2
temperature = (calib_data[0].t_fine*5+128)/256
if temperature < temperature_min {
temperature = temperature_min
} else {
if temperature > temperature_max {
temperature = temperature_max
}
}
return temperature
}
func compensate_pressure(uncomp_data []bme280_uncomp_data, calib_data []bme280_calib_data) uint32_t {
var var1 int64_t
var var2 int64_t
var var3 int64_t
var var4 int64_t
var pressure uint32_t
var pressure_min uint32_t = noarch.IntToUint32_t(3000000)
var pressure_max uint32_t = noarch.IntToUint32_t(11000000)
var1 = noarch.ByteSliceToInt64_t((calib_data[0].t_fine)-128000)
var2 = var1*var1*calib_data[0].dig_P6
var2 = var2+((var1*calib_data[0].dig_P5)*131072)
var2 = var2+((calib_data[0].dig_P4)*34359738368)
var1 = ((var1*var1*calib_data[0].dig_P3)/256)+(var1*(calib_data[0].dig_P2)*4096)
var3 = noarch.IntToInt64_t((1)*140737488355328)
var1 = (var3+var1)*(calib_data[0].dig_P1)/8589934592
if var1 != noarch.IntToInt64_t(0) {
var4 = noarch.IntToInt64_t(1048576-uncomp_data[0].pressure)
var4 = (((var4*2147483648)-var2)*3125)/var1
var1 = noarch.ByteSliceToInt64_t(((calib_data[0].dig_P9)*(var4/8192)*(var4/8192))/33554432)
var2 = noarch.ByteSliceToInt64_t(((calib_data[0].dig_P8)*var4)/524288)
var4 = ((var4+var1+var2)/256)+((calib_data[0].dig_P7)*16)
pressure = noarch.Int64_tToUint32_t((((var4 / 2) * 100) / 128))
if pressure < pressure_min {
pressure = pressure_min
} else {
if pressure > pressure_max {
pressure = pressure_max
}
}
} else {
pressure = pressure_min
}
return pressure
}
func compensate_humidity(uncomp_data []bme280_uncomp_data, calib_data []bme280_calib_data) uint32_t {
var var1 int32_t
var var2 int32_t
var var3 int32_t
var var4 int32_t
var var5 int32_t
var humidity uint32_t
var humidity_max uint32_t = noarch.IntToUint32_t(100000)
var1 = noarch.ByteSliceToInt32_t(calib_data[0].t_fine-(76800))
var2 = noarch.ByteSliceToInt32_t((uncomp_data[0].humidity * 16384))
var3 = noarch.ByteSliceToInt32_t(((calib_data[0].dig_H4) * 1048576))
var4 = noarch.ByteSliceToInt32_t((calib_data[0].dig_H5)*var1)
var5 = (((var2-var3)-var4)+16384)/32768
var2 = (var1*(calib_data[0].dig_H6))/1024
var3 = (var1*(calib_data[0].dig_H3))/2048
var4 = ((var2*(var3+32768))/1024)+2097152
var2 = ((var4*(calib_data[0].dig_H2))+8192)/16384
var3 = var5*var2
var4 = ((var3/32768)*(var3/32768))/128
var5 = var3-((var4*(calib_data[0].dig_H1))/16)
var5 = (func() int32_t {
if var5 < 0 {
return noarch.IntToInt32_t(0)
} else {
return var5
}
}())
var5 = (func() int32_t {
if var5 > 419430400 {
return noarch.IntToInt32_t(419430400)
} else {
return var5
}
}())
humidity = noarch.Int32_tToUint32_t((var5 / 4096))
if humidity > humidity_max {
humidity = humidity_max
}
return humidity
}
func get_calib_data(dev []bme280_dev) int8_t {
var rslt int8_t
var reg_addr uint8_t = noarch.IntToUint8_t(136)
var calib_data []uint8_t = make([]uint8_t, 26, 26)
rslt = bme280_get_regs(reg_addr, calib_data, noarch.IntToUint16_t(26), dev)
if rslt == noarch.IntToInt8_t(0) {
parse_temp_press_calib_data(calib_data, dev)
reg_addr = noarch.IntToUint8_t(225)
rslt = bme280_get_regs(reg_addr, calib_data, noarch.IntToUint16_t(7), dev)
if rslt == noarch.IntToInt8_t(0) {
parse_humidity_calib_data(calib_data, dev)
}
}
return rslt
}
func interleave_reg_addr(reg_addr []uint8_t, temp_buff []uint8_t, reg_data []uint8_t, len uint8_t) {
var index uint8_t
for index = noarch.IntToUint8_t(1); index < len; func() uint8_t {
index += 1
return index
}() {
temp_buff[(index*2)-1] = reg_addr[index]
temp_buff[index*2] = reg_data[index]
}
}
func parse_temp_press_calib_data(reg_data []uint8_t, dev []bme280_dev) {
var calib_data []bme280_calib_data = (*[1]bme280_calib_data)(unsafe.Pointer(&dev[0].calib_data))[:]
calib_data[0].dig_T1 = noarch.Uint8_tToUint16_t(((reg_data[1] << uint64(8)) | reg_data[0]))
calib_data[0].dig_T2 = noarch.Uint8_tToInt16_t(((reg_data[3] << uint64(8)) | reg_data[2]))
calib_data[0].dig_T3 = noarch.Uint8_tToInt16_t(((reg_data[5] << uint64(8)) | reg_data[4]))
calib_data[0].dig_P1 = noarch.Uint8_tToUint16_t(((reg_data[7] << uint64(8)) | reg_data[6]))
calib_data[0].dig_P2 = noarch.Uint8_tToInt16_t(((reg_data[9] << uint64(8)) | reg_data[8]))
calib_data[0].dig_P3 = noarch.Uint8_tToInt16_t(((reg_data[11] << uint64(8)) | reg_data[10]))
calib_data[0].dig_P4 = noarch.Uint8_tToInt16_t(((reg_data[13] << uint64(8)) | reg_data[12]))
calib_data[0].dig_P5 = noarch.Uint8_tToInt16_t(((reg_data[15] << uint64(8)) | reg_data[14]))
calib_data[0].dig_P6 = noarch.Uint8_tToInt16_t(((reg_data[17] << uint64(8)) | reg_data[16]))
calib_data[0].dig_P7 = noarch.Uint8_tToInt16_t(((reg_data[19] << uint64(8)) | reg_data[18]))
calib_data[0].dig_P8 = noarch.Uint8_tToInt16_t(((reg_data[21] << uint64(8)) | reg_data[20]))
calib_data[0].dig_P9 = noarch.Uint8_tToInt16_t(((reg_data[23] << uint64(8)) | reg_data[22]))
calib_data[0].dig_H1 = reg_data[25]
}
func parse_humidity_calib_data(reg_data []uint8_t, dev []bme280_dev) {
var calib_data []bme280_calib_data = (*[1]bme280_calib_data)(unsafe.Pointer(&dev[0].calib_data))[:]
var dig_H4_lsb int16_t
var dig_H4_msb int16_t
var dig_H5_lsb int16_t
var dig_H5_msb int16_t
calib_data[0].dig_H2 = noarch.Uint8_tToInt16_t(((reg_data[1] << uint64(8)) | reg_data[0]))
calib_data[0].dig_H3 = reg_data[2]
dig_H4_msb = noarch.Uint8_tToInt16_t(reg_data[3]*16)
dig_H4_lsb = noarch.Uint8_tToInt16_t((reg_data[4] & 15))
calib_data[0].dig_H4 = dig_H4_msb|dig_H4_lsb
dig_H5_msb = noarch.Uint8_tToInt16_t(reg_data[5]*16)
dig_H5_lsb = noarch.Uint8_tToInt16_t((reg_data[4] >> uint64(4)))
calib_data[0].dig_H5 = dig_H5_msb|dig_H5_lsb
calib_data[0].dig_H6 = noarch.Uint8_tToInt8_t(reg_data[6])
}
func are_settings_changed(sub_settings uint8_t, desired_settings uint8_t) uint8_t {
var settings_changed uint8_t = noarch.IntToUint8_t(0)
if noarch.Uint8_tToBool(sub_settings & desired_settings) {
settings_changed = noarch.IntToUint8_t(1)
} else {
settings_changed = noarch.IntToUint8_t(0)
}
return settings_changed
}
func null_ptr_check(dev []bme280_dev) int8_t {
var rslt int8_t
if (dev == nil) || (dev[0].read == nil) || (dev[0].write == nil) || (dev[0].delay_ms == nil) {
rslt = noarch.IntToInt8_t(-1)
} else {
rslt = noarch.IntToInt8_t(0)
}
return rslt
}
func TestApp(t *testing.T) {
os.Chdir("../../..")
ioutil.WriteFile("build/stdin", []byte{'7'}, 0777)
stdin, _ := os.Open("build/stdin")
noarch.Stdin = noarch.NewFile(stdin)
main()
}
func __init() {
stdin = noarch.Stdin
stdout = noarch.Stdout
stderr = noarch.Stderr
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment