Created
September 21, 2017 18:00
-
-
Save fuzzy/1d5b5bdb7fc99b6a6dca6b87123b77d0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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(®_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(®_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(®_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(®_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(®_data))[:], settings) | |
} | |
if noarch.Uint8_tToBool(desired_settings & (1 << uint64(1))) { | |
fill_osr_temp_settings((*[1]uint8_t)(unsafe.Pointer(®_data))[:], settings) | |
} | |
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(®_addr))[:], (*[1]uint8_t)(unsafe.Pointer(®_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(®_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(®_data))[:], settings) | |
} | |
if noarch.Uint8_tToBool(desired_settings & (1 << uint64(4))) { | |
fill_standby_settings((*[1]uint8_t)(unsafe.Pointer(®_data))[:], settings) | |
} | |
rslt = bme280_set_regs((*[1]uint8_t)(unsafe.Pointer(®_addr))[:], (*[1]uint8_t)(unsafe.Pointer(®_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(®_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