Giter Site home page Giter Site logo

Comments (37)

xlab avatar xlab commented on July 17, 2024 1

@happierall I added a bugfix into c-for-go, please update. The missing functions like UA_Client_readValueAttribute would appear in the result.

Also I suggest you to avoid lower in camel-case libraries like this one, try generating with my version of manifest, the results will be much more readable:

TRANSLATOR:
  ConstRules:
    defines: expand
    enum: expand

  PtrTips:
    function:
      - {target: ^UA_, tips: [ref,ref,ref]}

  Rules:
    global:
      - {action: accept, from: "^UA_"}
      - {action: replace, from: "(i?)^UA_", to: _}
      - {transform: export}
    function:
      - {action: ignore, from: "EndpointUrl_split"}
    const:
      - {action: ignore, from: "INT64_MIN"}
      - {action: ignore, from: "INT64_MAX"}
      - {action: ignore, from: "UINT64_MIN"}
      - {action: ignore, from: "UINT64_MAX"}
      - {action: ignore, from: "LOGLEVEL"}

    type:
      - {action: replace, from: "_t$"}

    private:
      - {transform: unexport}

    post-global:
      - {action: doc, from: "^UA_u?int[0-9]+_t"} # types like ogg_uint32_t
      - {action: replace, from: _$}
      - {load: snakecase}

from c-for-go.

cznic avatar cznic commented on July 17, 2024

The error means that stdbool.h was not found in any of the include directories specified in the yaml configuration file. You have to find where your system has that include file and use that path in the list of include paths. Or maybe try using the host configuration using -ccdefs

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Solved by add:

typedef int bool;
#define true 1
#define false 0

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

But I have new errors:

open62541.h:1654:5: undefined: __builtin_object_size
open62541.h:1654:5: undefined: __builtin___memset_chk
open62541.h:1654:5: called object is not a function or function pointer (have '')
open62541.h:1654:5: called object is not a function or function pointer (have '')
open62541.h:5162:5: undefined: __builtin_object_size
open62541.h:5162:5: undefined: __builtin___memset_chk
open62541.h:5162:5: called object is not a function or function pointer (have '')
open62541.h:5162:5: called object is not a function or function pointer (have '')
open62541.h:5187:5: undefined: __builtin_object_size
open62541.h:5187:5: undefined: __builtin___memset_chk
too many errors

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall seems that the code relies on built-in functions we don't have. You can override or disable any macro or built-in reference (this is documented briefly). For this particular case use the following:

PARSER:
  Defines:
    __builtin___memset_chk: {}
    __builtin_object_size: {}

After that the errors went away. Also, I've fixed an unrelated bug in c-for-go, please update. In your manifest try using expand rather than eval for defines / enums. This will improve the readability of results!

TRANSLATOR:
  ConstRules:
    defines: expand
    enum: expand

Final note. The only problem I got is that the header defines an UInt value using Int64 type, the Go side reports a const overflow. You'd better ignore that single const (use YAML/ RE rules):

	// Uint64Max as defined in ua/open62541.h:664
	Uint64Max = (Int64)(18446744073709551615)

Happy hacking!

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Thank you. It's work. But now out lib haven't functions like UA_Client_readValueAttribute :(

ua.yml

---
GENERATOR:
  PackageName: ua
  PackageDescription: "Package ua provides Go bindings for open62541"
  PackageLicense: "THE AUTOGENERATED LICENSE. ALL THE RIGHTS ARE RESERVED BY ROBOTS."
  Includes: ["open62541.h"]

PARSER:
  IncludePaths: ["/usr/local/include", "/usr/include"]
  SourcesPaths: ["open62541.h"]
  Defines:
    __builtin___memset_chk: {}
    __builtin_object_size: {}

TRANSLATOR:
  ConstRules:
    defines: expand
    enum: expand

  PtrTips:
    function:
      - {target: ^Ua_, tips: [ref,ref,ref]}

  Rules:
    global:
      - {transform: lower}
      - {action: accept, from: "^UA_"}
      - {action: replace, from: "^Ua_", to: _}
      - {transform: export}

    function:
      - {action: accept, from: "^UA"}
      - {action: replace, from: "^Ua"}
      - {action: ignore, from: "UA_EndpointUrl_split"}

    const:
      - {action: accept, from: "^UA_"}
      - {action: replace, from: "^Ua"}
      - {action: ignore, from: "UA_INT64_MIN"}
      - {action: ignore, from: "UA_INT64_MAX"}
      - {action: ignore, from: "UA_UINT64_MIN"}
      - {action: ignore, from: "UA_UINT64_MAX"}
      - {action: ignore, from: "UA_LOGLEVEL"}

    type:
      - {action: replace, from: "_t$"}
      - {action: replace, from: "^Ua"}

    private:
      - {transform: unexport}

    post-global:
      - {action: doc, from: "^Ua_u?int[0-9]+_t"} # types like ogg_uint32_t
      - {action: replace, from: _$}
      - {load: snakecase}

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

I'm trying write simple code by tutorial

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall you're doing everything right there.

  1. I know the root of issue with functions like UA_Client_readValueAttribute and will fix them tomorrow (no time today).

Can you help with generating bindings for Golang? #967

Ha ha they won't be able to help.

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

With your config some errors:

  1. StatusCodeDescription redeclared

  2. Unresolved type 'Size'

  3. In function 'ByteCopy', unpackPByteString(src): Cannot use src (type *Byte) as type string

  4. In function 'SByteCopy', unpackPSByteString(src): Cannot use src (type *Byte) as type string

  5. In function 'ClientWriteAccessLevelAttribute', unpackPByteString(newAccessLevel): Cannot use newAccessLevel (type *Byte) as type string

  6. In function 'ClientWriteUserAccessLevelAttribute', unpackPByteString(newUserAccessLevel): Cannot use newUserAccessLevel (type *Byte) as type string

  7. In function 'ClientWriteEventNotifierAttribute', unpackPByteString(newEventNotifier): Cannot use newEventNotifier (type *Byte) as type string

  8. "ua.go:7766:2: unexpected type: ..." Function 'LogStdout', C.UA_Log_Stdout(clevel, ccategory, cmsg)

  9. Undefined symbols for architecture x86_64:

    "_UA_Server_addExternalNamespace", referenced from:
    __cgo_05833af092eb_Cfunc_UA_Server_addExternalNamespace in ua.cgo2.o
    (maybe you meant: __cgo_05833af092eb_Cfunc_UA_Server_addExternalNamespace)
    "_UA_Server_call", referenced from:
    __cgo_05833af092eb_Cfunc_UA_Server_call in ua.cgo2.o
    (maybe you meant: __cgo_05833af092eb_Cfunc_UA_Server_call)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall
Just ignore stuff that doesn't work, especially variadic methods that aren't supported by CGO. Yout can return later and play with tips to make them work.

Undefined symbols for architecture x86_64:

Your header is newer / older than your installed library. Either use appropriate header or ingnore these functions, most users are probably on the older versions anyways.

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

How about this?

/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1117[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1281]: ref7a29fd4.builtin undefined (type *_Ctype_struct_UA_DataType has no field or method builtin)
/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1121[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1287]: ref7a29fd4.fixedSize undefined (type *_Ctype_struct_UA_DataType has no field or method fixedSize)
/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1125[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1293]: ref7a29fd4.overlayable undefined (type *_Ctype_struct_UA_DataType has no field or method overlayable)
/Users/ruslan/Work/playgroundGo/src/ua/cgo_helpers.go:1162[/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb443523625/ua/_cgo/cgo_helpers.cgo1.go:1339]: x.ref7a29fd4.builtin undefined (type *_Ctype_struct_UA_DataType has no field or method builtin)

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall you're using some outdated sources, I managed to eliminate almost all issues from your previous message by getting the latest sources and putting them together

https://github.com/open62541/open62541/releases/download/0.2-rc2/open62541.c
https://github.com/open62541/open62541/releases/download/0.2-rc2/open62541.h

Also, the header has many structs with bitfields and function pointers, so for this library I'd avoid exploring the inner state too much, simply alias types with raw mem tip, and bind only those that are really in use, see example:

  MemTips:
    - {target: "UA_EndpointDescription", self: bind}
    - {target: "UA_Variant", self: bind}
    - {target: "UA_", self: raw}

Also I created this because UA_NumericRangeDimension struct is embedded:

package ua

/*
#include "open62541.h"

typedef struct {
    UA_UInt32 min;
    UA_UInt32 max;
} UA_NumericRangeDimension;
*/
import "C"

type Size C.size_t

type NumericRangeDimension C.UA_NumericRangeDimension

With all that, it compiles fine, having like ~100% functions API coverage.

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Try compile this:

package main

import (
	"fmt"
	"ua"
)

func main() {
	client := ua.ClientNew(ua.ClientConfigStandard)
	retval := ua.ClientConnect(client, "opc.tcp://localhost:4840")
	if retval != ua.STATUSCODEGOOD {
		ua.ClientDelete(client)
		fmt.Printf("Can't connect. Statuc code: %d", retval)
	}

	var value ua.Variant

	nodeID := ua.NODEIDNUMERIC(0, ua.NS0IDSERVERSERVERSTATUSCURRENTTIME)

	retval = ua.ClientReadValueAttribute(client, nodeID, &value)

	if retval == ua.STATUSCODEGOOD && ua.VariantHasScalarType(&value, &ua.TYPES[ua.TYPESDATETIME]) == ua.Boolean(1) {
		var rawDate ua.DateTime = (ua.DateTime)(value.Data)

		stringDate := ua.DateTimeToString(rawDate)
		fmt.Println(string(stringDate.Data))

		ua.StringDeleteMembers(&stringDate)
	}

	ua.VariantDeleteMembers(&value)
	ua.ClientDelete(client)
}

from c-for-go.

xlab avatar xlab commented on July 17, 2024
  1. To get around *Byte problems you have to tip it as plain type, also don't forget about PtrTips of function values that are references, not arrays (and vice versa).
  PtrTips:
    function:
      - {target: ^UA_, tips: [ref,ref,ref,ref,ref]}

  TypeTips:
    type:
      - {target: "UA_Byte", self: plain}
      - {target: "UA_SByte", self: plain}
  1. Secondly, in your example UA_Variant_hasScalarType is used, but it isn't present in the current API header, find a replacement

  2. You need to write a simple getter to fetch data from stringDate, the field is not exported from C

stringDate := ua.DateTimeToString(rawDate)
fmt.Println(string(stringDate.Data))
  1. ua.ClientConnect(client, "opc.tcp://localhost:4840") - you must terminate strings with \x00 otherwise you're passing non-NULL terminated strings into C, that's extremely bad.

With all above fixed, the example works OK, as far as I could check.

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Are you use Mac OS?
May be you upload your full config, libraries, helpers?
What version compiler do you use?

from c-for-go.

xlab avatar xlab commented on July 17, 2024

ua.zip

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

It can't connect to server :(

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x0]

runtime stack:
runtime.throw(0x41669ff, 0x2a)
/usr/local/go/src/runtime/panic.go:596 +0x95
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:274 +0x2db

goroutine 1 [syscall, locked to thread]:
runtime.cgocall(0x410d120, 0xc42004de40, 0xc42004dea0)
/usr/local/go/src/runtime/cgocall.go:131 +0xe2 fp=0xc42004de10 sp=0xc42004ddd0
ua._Cfunc_UA_Client_connect(0x4700000, 0x4163b6b, 0x0)
/var/folders/4b/rk93zltj53bcknc45j9yyfzh0000gp/T/gb887722252/ua/_cgo/_cgo_gotypes.go:6721 +0x4d fp=0xc42004de40 sp=0xc42004de10
ua.ClientConnect.func1(0x4700000, 0x4163b6b, 0x0)
/Users/ruslan/Work/playgroundGo/src/ua/ua.go:6514 +0x6a fp=0xc42004de78 sp=0xc42004de40
ua.ClientConnect(0x4700000, 0x4163b6b, 0x19, 0x0)
/Users/ruslan/Work/playgroundGo/src/ua/ua.go:6514 +0x49 fp=0xc42004deb0 sp=0xc42004de78
main.main()
/Users/ruslan/Work/playgroundGo/src/client/main.go:12 +0x79 fp=0xc42004df88 sp=0xc42004deb0
runtime.main()
/usr/local/go/src/runtime/proc.go:185 +0x20a fp=0xc42004dfe0 sp=0xc42004df88
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc42004dfe8 sp=0xc42004dfe0

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2197 +0x1

from c-for-go.

xlab avatar xlab commented on July 17, 2024

Show the code please

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024
package main

import (
	"fmt"

	"github.com/happierall/l"
	"ua"
)

func main() {
	client := ua.ClientNew(ua.ClientConfigStandard)
	retval := ua.ClientConnect(client, "opc.tcp://localhost:4840\x00")
	if retval != ua.STATUSCODEGOOD {
		ua.ClientDelete(client)
		fmt.Printf("Can't connect. Statuc code: %d", retval)
	}

	var value ua.Variant

	nodeID := ua.NODEIDNUMERIC(0, ua.NS0IDSERVERSERVERSTATUSCURRENTTIME)

	retval = ua.ClientReadValueAttribute(client, nodeID, &value)

	//if retval == ua.STATUSCODEGOOD && ua.VariantHasScalarType(&value, &ua.TYPES[ua.TYPESDATETIME]) == ua.Boolean(1) {
		l.Log(value.Data)

		//stringDate := ua.DateTimeToString(rawDate)
		//fmt.Println(string(stringDate.Data))

		//ua.StringDeleteMembers(&stringDate)
	//}

	ua.VariantDeleteMembers(&value)
	ua.ClientDelete(client)
}

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

server.c

#include <signal.h>
#include "lib/open62541.h"

UA_Boolean running = true;
static void stopHandler(int sig) {
    running = false;
}

int main(void) {
    signal(SIGINT, stopHandler);
    signal(SIGTERM, stopHandler);

    UA_ServerConfig config = UA_ServerConfig_standard;
    UA_ServerNetworkLayer nl;
    nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 4840);
    config.networkLayers = &nl;
    config.networkLayersSize = 1;
    UA_Server *server = UA_Server_new(config);

    UA_Server_run(server, &running);
    UA_Server_delete(server);
    nl.deleteMembers(&nl);
    return 0;
}

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall
Your code uses wrong config, instead of using empty ua.ClientConfigStandard you should add this into etc.go:

func GetClientConfigStandard() ClientConfig {
	return (ClientConfig)(C.UA_ClientConfig_standard)
}

which will return a handle to static extern variable set to some initialised config. After that your code works, I was able to connect to the server.

P.S. must exit after if retval != ua.STATUSCODEGOOD

from c-for-go.

xlab avatar xlab commented on July 17, 2024

Also use value.Deref() after getting any struct value from C, this will map fields.

value.Deref()
str := ua.DateTimeToString(*(*ua.DateTime)(value.Data))
l.Log(str)

->

2017-02-21 08:05:10 example/main.go:33 -> str=ua.String{
    length: 0x1f,
    data:   &ua._Ctype_UA_Byte(0x30),
}

And final string helper:

func (s String) String() string {
	return string((*[1 << 20]byte)(unsafe.Pointer(s.data))[:s.length])
}

->

2017-02-21 08:07:16 example/main.go:33 -> str.String()=02/21/2017 08:07:16.388.867.000

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

I can't connect)

Can't connect. Statuc code: 2147614720

 func main() {
	config := ua.GetClientConfigStandard()
	client := ua.ClientNew(config)
	retval := ua.ClientConnect(client, "opc.tcp://localhost:4840\x00")
	if retval != ua.STATUSCODEGOOD {
		ua.ClientDelete(client)
		l.Logf("Can't connect. Statuc code: %d", retval)
		return
	}
 }

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall please see my code again
ua_new.zip

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Huh it's work. Thank you!

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

ua.NODEIDSTRING must accept []byte, not *byte

Code

var val ua.Variant
ua.VariantInit(&val)
val.Deref()

nodeID := ua.NODEIDSTRING(0, &([]byte("MyVariable")))

retval = ua.ClientReadValueAttribute(client, nodeID, &val)

example usage in C

UPDATE.
May be string, not []byte

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Full Code

client.go:

package main

import (
	"fmt"
	"runtime"

	"github.com/happierall/l"
	"ua"
)

func main() {
	l.Default.Production = true

	runtime.LockOSThread()
	defer runtime.UnlockOSThread()

	client := ua.ClientNew(ua.GetClientConfigStandard())
	retval := ua.ClientConnect(client, "opc.tcp://0.0.0.0:4840\x00")
	//retval := ua.ClientConnect(client, "opc.tcp://opcuaserver.com:4841/freeopcua/server\x00")
	if retval != ua.STATUSCODEGOOD {
		ua.ClientDelete(client)
		fmt.Printf("Can't connect. Statuc code: %d", retval)
		return
	}

	var value ua.Variant
	ua.VariantInit(&value)
	value.Deref()

	nodeID := ua.NODEIDNUMERIC(0, ua.NS0IDSERVERSERVERSTATUSCURRENTTIME)

	retval = ua.ClientReadValueAttribute(client, nodeID, &value)
	value.Deref()

	//if retval == ua.STATUSCODEGOOD && ua.VariantHasScalarType(&value, &ua.TYPES[ua.TYPESDATETIME]) == ua.Boolean(1) {
	str := ua.DateTimeToString(*(*ua.DateTime)(value.Data))
	l.Log(str.String())
	ua.StringDeleteMembers(&str)
	//}

	var val ua.Variant
	ua.VariantInit(&val)
	val.Deref()

	nodeID2 := ua.NODEIDSTRING(1, "the.answer\x00")
	retval = ua.ClientReadValueAttribute(client, nodeID2, &val)
	val.Deref()

	if retval == ua.STATUSCODEGOOD {
		l.Log("success", retval)

		resultInt32 := *(*ua.Int32)(value.Data)
		l.Log(int(resultInt32))
	} else {
		l.Log("error", retval)
	}

	ua.VariantDeleteMembers(&value)
	ua.ClientDelete(client)
}

server.c

    #include <signal.h>
    #include "open62541.h"

    UA_Boolean running = true;
    static void stopHandler(int sig) {
        running = false;
    }

    int main(void) {
        signal(SIGINT, stopHandler);
        signal(SIGTERM, stopHandler);

        UA_ServerConfig config = UA_ServerConfig_standard;
        UA_ServerNetworkLayer nl;
        nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 4840);
        config.networkLayers = &nl;
        config.networkLayersSize = 1;
        UA_Server *server = UA_Server_new(config);


        /* add a static variable node to the server */
        UA_VariableAttributes myVar;
        UA_VariableAttributes_init(&myVar);
        myVar.description = UA_LOCALIZEDTEXT("en_US", "the answer");
        myVar.displayName = UA_LOCALIZEDTEXT("en_US", "the answer");
        myVar.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
        UA_Int32 myInteger = 42;
        UA_Variant_setScalarCopy(&myVar.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
        const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
        const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
        UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
        UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
        UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId,
            myIntegerName, UA_NODEID_NULL, myVar, NULL, NULL);
        UA_Variant_deleteMembers(&myVar.value);


        UA_Server_run(server, &running);
        UA_Server_delete(server);
        nl.deleteMembers(&nl);
        return 0;
    }

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

If change by hand to string, then request is work.
But

	resultInt32 := *(*ua.Int32)(value.Data)
	l.Log(int(resultInt32))

give not 42

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall nice progress!

  1. Do not edit generated code by hand, check out the docs on PtrTips https://github.com/xlab/c-for-go/wiki/Translator-config-section and use arr instead of ref tip.

resultInt32 := *(*ua.Int32)(value.Data)
	l.Log(int(resultInt32))

looks like a typo, shouldn't be val.Data? Anyway, organize your code, it's hard to understand when and what you're Deref'ing.

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

It's work. I understand about Ptr, thank you.
You are great man.

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

I'm trying make subscription, but all functions doesn't exists.

  1. UA_Client_Subscriptions_new (function)
  2. UA_SubscriptionSettings_standard (const or struct)
  3. UA_Client_Subscriptions_addMonitoredItem (function)
  4. UA_Client_Subscriptions_manuallySendPublishRequest (function)

from c-for-go.

xlab avatar xlab commented on July 17, 2024

@happierall always check the the source. In header file you have

#ifdef UA_ENABLE_SUBSCRIPTIONS

which should be enabled in generator yaml manifest, also in your CFLAGS when compiling (use #cgo directives, example)

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Added FlagGroups, but functions still doesn't exists

GENERATOR:
  PackageName: ua
  PackageDescription: "Package ua provides Go bindings for open62541"
  PackageLicense: "THE AUTOGENERATED LICENSE. ALL THE RIGHTS ARE RESERVED BY ROBOTS."
  Includes: ["open62541.h"]
  FlagGroups:
    - {name: "CFLAGS", flags: [
        "-UA_ENABLE_SUBSCRIPTIONS",
    ]}

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Ah, I'm understand. Added to Parser.Defines too

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Hm, but can't build...

could not determine kind of name for C.UA_MonitoredItemHandlingFunction
could not determine kind of name for C.UA_SubscriptionSettings

from c-for-go.

xlab avatar xlab commented on July 17, 2024
    - {name: "CFLAGS", flags: [
        "-DUA_ENABLE_SUBSCRIPTIONS",
    ]}

from c-for-go.

ianberdin avatar ianberdin commented on July 17, 2024

Magic, thanks :)

from c-for-go.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.