mini-beieli-lorahandler/calibration.go

126 lines
4.7 KiB
Go

package main
import (
"fmt"
"log"
"time"
"math"
"strings"
"strconv"
"io/ioutil"
"net/http"
)
const api_url="https://proxy1.lpn.swisscom.ch/thingpark/lrc/rest"
func MakePost(url string) {
req, err := http.NewRequest("POST", url, nil)
if err != nil {
log.Fatal("Error reading request. ", err)
}
// Set headers
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
// Set client timeout
client := &http.Client{Timeout: time.Second * 10}
// Send request
resp, err := client.Do(req)
if err != nil {
log.Fatal("Error reading response. ", err)
}
defer resp.Body.Close()
fmt.Println("response Status:", resp.Status)
fmt.Println("response Headers:", resp.Header)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("Error reading body. ", err)
}
fmt.Printf("%s\n", body)
}
func ResetNodeToZero(deveui string, w1_0 int32, w2_0 int32) {
fmt.Printf("Called ResetNodeToZero for deveui %s\n", deveui)
s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=00", api_url, deveui)
MakePost(s)
// values should be taken from next packet...
SetDownlinkCommand(deveui,"update_cal_from_node")
}
func CalibrateScale(deveui string, downlink_command string, w1 int32, w2 int32) {
fmt.Printf("Called CalibrateScale for deveui %s, downlink_command: %s\n", deveui, downlink_command)
var cur_cal_settings CalSettings
cur_cal_settings = GetCurrentCalibrationSettings(deveui)
var calibration_weight_gram int32
var calibration_weight2_gram int32
tokens := strings.Split(downlink_command," ")
if (len(tokens) < 2) {
// no value in gram included!
fmt.Printf("Error: invalid downlink_command: %s, examples: \"tare_a 10000\", \"tare_b 10000\", \"tare 10000 10000\" devuid: %s\n", downlink_command, deveui)
return
}
n, err := strconv.ParseInt(tokens[1], 10, 32)
if err == nil {
calibration_weight_gram = int32(n)
} else {
fmt.Printf("Error: cannot get tare weight in gram: %s, deveui: %s\n", downlink_command, deveui)
return
}
if (len(tokens) > 2) {
n, err := strconv.ParseInt(tokens[2], 10, 32)
if err == nil {
calibration_weight2_gram = int32(n)
} else {
fmt.Printf("Error: cannot get tare weight2 in gram: %s, deveui: %s\n", downlink_command, deveui)
return
}
}
if (tokens[0] == "tare_a") {
new_w1_c := float32(w1 - cur_cal_settings.w1_0) / float32(calibration_weight_gram)
valstr := fmt.Sprintf("%08X%08X%08X%08X",uint32(cur_cal_settings.w1_0),uint32(cur_cal_settings.w2_0),math.Float32bits(new_w1_c),math.Float32bits(cur_cal_settings.w2_c))
s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=01%s", api_url, deveui, valstr)
MakePost(s)
} else if (tokens[0] == "tare_b") {
new_w2_c := float32(w2 - cur_cal_settings.w2_0) / float32(calibration_weight_gram)
valstr := fmt.Sprintf("%08X%08X%08X%08X",uint32(cur_cal_settings.w1_0),uint32(cur_cal_settings.w2_0),math.Float32bits(cur_cal_settings.w2_c),math.Float32bits(new_w2_c))
s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=01%s", api_url, deveui, valstr)
MakePost(s)
} else if (tokens[0] == "tare") {
new_w1_c := float32(w1 - cur_cal_settings.w1_0) / float32(calibration_weight_gram)
new_w2_c := float32(w2 - cur_cal_settings.w2_0) / float32(calibration_weight2_gram)
valstr := fmt.Sprintf("%08X%08X%08X%08X",uint32(cur_cal_settings.w1_0),uint32(cur_cal_settings.w2_0),math.Float32bits(new_w1_c),math.Float32bits(new_w2_c))
s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=01%s", api_url, deveui, valstr)
MakePost(s)
} else {
fmt.Printf("Error: either use tare_a or tare_b or tare; deveui %s\n", deveui)
}
SetDownlinkCommand(deveui,"update_cal_from_node")
}
func UpdateNodeCalibrationSettings(deveui string) {
fmt.Printf("Called UpdateNodeCalibrationSettings for deveui %s\n", deveui)
var cur_cal_settings CalSettings
cur_cal_settings = GetCurrentCalibrationSettings(deveui)
valstr := fmt.Sprintf("%08X%08X%08X%08X",uint32(cur_cal_settings.w1_0),uint32(cur_cal_settings.w2_0),math.Float32bits(cur_cal_settings.w1_c),math.Float32bits(cur_cal_settings.w2_c))
s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=01%s", api_url, deveui, valstr)
MakePost(s)
}
func UpdateCalibrationSettingsFromNode(deveui string, w1_0 int32, w2_0 int32, w1_c float32, w2_c float32) {
fmt.Printf("Called UpdateCalibrationSettingsFromNode for deveui %s\n", deveui)
var new_cal_settings CalSettings
new_cal_settings.w1_0 = w1_0
new_cal_settings.w2_0 = w2_0
new_cal_settings.w1_c = w1_c
new_cal_settings.w2_c = w2_c
SetCurrentCalibrationSettings(deveui,new_cal_settings)
SetDownlinkCommand(deveui,"do_nothing")
}