| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- package server
- /*
- #include <stdlib.h>
- struct OpenReply {
- char* message;
- char* context;
- };
- struct DoResponse {
- char* reqName;
- char* RespResult;
- char* retContext;
- };
- int open_device(int devIdx, char* devUri, char* devGroup, void** reply);
- int close_device(int devIdx, char* devUri, char* devGroup, void** reply);
- int device_get(int devIdx, char* devUri, char* devProperty, void** reply);
- int device_set(int devIdx, char* devUri, char* devProperty, char* devValueSet, void** reply);
- int device_update(int devIdx, char* devUri, char* devProperty, char* devValueUpdate, void** reply);
- int device_add(int devIdx, char* devUri, char* devProperty, char* devValueAdd, void** reply);
- int device_del(int devIdx, char* devUri, char* devProperty, char* devValueDel, void** reply);
- int device_action(int devIdx, char* devUri, char* devFunction, char* devReqParams, void** reply);
- int device_message(int devIdx, char* devUri, char* devTopic, char* devMessageValue, void** reply);
- int free_struct(void* pPoirnt, int nItemCount);
- */
- import "C"
- import (
- "context"
- "fmt"
- "sync"
- "unsafe"
- gen "github.com/osguydch/ccosproc/proto/device/v3"
- )
- // DeviceServerImpl will implement the service defined in protocol buffer definitions
- type DeviceServerImpl struct {
- gen.UnimplementedDeviceServer
- mu *sync.RWMutex
- devs map[string]int
- }
- // New initializes a new Backend struct.
- func New(dev []string) *DeviceServerImpl {
- devs := make(map[string]int)
- for i, v := range dev {
- devs[v] = i
- }
- return &DeviceServerImpl{
- mu: &sync.RWMutex{},
- devs: devs,
- }
- }
- // Open is the implementation of RPC call defined in protocol definitions.
- // This will take OpenRequest message and return OpenReply
- func (g *DeviceServerImpl) Open(ctx context.Context, request *gen.OpenRequest) (*gen.OpenReply, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cGroup := C.CString(request.DeviceGroup)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cGroup))
- var openReply unsafe.Pointer
- ret := C.open_device(C.int(idx), cUri, cGroup, &openReply)
- if ret != 2 {
- return &gen.OpenReply{
- Message: fmt.Sprintf("grpc error for open %s", request.DeviceUri),
- RetContext: "Open Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- reply := (*C.struct_OpenReply)(openReply)
- return &gen.OpenReply{
- Message: C.GoString(reply.message),
- RetCode: fmt.Sprintf("%d", ret),
- RetContext: C.GoString(reply.context),
- }, nil
- }
- func (g *DeviceServerImpl) Close(ctx context.Context, request *gen.OpenRequest) (*gen.OpenReply, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cGroup := C.CString(request.DeviceGroup)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cGroup))
- var openReply unsafe.Pointer
- ret := C.close_device(C.int(idx), cUri, cGroup, &openReply)
- if ret != 2 {
- return &gen.OpenReply{
- Message: fmt.Sprintf("grpc error for close %s", request.DeviceUri),
- RetContext: "Close Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- reply := (*C.struct_OpenReply)(openReply)
- return &gen.OpenReply{
- Message: C.GoString(reply.message),
- RetCode: fmt.Sprintf("%d", ret),
- RetContext: C.GoString(reply.context),
- }, nil
- }
- func (g *DeviceServerImpl) Get(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cName := C.CString(request.ReqName)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cName))
- var openReply unsafe.Pointer
- ret := C.device_get(C.int(idx), cUri, cName, &openReply)
- reply := (*C.struct_DoResponse)(openReply)
- if ret != 2 {
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- RetContext: "Get Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- ReqTransaction: request.ReqTransaction,
- RetContext: C.GoString(reply.retContext),
- }, nil
- }
- func (g *DeviceServerImpl) Set(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cName := C.CString(request.ReqName)
- cParam := C.CString(request.ReqParam)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cName))
- defer C.free(unsafe.Pointer(cParam))
- var openReply unsafe.Pointer
- ret := C.device_set(C.int(idx), cUri, cName, cParam, &openReply)
- reply := (*C.struct_DoResponse)(openReply)
- if ret != 2 {
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- RetContext: "Set Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- ReqTransaction: request.ReqTransaction,
- RetContext: C.GoString(reply.retContext),
- }, nil
- }
- func (g *DeviceServerImpl) Update(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cName := C.CString(request.ReqName)
- cParam := C.CString(request.ReqParam)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cName))
- defer C.free(unsafe.Pointer(cParam))
- var openReply unsafe.Pointer
- ret := C.device_update(C.int(idx), cUri, cName, cParam, &openReply)
- reply := (*C.struct_DoResponse)(openReply)
- if ret != 2 {
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- RetContext: "Update Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- ReqTransaction: request.ReqTransaction,
- RetContext: C.GoString(reply.retContext),
- }, nil
- }
- func (g *DeviceServerImpl) Add(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cName := C.CString(request.ReqName)
- cParam := C.CString(request.ReqParam)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cName))
- defer C.free(unsafe.Pointer(cParam))
- var openReply unsafe.Pointer
- ret := C.device_add(C.int(idx), cUri, cName, cParam, &openReply)
- reply := (*C.struct_DoResponse)(openReply)
- if ret != 2 {
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- RetContext: "Add Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- ReqTransaction: request.ReqTransaction,
- RetContext: C.GoString(reply.retContext),
- }, nil
- }
- func (g *DeviceServerImpl) Del(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cName := C.CString(request.ReqName)
- cParam := C.CString(request.ReqParam)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cName))
- defer C.free(unsafe.Pointer(cParam))
- var openReply unsafe.Pointer
- ret := C.device_del(C.int(idx), cUri, cName, cParam, &openReply)
- reply := (*C.struct_DoResponse)(openReply)
- if ret != 2 {
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- RetContext: "Del Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- ReqTransaction: request.ReqTransaction,
- RetContext: C.GoString(reply.retContext),
- }, nil
- }
- func (g *DeviceServerImpl) Action(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cName := C.CString(request.ReqName)
- cParam := C.CString(request.ReqParam)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cName))
- defer C.free(unsafe.Pointer(cParam))
- var openReply unsafe.Pointer
- ret := C.device_action(C.int(idx), cUri, cName, cParam, &openReply)
- reply := (*C.struct_DoResponse)(openReply)
- if ret != 2 {
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- RetContext: "Action Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- ReqTransaction: request.ReqTransaction,
- RetContext: C.GoString(reply.retContext),
- }, nil
- }
- func (g *DeviceServerImpl) Message(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
- g.mu.Lock()
- defer g.mu.Unlock()
- idx := g.devs[request.DeviceUri]
- cUri := C.CString(request.DeviceUri)
- cName := C.CString(request.ReqName)
- cParam := C.CString(request.ReqParam)
- defer C.free(unsafe.Pointer(cUri))
- defer C.free(unsafe.Pointer(cName))
- defer C.free(unsafe.Pointer(cParam))
- var openReply unsafe.Pointer
- ret := C.device_message(C.int(idx), cUri, cName, cParam, &openReply)
- reply := (*C.struct_DoResponse)(openReply)
- if ret != 2 {
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- RetContext: "Message Call Error",
- }, nil
- }
- defer C.free_struct(openReply, C.int(3))
- return &gen.DoResponse{
- DeviceUri: request.DeviceUri,
- RetCode: fmt.Sprintf("%d", ret),
- ReqName: request.ReqName,
- RespResult: C.GoString(reply.RespResult),
- ReqTransaction: request.ReqTransaction,
- RetContext: C.GoString(reply.retContext),
- }, nil
- }
|