126 lines
4.7 KiB
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")
|
|
}
|