server.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. package server
  2. /*
  3. #include <stdlib.h>
  4. struct OpenReply {
  5. char* message;
  6. char* context;
  7. };
  8. struct DoResponse {
  9. char* reqName;
  10. char* RespResult;
  11. char* retContext;
  12. };
  13. int open_device(int devIdx, char* devUri, char* devGroup, void** reply);
  14. int close_device(int devIdx, char* devUri, char* devGroup, void** reply);
  15. int device_get(int devIdx, char* devUri, char* devProperty, void** reply);
  16. int device_set(int devIdx, char* devUri, char* devProperty, char* devValueSet, void** reply);
  17. int device_update(int devIdx, char* devUri, char* devProperty, char* devValueUpdate, void** reply);
  18. int device_add(int devIdx, char* devUri, char* devProperty, char* devValueAdd, void** reply);
  19. int device_del(int devIdx, char* devUri, char* devProperty, char* devValueDel, void** reply);
  20. int device_action(int devIdx, char* devUri, char* devFunction, char* devReqParams, void** reply);
  21. int device_message(int devIdx, char* devUri, char* devTopic, char* devMessageValue, void** reply);
  22. int free_struct(void* pPoirnt, int nItemCount);
  23. */
  24. import "C"
  25. import (
  26. "context"
  27. "fmt"
  28. "sync"
  29. "unsafe"
  30. gen "github.com/osguydch/ccosproc/proto/device/v3"
  31. )
  32. // DeviceServerImpl will implement the service defined in protocol buffer definitions
  33. type DeviceServerImpl struct {
  34. gen.UnimplementedDeviceServer
  35. mu *sync.RWMutex
  36. devs map[string]int
  37. }
  38. // New initializes a new Backend struct.
  39. func New(dev []string) *DeviceServerImpl {
  40. devs := make(map[string]int)
  41. for i, v := range dev {
  42. devs[v] = i
  43. }
  44. return &DeviceServerImpl{
  45. mu: &sync.RWMutex{},
  46. devs: devs,
  47. }
  48. }
  49. // Open is the implementation of RPC call defined in protocol definitions.
  50. // This will take OpenRequest message and return OpenReply
  51. func (g *DeviceServerImpl) Open(ctx context.Context, request *gen.OpenRequest) (*gen.OpenReply, error) {
  52. g.mu.Lock()
  53. defer g.mu.Unlock()
  54. idx := g.devs[request.DeviceUri]
  55. cUri := C.CString(request.DeviceUri)
  56. cGroup := C.CString(request.DeviceGroup)
  57. defer C.free(unsafe.Pointer(cUri))
  58. defer C.free(unsafe.Pointer(cGroup))
  59. var openReply unsafe.Pointer
  60. ret := C.open_device(C.int(idx), cUri, cGroup, &openReply)
  61. if ret != 2 {
  62. return &gen.OpenReply{
  63. Message: fmt.Sprintf("grpc error for open %s", request.DeviceUri),
  64. RetContext: "Open Call Error",
  65. }, nil
  66. }
  67. defer C.free_struct(openReply, C.int(3))
  68. reply := (*C.struct_OpenReply)(openReply)
  69. return &gen.OpenReply{
  70. Message: C.GoString(reply.message),
  71. RetCode: fmt.Sprintf("%d", ret),
  72. RetContext: C.GoString(reply.context),
  73. }, nil
  74. }
  75. func (g *DeviceServerImpl) Close(ctx context.Context, request *gen.OpenRequest) (*gen.OpenReply, error) {
  76. g.mu.Lock()
  77. defer g.mu.Unlock()
  78. idx := g.devs[request.DeviceUri]
  79. cUri := C.CString(request.DeviceUri)
  80. cGroup := C.CString(request.DeviceGroup)
  81. defer C.free(unsafe.Pointer(cUri))
  82. defer C.free(unsafe.Pointer(cGroup))
  83. var openReply unsafe.Pointer
  84. ret := C.close_device(C.int(idx), cUri, cGroup, &openReply)
  85. if ret != 2 {
  86. return &gen.OpenReply{
  87. Message: fmt.Sprintf("grpc error for close %s", request.DeviceUri),
  88. RetContext: "Close Call Error",
  89. }, nil
  90. }
  91. defer C.free_struct(openReply, C.int(3))
  92. reply := (*C.struct_OpenReply)(openReply)
  93. return &gen.OpenReply{
  94. Message: C.GoString(reply.message),
  95. RetCode: fmt.Sprintf("%d", ret),
  96. RetContext: C.GoString(reply.context),
  97. }, nil
  98. }
  99. func (g *DeviceServerImpl) Get(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
  100. g.mu.Lock()
  101. defer g.mu.Unlock()
  102. idx := g.devs[request.DeviceUri]
  103. cUri := C.CString(request.DeviceUri)
  104. cName := C.CString(request.ReqName)
  105. defer C.free(unsafe.Pointer(cUri))
  106. defer C.free(unsafe.Pointer(cName))
  107. var openReply unsafe.Pointer
  108. ret := C.device_get(C.int(idx), cUri, cName, &openReply)
  109. reply := (*C.struct_DoResponse)(openReply)
  110. if ret != 2 {
  111. return &gen.DoResponse{
  112. DeviceUri: request.DeviceUri,
  113. RetCode: fmt.Sprintf("%d", ret),
  114. ReqName: request.ReqName,
  115. RespResult: C.GoString(reply.RespResult),
  116. RetContext: "Get Call Error",
  117. }, nil
  118. }
  119. defer C.free_struct(openReply, C.int(3))
  120. return &gen.DoResponse{
  121. DeviceUri: request.DeviceUri,
  122. RetCode: fmt.Sprintf("%d", ret),
  123. ReqName: request.ReqName,
  124. RespResult: C.GoString(reply.RespResult),
  125. ReqTransaction: request.ReqTransaction,
  126. RetContext: C.GoString(reply.retContext),
  127. }, nil
  128. }
  129. func (g *DeviceServerImpl) Set(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
  130. g.mu.Lock()
  131. defer g.mu.Unlock()
  132. idx := g.devs[request.DeviceUri]
  133. cUri := C.CString(request.DeviceUri)
  134. cName := C.CString(request.ReqName)
  135. cParam := C.CString(request.ReqParam)
  136. defer C.free(unsafe.Pointer(cUri))
  137. defer C.free(unsafe.Pointer(cName))
  138. defer C.free(unsafe.Pointer(cParam))
  139. var openReply unsafe.Pointer
  140. ret := C.device_set(C.int(idx), cUri, cName, cParam, &openReply)
  141. reply := (*C.struct_DoResponse)(openReply)
  142. if ret != 2 {
  143. return &gen.DoResponse{
  144. DeviceUri: request.DeviceUri,
  145. RetCode: fmt.Sprintf("%d", ret),
  146. ReqName: request.ReqName,
  147. RespResult: C.GoString(reply.RespResult),
  148. RetContext: "Set Call Error",
  149. }, nil
  150. }
  151. defer C.free_struct(openReply, C.int(3))
  152. return &gen.DoResponse{
  153. DeviceUri: request.DeviceUri,
  154. RetCode: fmt.Sprintf("%d", ret),
  155. ReqName: request.ReqName,
  156. RespResult: C.GoString(reply.RespResult),
  157. ReqTransaction: request.ReqTransaction,
  158. RetContext: C.GoString(reply.retContext),
  159. }, nil
  160. }
  161. func (g *DeviceServerImpl) Update(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
  162. g.mu.Lock()
  163. defer g.mu.Unlock()
  164. idx := g.devs[request.DeviceUri]
  165. cUri := C.CString(request.DeviceUri)
  166. cName := C.CString(request.ReqName)
  167. cParam := C.CString(request.ReqParam)
  168. defer C.free(unsafe.Pointer(cUri))
  169. defer C.free(unsafe.Pointer(cName))
  170. defer C.free(unsafe.Pointer(cParam))
  171. var openReply unsafe.Pointer
  172. ret := C.device_update(C.int(idx), cUri, cName, cParam, &openReply)
  173. reply := (*C.struct_DoResponse)(openReply)
  174. if ret != 2 {
  175. return &gen.DoResponse{
  176. DeviceUri: request.DeviceUri,
  177. RetCode: fmt.Sprintf("%d", ret),
  178. ReqName: request.ReqName,
  179. RespResult: C.GoString(reply.RespResult),
  180. RetContext: "Update Call Error",
  181. }, nil
  182. }
  183. defer C.free_struct(openReply, C.int(3))
  184. return &gen.DoResponse{
  185. DeviceUri: request.DeviceUri,
  186. RetCode: fmt.Sprintf("%d", ret),
  187. ReqName: request.ReqName,
  188. RespResult: C.GoString(reply.RespResult),
  189. ReqTransaction: request.ReqTransaction,
  190. RetContext: C.GoString(reply.retContext),
  191. }, nil
  192. }
  193. func (g *DeviceServerImpl) Add(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
  194. g.mu.Lock()
  195. defer g.mu.Unlock()
  196. idx := g.devs[request.DeviceUri]
  197. cUri := C.CString(request.DeviceUri)
  198. cName := C.CString(request.ReqName)
  199. cParam := C.CString(request.ReqParam)
  200. defer C.free(unsafe.Pointer(cUri))
  201. defer C.free(unsafe.Pointer(cName))
  202. defer C.free(unsafe.Pointer(cParam))
  203. var openReply unsafe.Pointer
  204. ret := C.device_add(C.int(idx), cUri, cName, cParam, &openReply)
  205. reply := (*C.struct_DoResponse)(openReply)
  206. if ret != 2 {
  207. return &gen.DoResponse{
  208. DeviceUri: request.DeviceUri,
  209. RetCode: fmt.Sprintf("%d", ret),
  210. ReqName: request.ReqName,
  211. RespResult: C.GoString(reply.RespResult),
  212. RetContext: "Add Call Error",
  213. }, nil
  214. }
  215. defer C.free_struct(openReply, C.int(3))
  216. return &gen.DoResponse{
  217. DeviceUri: request.DeviceUri,
  218. RetCode: fmt.Sprintf("%d", ret),
  219. ReqName: request.ReqName,
  220. RespResult: C.GoString(reply.RespResult),
  221. ReqTransaction: request.ReqTransaction,
  222. RetContext: C.GoString(reply.retContext),
  223. }, nil
  224. }
  225. func (g *DeviceServerImpl) Del(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
  226. g.mu.Lock()
  227. defer g.mu.Unlock()
  228. idx := g.devs[request.DeviceUri]
  229. cUri := C.CString(request.DeviceUri)
  230. cName := C.CString(request.ReqName)
  231. cParam := C.CString(request.ReqParam)
  232. defer C.free(unsafe.Pointer(cUri))
  233. defer C.free(unsafe.Pointer(cName))
  234. defer C.free(unsafe.Pointer(cParam))
  235. var openReply unsafe.Pointer
  236. ret := C.device_del(C.int(idx), cUri, cName, cParam, &openReply)
  237. reply := (*C.struct_DoResponse)(openReply)
  238. if ret != 2 {
  239. return &gen.DoResponse{
  240. DeviceUri: request.DeviceUri,
  241. RetCode: fmt.Sprintf("%d", ret),
  242. ReqName: request.ReqName,
  243. RespResult: C.GoString(reply.RespResult),
  244. RetContext: "Del Call Error",
  245. }, nil
  246. }
  247. defer C.free_struct(openReply, C.int(3))
  248. return &gen.DoResponse{
  249. DeviceUri: request.DeviceUri,
  250. RetCode: fmt.Sprintf("%d", ret),
  251. ReqName: request.ReqName,
  252. RespResult: C.GoString(reply.RespResult),
  253. ReqTransaction: request.ReqTransaction,
  254. RetContext: C.GoString(reply.retContext),
  255. }, nil
  256. }
  257. func (g *DeviceServerImpl) Action(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
  258. g.mu.Lock()
  259. defer g.mu.Unlock()
  260. idx := g.devs[request.DeviceUri]
  261. cUri := C.CString(request.DeviceUri)
  262. cName := C.CString(request.ReqName)
  263. cParam := C.CString(request.ReqParam)
  264. defer C.free(unsafe.Pointer(cUri))
  265. defer C.free(unsafe.Pointer(cName))
  266. defer C.free(unsafe.Pointer(cParam))
  267. var openReply unsafe.Pointer
  268. ret := C.device_action(C.int(idx), cUri, cName, cParam, &openReply)
  269. reply := (*C.struct_DoResponse)(openReply)
  270. if ret != 2 {
  271. return &gen.DoResponse{
  272. DeviceUri: request.DeviceUri,
  273. RetCode: fmt.Sprintf("%d", ret),
  274. ReqName: request.ReqName,
  275. RespResult: C.GoString(reply.RespResult),
  276. RetContext: "Action Call Error",
  277. }, nil
  278. }
  279. defer C.free_struct(openReply, C.int(3))
  280. return &gen.DoResponse{
  281. DeviceUri: request.DeviceUri,
  282. RetCode: fmt.Sprintf("%d", ret),
  283. ReqName: request.ReqName,
  284. RespResult: C.GoString(reply.RespResult),
  285. ReqTransaction: request.ReqTransaction,
  286. RetContext: C.GoString(reply.retContext),
  287. }, nil
  288. }
  289. func (g *DeviceServerImpl) Message(ctx context.Context, request *gen.DoRequest) (*gen.DoResponse, error) {
  290. g.mu.Lock()
  291. defer g.mu.Unlock()
  292. idx := g.devs[request.DeviceUri]
  293. cUri := C.CString(request.DeviceUri)
  294. cName := C.CString(request.ReqName)
  295. cParam := C.CString(request.ReqParam)
  296. defer C.free(unsafe.Pointer(cUri))
  297. defer C.free(unsafe.Pointer(cName))
  298. defer C.free(unsafe.Pointer(cParam))
  299. var openReply unsafe.Pointer
  300. ret := C.device_message(C.int(idx), cUri, cName, cParam, &openReply)
  301. reply := (*C.struct_DoResponse)(openReply)
  302. if ret != 2 {
  303. return &gen.DoResponse{
  304. DeviceUri: request.DeviceUri,
  305. RetCode: fmt.Sprintf("%d", ret),
  306. ReqName: request.ReqName,
  307. RespResult: C.GoString(reply.RespResult),
  308. RetContext: "Message Call Error",
  309. }, nil
  310. }
  311. defer C.free_struct(openReply, C.int(3))
  312. return &gen.DoResponse{
  313. DeviceUri: request.DeviceUri,
  314. RetCode: fmt.Sprintf("%d", ret),
  315. ReqName: request.ReqName,
  316. RespResult: C.GoString(reply.RespResult),
  317. ReqTransaction: request.ReqTransaction,
  318. RetContext: C.GoString(reply.retContext),
  319. }, nil
  320. }