5k3105/nidaq

How can I drive the ni daq by golang

Opened this issue · 2 comments

Hi, would you like to write an example of how to drive a ni daq by golang via this package?

Hi,

This is what I have:

package main

import (
	"fmt"
	"errors"
	"github.com/influxdata/influxdb/client/v2"
	"local/nidaqmx"
	"strconv"
	"time"
)

/// influxd -config influxdb.conf
/// influx -port 8087

func Nidaq_StartMonitor() {

	task = task + 1

	for {
		err := nidaqmx.SelfTestDevice(safeString(DAQMX_DEVICE_NAME))
		if err == 0 {
			break
		}
		SystemError("Nidaq_StartMonitor", fmt.Sprint(err))
		time.Sleep(10 * time.Second)
	}

	var th nidaqmx.TaskHandle

	nidaqmx.CreateTask(safeString("task"+strconv.Itoa(task)), &th)

	Nidaq_NewDbClient()

	for i, h := range handleNames {
		nidaqmx.CreateAIThrmcplChan(th, safeString(DAQMX_DEVICE_NAME+"Mod1/ai"+strconv.Itoa(i)), safeString(h), -60.0, 100.0, nidaqmx.ValDegC, nidaqmx.ValTTypeTC, nidaqmx.ValBuiltIn, 25.0, safeString(" "))
	}

	for {
		start := nidaqmx.StartTask(th)
		if start < 0 {
			break
		}

		readarray := make([]float64, 16)
		var samplesperchanread int32

		f64 := nidaqmx.ReadAnalogF64(th, 1, 100.0, nidaqmx.ValGroupByScanNumber, readarray, 16, &samplesperchanread, nil)

		if f64 < 0 {
			break
		}

		stop := nidaqmx.StopTask(th)

		if stop < 0 {
			break
		}

		data, err := Nidaq_Parse(readarray)
		if err != nil {
			break
		}
		Nidaq_Send(data)

		Alert_CheckAlerts(data, "[nidaq.thresholds]")

		time.Sleep(2 * time.Second)
	}

	SystemError("Nidaq_StartMonitor", "Nidaq: Attempting Restart in 5 seconds")
	time.Sleep(5 * time.Second)
	Nidaq_StartMonitor()

}

func Nidaq_Parse(readarray []float64) (map[string]interface{}, error) {

	// check for errors: all zero values in readarray
	var err error
	var acc float64

	fields := map[string]interface{}{}

	for i, h := range handleNames {
		fields[h] = readarray[i]
		acc = acc + readarray[i]
	}

	if acc == 0 {
		err = errors.New("nidaq read array empty")
	}

	return fields, err
}

func Nidaq_Send(fields map[string]interface{}) {

	bp, err := client.NewBatchPoints(client.BatchPointsConfig{
		Database:  nidaq_db,
		Precision: "s",
	})

	if err != nil {
		SystemError("Nidaq_Send", err.Error())
	}

	tags := map[string]string{"nidaq": "temp"}

	pt, err := client.NewPoint("nidaq", tags, fields, time.Now())

	if err != nil {
		SystemError("Nidaq_Send", err.Error())
	}

	bp.AddPoint(pt)
	nidaq_dbc.Write(bp)
}

func Nidaq_NewDbClient() {
	var err error

	nidaq_dbc, err = client.NewHTTPClient(client.HTTPConfig{
		Addr:     dbaddress,
		Username: "admin",
		Password: "admin",
	})

	if err != nil {
		SystemError("Nidaq_NewDbClient", err.Error())
	}

}

Thanks a lot, I'll give it a try.