fixing protoc gen adding rust
parent
f446b4d7dd
commit
7f0aa1a695
@ -1,7 +1,7 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
package grpc;
|
package grpc;
|
||||||
|
|
||||||
option go_package = "internal/pkg/grpc";
|
option go_package = "server/pkg/grpc";
|
||||||
|
|
||||||
service handshake {
|
service handshake {
|
||||||
rpc ReactorClientHandler(ReactorClientRequest) returns (ReactorClientResponse);
|
rpc ReactorClientHandler(ReactorClientRequest) returns (ReactorClientResponse);
|
@ -0,0 +1,22 @@
|
|||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
pub struct Device {
|
||||||
|
address: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Device {
|
||||||
|
fn new(address: i32) -> Device {
|
||||||
|
return Device {address: address};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Device {
|
||||||
|
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(fmt, "{}", self.address)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// outward factory function
|
||||||
|
pub fn create_device(address: i32) -> Device {
|
||||||
|
return Device::new(address);
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
{"rustc_fingerprint":7536298932270653499,"outputs":{"15729799797837862367":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/usr\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.70.0 (90c541806 2023-05-31) (Arch Linux rust 1:1.70.0-1)\nbinary: rustc\ncommit-hash: 90c541806f23a127002de5b4038be731ba1458ca\ncommit-date: 2023-05-31\nhost: x86_64-unknown-linux-gnu\nrelease: 1.70.0\nLLVM version: 15.0.7\n","stderr":""}},"successes":{}}
|
@ -0,0 +1,3 @@
|
|||||||
|
Signature: 8a477f597d28d172789f06886806bc55
|
||||||
|
# This file is a cache directory tag created by cargo.
|
||||||
|
# For information about cache directory tags see https://bford.info/cachedir/
|
@ -0,0 +1 @@
|
|||||||
|
{"rustc":17025871333922611028,"features":"[]","target":1121030462635718733,"profile":7309141686862299243,"path":1684066648322511884,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/reactor-24beb93947a561a5/dep-bin-reactor"}}],"rustflags":[],"metadata":7797948686568424061,"config":2202906307356721367,"compile_kind":0}
|
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
This file has an mtime of when this was started.
|
@ -0,0 +1 @@
|
|||||||
|
{"message":"expected type, found `{`","code":null,"level":"error","spans":[{"file_name":"src/i2c.rs","byte_start":182,"byte_end":183,"line_start":7,"line_end":7,"column_start":26,"column_end":27,"is_primary":true,"text":[{"text":"fn send_i2c_command() -> {","highlight_start":26,"highlight_end":27}],"label":"expected type","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror\u001b[0m\u001b[0m\u001b[1m: expected type, found `{`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/i2c.rs:7:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m7\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0mfn send_i2c_command() -> {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9m^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9mexpected type\u001b[0m\n\n"}
|
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
This file has an mtime of when this was started.
|
@ -0,0 +1 @@
|
|||||||
|
{"message":"expected type, found `{`","code":null,"level":"error","spans":[{"file_name":"src/i2c.rs","byte_start":182,"byte_end":183,"line_start":7,"line_end":7,"column_start":26,"column_end":27,"is_primary":true,"text":[{"text":"fn send_i2c_command() -> {","highlight_start":26,"highlight_end":27}],"label":"expected type","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror\u001b[0m\u001b[0m\u001b[1m: expected type, found `{`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/i2c.rs:7:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m7\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0mfn send_i2c_command() -> {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9m^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9mexpected type\u001b[0m\n\n"}
|
@ -0,0 +1 @@
|
|||||||
|
{"rustc":17025871333922611028,"features":"[]","target":1121030462635718733,"profile":1021633075455700787,"path":1684066648322511884,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/reactor-8045e4fbaa95f18e/dep-test-bin-reactor"}}],"rustflags":[],"metadata":7797948686568424061,"config":2202906307356721367,"compile_kind":0}
|
@ -0,0 +1,7 @@
|
|||||||
|
/home/spinach/src/dmac/reactor/target/debug/deps/reactor-24beb93947a561a5.rmeta: src/main.rs src/i2c.rs src/device.rs
|
||||||
|
|
||||||
|
/home/spinach/src/dmac/reactor/target/debug/deps/reactor-24beb93947a561a5.d: src/main.rs src/i2c.rs src/device.rs
|
||||||
|
|
||||||
|
src/main.rs:
|
||||||
|
src/i2c.rs:
|
||||||
|
src/device.rs:
|
@ -0,0 +1,7 @@
|
|||||||
|
/home/spinach/src/dmac/reactor/target/debug/deps/reactor-8045e4fbaa95f18e.rmeta: src/main.rs src/i2c.rs src/device.rs
|
||||||
|
|
||||||
|
/home/spinach/src/dmac/reactor/target/debug/deps/reactor-8045e4fbaa95f18e.d: src/main.rs src/i2c.rs src/device.rs
|
||||||
|
|
||||||
|
src/main.rs:
|
||||||
|
src/i2c.rs:
|
||||||
|
src/device.rs:
|
@ -1,42 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
package grpc;
|
|
||||||
|
|
||||||
option go_package = "internal/pkg/grpc";
|
|
||||||
|
|
||||||
service device {
|
|
||||||
// groups basic device interactions
|
|
||||||
// get/set name based on request
|
|
||||||
rpc Name(NameRequest) returns (NameResponse)
|
|
||||||
}
|
|
||||||
|
|
||||||
message NameRequest {
|
|
||||||
// empty for future expansion
|
|
||||||
string Name = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message NameResponse {
|
|
||||||
string Name = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
service sensor {
|
|
||||||
// sensor specific functions
|
|
||||||
rpc Reading(ReadingRequest) returns (ReadingResponse)
|
|
||||||
rpc SampleRate(SampleRateRequest) returns (SampleRateResponse)
|
|
||||||
}
|
|
||||||
|
|
||||||
message ReadingRequest {
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
|
|
||||||
message ReadingResponse {
|
|
||||||
string Reading = 1; // formatted reading "9.7 pH"
|
|
||||||
int64 Timestamp = 2; // when the reading was taken
|
|
||||||
}
|
|
||||||
|
|
||||||
message SampleRateRequest {
|
|
||||||
int32 SampleRate = 1; // 0 to return current sample rate, value in seconds
|
|
||||||
}
|
|
||||||
|
|
||||||
message SampleRateResponse {
|
|
||||||
int32 SampleRate = 1; // returns the set sample rate
|
|
||||||
}
|
|
@ -1,335 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// protoc-gen-go v1.28.0
|
|
||||||
// protoc v3.6.1
|
|
||||||
// source: internal/pkg/grpc/server.proto
|
|
||||||
|
|
||||||
package grpc
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
reflect "reflect"
|
|
||||||
sync "sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Verify that this generated code is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
|
||||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
|
||||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
|
||||||
)
|
|
||||||
|
|
||||||
type ClientRequest struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
ClientId uint32 `protobuf:"varint,1,opt,name=clientId,proto3" json:"clientId,omitempty"`
|
|
||||||
ClientType string `protobuf:"bytes,2,opt,name=clientType,proto3" json:"clientType,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientRequest) Reset() {
|
|
||||||
*x = ClientRequest{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_internal_pkg_grpc_server_proto_msgTypes[0]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientRequest) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*ClientRequest) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *ClientRequest) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_internal_pkg_grpc_server_proto_msgTypes[0]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use ClientRequest.ProtoReflect.Descriptor instead.
|
|
||||||
func (*ClientRequest) Descriptor() ([]byte, []int) {
|
|
||||||
return file_internal_pkg_grpc_server_proto_rawDescGZIP(), []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientRequest) GetClientId() uint32 {
|
|
||||||
if x != nil {
|
|
||||||
return x.ClientId
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientRequest) GetClientType() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.ClientType
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
type ClientResponse struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
ClientId uint32 `protobuf:"varint,1,opt,name=clientId,proto3" json:"clientId,omitempty"`
|
|
||||||
ServerPort uint32 `protobuf:"varint,2,opt,name=serverPort,proto3" json:"serverPort,omitempty"`
|
|
||||||
Database *Database `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientResponse) Reset() {
|
|
||||||
*x = ClientResponse{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_internal_pkg_grpc_server_proto_msgTypes[1]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientResponse) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*ClientResponse) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *ClientResponse) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_internal_pkg_grpc_server_proto_msgTypes[1]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use ClientResponse.ProtoReflect.Descriptor instead.
|
|
||||||
func (*ClientResponse) Descriptor() ([]byte, []int) {
|
|
||||||
return file_internal_pkg_grpc_server_proto_rawDescGZIP(), []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientResponse) GetClientId() uint32 {
|
|
||||||
if x != nil {
|
|
||||||
return x.ClientId
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientResponse) GetServerPort() uint32 {
|
|
||||||
if x != nil {
|
|
||||||
return x.ServerPort
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *ClientResponse) GetDatabase() *Database {
|
|
||||||
if x != nil {
|
|
||||||
return x.Database
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Database struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
URL string `protobuf:"bytes,1,opt,name=URL,proto3" json:"URL,omitempty"`
|
|
||||||
ORG string `protobuf:"bytes,2,opt,name=ORG,proto3" json:"ORG,omitempty"`
|
|
||||||
Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
|
|
||||||
Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *Database) Reset() {
|
|
||||||
*x = Database{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_internal_pkg_grpc_server_proto_msgTypes[2]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *Database) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*Database) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *Database) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_internal_pkg_grpc_server_proto_msgTypes[2]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use Database.ProtoReflect.Descriptor instead.
|
|
||||||
func (*Database) Descriptor() ([]byte, []int) {
|
|
||||||
return file_internal_pkg_grpc_server_proto_rawDescGZIP(), []int{2}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *Database) GetURL() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.URL
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *Database) GetORG() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.ORG
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *Database) GetToken() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Token
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *Database) GetBucket() string {
|
|
||||||
if x != nil {
|
|
||||||
return x.Bucket
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
var File_internal_pkg_grpc_server_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_internal_pkg_grpc_server_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x1e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67,
|
|
||||||
0x72, 0x70, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
|
||||||
0x12, 0x04, 0x67, 0x72, 0x70, 0x63, 0x22, 0x4b, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74,
|
|
||||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e,
|
|
||||||
0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e,
|
|
||||||
0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70,
|
|
||||||
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54,
|
|
||||||
0x79, 0x70, 0x65, 0x22, 0x78, 0x0a, 0x0e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73,
|
|
||||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49,
|
|
||||||
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49,
|
|
||||||
0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18,
|
|
||||||
0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72,
|
|
||||||
0x74, 0x12, 0x2a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20,
|
|
||||||
0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62,
|
|
||||||
0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x5c, 0x0a,
|
|
||||||
0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c,
|
|
||||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x10, 0x0a, 0x03, 0x4f,
|
|
||||||
0x52, 0x47, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4f, 0x52, 0x47, 0x12, 0x14, 0x0a,
|
|
||||||
0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f,
|
|
||||||
0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x04, 0x20,
|
|
||||||
0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x32, 0x50, 0x0a, 0x09, 0x68,
|
|
||||||
0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x43, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65,
|
|
||||||
0x6e, 0x74, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x48, 0x61, 0x6e, 0x64, 0x6c,
|
|
||||||
0x65, 0x72, 0x12, 0x13, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74,
|
|
||||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43,
|
|
||||||
0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x13, 0x5a,
|
|
||||||
0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x72,
|
|
||||||
0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
file_internal_pkg_grpc_server_proto_rawDescOnce sync.Once
|
|
||||||
file_internal_pkg_grpc_server_proto_rawDescData = file_internal_pkg_grpc_server_proto_rawDesc
|
|
||||||
)
|
|
||||||
|
|
||||||
func file_internal_pkg_grpc_server_proto_rawDescGZIP() []byte {
|
|
||||||
file_internal_pkg_grpc_server_proto_rawDescOnce.Do(func() {
|
|
||||||
file_internal_pkg_grpc_server_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_pkg_grpc_server_proto_rawDescData)
|
|
||||||
})
|
|
||||||
return file_internal_pkg_grpc_server_proto_rawDescData
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_internal_pkg_grpc_server_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
|
|
||||||
var file_internal_pkg_grpc_server_proto_goTypes = []interface{}{
|
|
||||||
(*ClientRequest)(nil), // 0: grpc.ClientRequest
|
|
||||||
(*ClientResponse)(nil), // 1: grpc.ClientResponse
|
|
||||||
(*Database)(nil), // 2: grpc.Database
|
|
||||||
}
|
|
||||||
var file_internal_pkg_grpc_server_proto_depIdxs = []int32{
|
|
||||||
2, // 0: grpc.ClientResponse.database:type_name -> grpc.Database
|
|
||||||
0, // 1: grpc.handshake.ClientDiscoveryHandler:input_type -> grpc.ClientRequest
|
|
||||||
1, // 2: grpc.handshake.ClientDiscoveryHandler:output_type -> grpc.ClientResponse
|
|
||||||
2, // [2:3] is the sub-list for method output_type
|
|
||||||
1, // [1:2] is the sub-list for method input_type
|
|
||||||
1, // [1:1] is the sub-list for extension type_name
|
|
||||||
1, // [1:1] is the sub-list for extension extendee
|
|
||||||
0, // [0:1] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_internal_pkg_grpc_server_proto_init() }
|
|
||||||
func file_internal_pkg_grpc_server_proto_init() {
|
|
||||||
if File_internal_pkg_grpc_server_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !protoimpl.UnsafeEnabled {
|
|
||||||
file_internal_pkg_grpc_server_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*ClientRequest); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file_internal_pkg_grpc_server_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*ClientResponse); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file_internal_pkg_grpc_server_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*Database); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_internal_pkg_grpc_server_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 3,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 1,
|
|
||||||
},
|
|
||||||
GoTypes: file_internal_pkg_grpc_server_proto_goTypes,
|
|
||||||
DependencyIndexes: file_internal_pkg_grpc_server_proto_depIdxs,
|
|
||||||
MessageInfos: file_internal_pkg_grpc_server_proto_msgTypes,
|
|
||||||
}.Build()
|
|
||||||
File_internal_pkg_grpc_server_proto = out.File
|
|
||||||
file_internal_pkg_grpc_server_proto_rawDesc = nil
|
|
||||||
file_internal_pkg_grpc_server_proto_goTypes = nil
|
|
||||||
file_internal_pkg_grpc_server_proto_depIdxs = nil
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
package grpc;
|
|
||||||
|
|
||||||
option go_package = "internal/pkg/grpc";
|
|
||||||
|
|
||||||
service handshake {
|
|
||||||
rpc ClientDiscoveryHandler(ClientRequest) returns (ClientResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
message ClientRequest {
|
|
||||||
uint32 clientId = 1;
|
|
||||||
string clientType = 2;
|
|
||||||
string ip = 3; // client ip
|
|
||||||
uint32 port = 4; // client port for gRPC server
|
|
||||||
}
|
|
||||||
|
|
||||||
message ClientResponse {
|
|
||||||
uint32 clientId = 1;
|
|
||||||
uint32 serverPort = 2;
|
|
||||||
Database database = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Database {
|
|
||||||
string URL = 1;
|
|
||||||
string ORG = 2;
|
|
||||||
string token = 3;
|
|
||||||
string bucket = 4;
|
|
||||||
}
|
|
@ -1,105 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
|
|
||||||
// versions:
|
|
||||||
// - protoc-gen-go-grpc v1.2.0
|
|
||||||
// - protoc v3.21.12
|
|
||||||
// source: internal/pkg/grpc/handshake.proto
|
|
||||||
|
|
||||||
package grpc
|
|
||||||
|
|
||||||
import (
|
|
||||||
context "context"
|
|
||||||
grpc "google.golang.org/grpc"
|
|
||||||
codes "google.golang.org/grpc/codes"
|
|
||||||
status "google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the grpc package it is being compiled against.
|
|
||||||
// Requires gRPC-Go v1.32.0 or later.
|
|
||||||
const _ = grpc.SupportPackageIsVersion7
|
|
||||||
|
|
||||||
// HandshakeClient is the client API for Handshake service.
|
|
||||||
//
|
|
||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
|
|
||||||
type HandshakeClient interface {
|
|
||||||
ReactorClientHandler(ctx context.Context, in *ReactorClientRequest, opts ...grpc.CallOption) (*ReactorClientResponse, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type handshakeClient struct {
|
|
||||||
cc grpc.ClientConnInterface
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewHandshakeClient(cc grpc.ClientConnInterface) HandshakeClient {
|
|
||||||
return &handshakeClient{cc}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *handshakeClient) ReactorClientHandler(ctx context.Context, in *ReactorClientRequest, opts ...grpc.CallOption) (*ReactorClientResponse, error) {
|
|
||||||
out := new(ReactorClientResponse)
|
|
||||||
err := c.cc.Invoke(ctx, "/grpc.handshake/ReactorClientHandler", in, out, opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandshakeServer is the server API for Handshake service.
|
|
||||||
// All implementations must embed UnimplementedHandshakeServer
|
|
||||||
// for forward compatibility
|
|
||||||
type HandshakeServer interface {
|
|
||||||
ReactorClientHandler(context.Context, *ReactorClientRequest) (*ReactorClientResponse, error)
|
|
||||||
mustEmbedUnimplementedHandshakeServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnimplementedHandshakeServer must be embedded to have forward compatible implementations.
|
|
||||||
type UnimplementedHandshakeServer struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (UnimplementedHandshakeServer) ReactorClientHandler(context.Context, *ReactorClientRequest) (*ReactorClientResponse, error) {
|
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method ReactorClientHandler not implemented")
|
|
||||||
}
|
|
||||||
func (UnimplementedHandshakeServer) mustEmbedUnimplementedHandshakeServer() {}
|
|
||||||
|
|
||||||
// UnsafeHandshakeServer may be embedded to opt out of forward compatibility for this service.
|
|
||||||
// Use of this interface is not recommended, as added methods to HandshakeServer will
|
|
||||||
// result in compilation errors.
|
|
||||||
type UnsafeHandshakeServer interface {
|
|
||||||
mustEmbedUnimplementedHandshakeServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegisterHandshakeServer(s grpc.ServiceRegistrar, srv HandshakeServer) {
|
|
||||||
s.RegisterService(&Handshake_ServiceDesc, srv)
|
|
||||||
}
|
|
||||||
|
|
||||||
func _Handshake_ReactorClientHandler_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
|
||||||
in := new(ReactorClientRequest)
|
|
||||||
if err := dec(in); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if interceptor == nil {
|
|
||||||
return srv.(HandshakeServer).ReactorClientHandler(ctx, in)
|
|
||||||
}
|
|
||||||
info := &grpc.UnaryServerInfo{
|
|
||||||
Server: srv,
|
|
||||||
FullMethod: "/grpc.handshake/ReactorClientHandler",
|
|
||||||
}
|
|
||||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
||||||
return srv.(HandshakeServer).ReactorClientHandler(ctx, req.(*ReactorClientRequest))
|
|
||||||
}
|
|
||||||
return interceptor(ctx, in, info, handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handshake_ServiceDesc is the grpc.ServiceDesc for Handshake service.
|
|
||||||
// It's only intended for direct use with grpc.RegisterService,
|
|
||||||
// and not to be introspected or modified (even as a copy)
|
|
||||||
var Handshake_ServiceDesc = grpc.ServiceDesc{
|
|
||||||
ServiceName: "grpc.handshake",
|
|
||||||
HandlerType: (*HandshakeServer)(nil),
|
|
||||||
Methods: []grpc.MethodDesc{
|
|
||||||
{
|
|
||||||
MethodName: "ReactorClientHandler",
|
|
||||||
Handler: _Handshake_ReactorClientHandler_Handler,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Streams: []grpc.StreamDesc{},
|
|
||||||
Metadata: "internal/pkg/grpc/handshake.proto",
|
|
||||||
}
|
|
@ -1,29 +1,137 @@
|
|||||||
package system
|
package system
|
||||||
|
|
||||||
import (
|
import (
|
||||||
//"log"
|
"errors"
|
||||||
|
"math"
|
||||||
|
"math/rand"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidMaxConn = errors.New("invalid max connection attempts")
|
||||||
|
ErrManagerInactive = errors.New("manager inactive")
|
||||||
|
ErrManagerActive = errors.New("manager active")
|
||||||
|
ErrMaxAttemptsExceeded = errors.New("max connection attempts exceeded")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Status is used as an enum for the current status.
|
||||||
|
// Could be expanded to include others such as killed, sleeping, etc.
|
||||||
|
type Status int
|
||||||
|
|
||||||
_ "context"
|
const (
|
||||||
|
Inactive Status = 0
|
||||||
|
Active Status = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
// will condense into the rm soon enough
|
// MaxConnAttempts is the maximum allowable connection attempts.
|
||||||
// manager connects to client on start and returns the gRPC connection to make gRPC clients
|
// Limited to 255 to prevent excessive timeout scaling.
|
||||||
|
const MaxConnAttempts = 0xFF
|
||||||
// type ClientManager struct {
|
|
||||||
// *Client // gives access to c.Ip c.Id etc
|
// Manager is a general purpose structure to implement basic capabilities.
|
||||||
// Hb time.Duration // used for managing hb timer for client
|
// Stores state in active variable, modified through atomic swaps.
|
||||||
// Sig chan bool
|
// Embeds a connection to be used in generating timeouts.
|
||||||
// sync.Mutex
|
type Manager struct {
|
||||||
// }
|
*connection
|
||||||
|
active int32
|
||||||
// func NewClientManager(cl *Client) *ClientManager {
|
}
|
||||||
// return &ClientManager{Client: cl}
|
|
||||||
// }
|
// New creates a new manager with the maxConn maximum attempts.
|
||||||
|
// Throws ErrInvalidMaxConn if maxConn is not in [0, MaxConnAttempts].
|
||||||
// func (m *ClientManager) UpdateClient(cl *Client) error {
|
func New(maxConn int) (*Manager, error) {
|
||||||
// m.Lock()
|
|
||||||
// defer m.Unlock()
|
if maxConn < 0 || maxConn > MaxConnAttempts {
|
||||||
// logging.Debug(logging.DClient, "MAN Updating client %v", cl.Id)
|
return &Manager{}, ErrInvalidMaxConn
|
||||||
// m.Client = cl
|
}
|
||||||
// return nil
|
|
||||||
// }
|
c := &connection{MaxAttempts: maxConn}
|
||||||
|
|
||||||
|
m := &Manager{
|
||||||
|
connection: c,
|
||||||
|
}
|
||||||
|
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start attempts to start the manager.
|
||||||
|
// Throws ErrManagerActive error if the manager is already active.
|
||||||
|
func (m *Manager) Start() error {
|
||||||
|
if atomic.CompareAndSwapInt32(&m.active, 0, 1) {
|
||||||
|
m.ResetConnections()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrManagerActive
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop attempts to stop the manager.
|
||||||
|
// Throws ErrManagerInactive error if the manager is already inactive.
|
||||||
|
func (m *Manager) Stop() error {
|
||||||
|
if atomic.CompareAndSwapInt32(&m.active, 1, 0) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrManagerInactive
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsActive returns the current ManagerStatus.
|
||||||
|
func (m *Manager) IsActive() Status {
|
||||||
|
return Status(atomic.LoadInt32(&m.active))
|
||||||
|
}
|
||||||
|
|
||||||
|
// HeartBeat will send an empty struct over ping every hb (scale).
|
||||||
|
// The pings are sent ever (hb + rand(interval)) * scale.
|
||||||
|
// Where scale is typically time.Millisecond, time.Second etc.
|
||||||
|
// Will close the channel on exit to prevent leaks.
|
||||||
|
func (m *Manager) HeartBeat(
|
||||||
|
ping chan struct{},
|
||||||
|
hb, interval int,
|
||||||
|
scale time.Duration) {
|
||||||
|
|
||||||
|
for m.IsActive() == Active {
|
||||||
|
ping <- struct{}{}
|
||||||
|
|
||||||
|
sleep := time.Duration(hb-interval) * scale
|
||||||
|
|
||||||
|
if interval > 0 {
|
||||||
|
sleep += time.Duration(rand.Intn(2*interval)) * scale
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(sleep)
|
||||||
|
}
|
||||||
|
|
||||||
|
close(ping)
|
||||||
|
}
|
||||||
|
|
||||||
|
// connection keeps track of maximum and current number of connection attempts.
|
||||||
|
// Concurrency safe as it is protected by a mutex.
|
||||||
|
type connection struct {
|
||||||
|
Attempts float64
|
||||||
|
MaxAttempts int
|
||||||
|
sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timeout returns an exponentially decaying timeout based on attempts.
|
||||||
|
// Returns timeout of type time.Duration in milliseconds.
|
||||||
|
// Returns ErrMaxAttemptsExceeded if too many attempts are tried.
|
||||||
|
func (c *connection) Timeout() (time.Duration, error) {
|
||||||
|
|
||||||
|
c.Lock()
|
||||||
|
defer c.Unlock()
|
||||||
|
|
||||||
|
if int(c.Attempts) < c.MaxAttempts {
|
||||||
|
to := time.Duration(50*math.Pow(2, c.Attempts)) * time.Millisecond
|
||||||
|
c.Attempts += 1
|
||||||
|
return to, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, ErrMaxAttemptsExceeded
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResetConnections sets the current connection attempts back to 0.
|
||||||
|
func (c *connection) ResetConnections() {
|
||||||
|
c.Lock()
|
||||||
|
defer c.Unlock()
|
||||||
|
c.Attempts = 0
|
||||||
|
}
|
||||||
|
@ -1,309 +0,0 @@
|
|||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
_ "fmt"
|
|
||||||
// sensor components
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
type StatusMonitor struct {
|
|
||||||
// allows for embedding into managers
|
|
||||||
TransactionId chan uint32 // monotonically increases to track outdated reqs
|
|
||||||
DevChan chan *DeviceInfo // channel for device status
|
|
||||||
ReactorChan chan *DeviceInfo // channel for reactor status
|
|
||||||
*SystemViewer
|
|
||||||
DevBuf *devbuf
|
|
||||||
sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
type devbuf struct {
|
|
||||||
ReactorId int // reactor we are looking at, if any
|
|
||||||
Buf map[string]map[int]*DeviceInfo // convienent way to store/seperate device data
|
|
||||||
sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewBuffer() map[string]map[int]*DeviceInfo {
|
|
||||||
rbuf := make(map[int]*DeviceInfo)
|
|
||||||
dbuf := make(map[int]*DeviceInfo)
|
|
||||||
sbuf := make(map[string]map[int]*DeviceInfo)
|
|
||||||
sbuf["Reactor"] = rbuf
|
|
||||||
sbuf["Device"] = dbuf
|
|
||||||
return sbuf
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewStatusMonitor(t string, id int, sys *SystemViewer) *StatusMonitor {
|
|
||||||
tid := make(chan uint32)
|
|
||||||
sm := &StatusMonitor{TransactionId: tid}
|
|
||||||
sm.SystemViewer = sys
|
|
||||||
logging.Debug(logging.DClient, "SYS Creating new status monitor")
|
|
||||||
if t == "Reactor" {
|
|
||||||
// reactor status monitor
|
|
||||||
sm.ReactorChan = sys.AddReactorSender()
|
|
||||||
sm.DevChan = sys.AddDeviceSender(id)
|
|
||||||
go sm.GenerateIds()
|
|
||||||
} else {
|
|
||||||
// tui status monitor
|
|
||||||
sbuf := NewBuffer()
|
|
||||||
//sm.ReactorChan, sbuf["Reactor"] = sys.AddListener(id,0)
|
|
||||||
sm.DevBuf = &devbuf{Buf: sbuf} // makes it easier to work with
|
|
||||||
go sm.UpdateListener(id, 0)
|
|
||||||
}
|
|
||||||
return sm
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StatusMonitor) GenerateIds() {
|
|
||||||
var id uint32
|
|
||||||
id = 0
|
|
||||||
for {
|
|
||||||
s.TransactionId <- id
|
|
||||||
id += 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StatusMonitor) Send(d *DeviceInfo, dtype string) {
|
|
||||||
d.TransactionId = <-s.TransactionId
|
|
||||||
logging.Debug(logging.DClient, "SYS 01 Sending update for: %s (%s)", d.Type, d.Status)
|
|
||||||
if dtype == "Reactor" {
|
|
||||||
s.ReactorChan <- d
|
|
||||||
} else {
|
|
||||||
s.DevChan <- d
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StatusMonitor) GetBuffer() []*DeviceInfo {
|
|
||||||
// also clears buffer
|
|
||||||
s.DevBuf.Lock()
|
|
||||||
defer s.DevBuf.Unlock()
|
|
||||||
res := []*DeviceInfo{}
|
|
||||||
if len(s.DevBuf.Buf["Reactor"]) != 0 || len(s.DevBuf.Buf["Device"]) != 0 {
|
|
||||||
logging.Debug(logging.DClient, "Clearing buff %v", s.DevBuf.Buf)
|
|
||||||
}
|
|
||||||
for _, devs := range s.DevBuf.Buf {
|
|
||||||
for _, dev := range devs {
|
|
||||||
// loops over reactors then devices
|
|
||||||
res = append(res, dev)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.DevBuf.Buf = NewBuffer() // clearing old buffer
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StatusMonitor) UpdateListener(tid, reactorId uint32) {
|
|
||||||
s.DevBuf.Lock()
|
|
||||||
defer s.DevBuf.Unlock()
|
|
||||||
// clearing proper buffer
|
|
||||||
if reactorId == 0 {
|
|
||||||
logging.Debug(logging.DClient, "SYS 01 Adding %v as reactor listener", tid)
|
|
||||||
s.DevBuf.Buf["Reactor"] = make(map[uint32]*DeviceInfo)
|
|
||||||
s.ReactorChan, s.DevBuf.Buf["Reactor"] = s.SystemViewer.AddListener(tid, reactorId)
|
|
||||||
go s.Listen(s.ReactorChan)
|
|
||||||
} else {
|
|
||||||
logging.Debug(logging.DClient, "SYS 01 Adding %v as reactor %v listener", tid, reactorId)
|
|
||||||
s.DevBuf.Buf["Device"] = make(map[uint32]*DeviceInfo) // clearing old devices
|
|
||||||
if s.DevBuf.ReactorId != reactorId && s.DevBuf.ReactorId != 0 {
|
|
||||||
go s.SystemViewer.RemoveListener(s.DevBuf.ReactorId, tid)
|
|
||||||
}
|
|
||||||
s.DevBuf.ReactorId = reactorId
|
|
||||||
s.DevChan, s.DevBuf.Buf["Device"] = s.SystemViewer.AddListener(tid, reactorId)
|
|
||||||
go s.Listen(s.DevChan)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StatusMonitor) UpdateBuffer(d *DeviceInfo, dtype string, ch chan *DeviceInfo) {
|
|
||||||
s.DevBuf.Lock()
|
|
||||||
defer s.DevBuf.Unlock()
|
|
||||||
logging.Debug(logging.DClient, "SYS 01 Dev %v update requested", d)
|
|
||||||
if dev, exists := s.DevBuf.Buf[dtype][d.Id]; exists {
|
|
||||||
// already a device in the buffer
|
|
||||||
if dev.TransactionId > d.TransactionId {
|
|
||||||
logging.Debug(logging.DClient, "SYS 01 Update Processed. Old: %v, New: %v \n", dev, d)
|
|
||||||
d = dev // not sure if i can do this lol
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ch == s.ReactorChan || ch == s.DevChan {
|
|
||||||
// hacky way to check if the device came from a listener of a current channel
|
|
||||||
s.DevBuf.Buf[dtype][d.Id] = d
|
|
||||||
} else {
|
|
||||||
logging.Debug(logging.DClient, "Dev out of date!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *StatusMonitor) Listen(ch chan *DeviceInfo) {
|
|
||||||
for dev := range ch {
|
|
||||||
if dev.Type == "Reactor" {
|
|
||||||
go s.UpdateBuffer(dev, "Reactor", ch)
|
|
||||||
} else {
|
|
||||||
go s.UpdateBuffer(dev, "Device", ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type InfoStream struct {
|
|
||||||
// base stream for any reactor/device
|
|
||||||
// NewSender embedds the channel to send updates on
|
|
||||||
// NewListener will add the statusmon to the list of devs to echo to
|
|
||||||
Stream chan *DeviceInfo
|
|
||||||
Layout *syslayout
|
|
||||||
*listeners
|
|
||||||
}
|
|
||||||
|
|
||||||
type listeners struct {
|
|
||||||
sync.RWMutex
|
|
||||||
Listeners map[uint32]*lischan
|
|
||||||
}
|
|
||||||
|
|
||||||
type lischan struct {
|
|
||||||
sync.WaitGroup
|
|
||||||
StatusChan chan *DeviceInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
type syslayout struct {
|
|
||||||
Devs map[uint32]*DeviceInfo
|
|
||||||
uint32 //index
|
|
||||||
sync.RWMutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewLisChan(ch chan *DeviceInfo) *lischan {
|
|
||||||
l := &lischan{StatusChan: ch}
|
|
||||||
return l
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewInfoStream() *InfoStream {
|
|
||||||
dch := make(chan *DeviceInfo)
|
|
||||||
s := &InfoStream{Stream: dch}
|
|
||||||
m := make(map[uint32]*DeviceInfo)
|
|
||||||
s.Layout = &syslayout{Devs: m}
|
|
||||||
s.listeners = &listeners{Listeners: make(map[uint32]*lischan)}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *InfoStream) Start() {
|
|
||||||
// consistency
|
|
||||||
go s.Listen()
|
|
||||||
}
|
|
||||||
|
|
||||||
// goal is to hook every new manager into the reactor status chan
|
|
||||||
func (s *InfoStream) AddSender() chan *DeviceInfo {
|
|
||||||
return s.Stream
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *InfoStream) Listen() {
|
|
||||||
for deviceInfo := range s.Stream {
|
|
||||||
go s.Update(deviceInfo)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *InfoStream) Update(d *DeviceInfo) {
|
|
||||||
s.Layout.Lock()
|
|
||||||
defer s.Layout.Unlock()
|
|
||||||
if dev, ok := s.Layout.Devs[d.Id]; !ok {
|
|
||||||
d.Index = s.Layout.uint32
|
|
||||||
s.Layout.uint32 += 1
|
|
||||||
} else {
|
|
||||||
d.Index = dev.Index
|
|
||||||
}
|
|
||||||
s.Layout.Devs[d.Id] = d
|
|
||||||
go s.Echo(d)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *listeners) Echo(d *DeviceInfo) {
|
|
||||||
l.RLock()
|
|
||||||
defer l.RUnlock()
|
|
||||||
// read only lock
|
|
||||||
for _, lis := range l.Listeners {
|
|
||||||
lis.Add(1)
|
|
||||||
go func(listener *lischan, dev *DeviceInfo) {
|
|
||||||
defer listener.Done()
|
|
||||||
listener.StatusChan <- dev
|
|
||||||
}(lis, d)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *InfoStream) AddListener(id int, ch chan *DeviceInfo) map[uint32]*DeviceInfo {
|
|
||||||
// if i get a memory leak ill eat my shoe
|
|
||||||
s.listeners.Lock()
|
|
||||||
defer s.listeners.Unlock()
|
|
||||||
if _, ok := s.listeners.Listeners[id]; ok {
|
|
||||||
// exists
|
|
||||||
go s.RemoveListener(id)
|
|
||||||
}
|
|
||||||
s.listeners.Listeners[id] = NewLisChan(ch)
|
|
||||||
logging.Debug(logging.DClient, "SYS 01 Getting Devices")
|
|
||||||
//s.Layout.RLock()
|
|
||||||
//defer s.Layout.RUnlock()
|
|
||||||
logging.Debug(logging.DClient, "SYS 01 Returning Devices %v", s.Layout.Devs)
|
|
||||||
return s.Layout.Devs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *listeners) RemoveListener(id int) {
|
|
||||||
l.Lock()
|
|
||||||
defer l.Unlock()
|
|
||||||
if lis, ok := l.Listeners[id]; ok {
|
|
||||||
delete(l.Listeners, id)
|
|
||||||
go func(ls *lischan) {
|
|
||||||
ls.Wait()
|
|
||||||
close(ls.StatusChan)
|
|
||||||
}(lis)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// status buffer maintaince
|
|
||||||
|
|
||||||
type SystemViewer struct {
|
|
||||||
// stores system directory and provide methods to be embedded in managers
|
|
||||||
ReactorStream *InfoStream // can add itself as a listener to provide methods
|
|
||||||
DeviceStream *ds
|
|
||||||
}
|
|
||||||
|
|
||||||
type ds struct {
|
|
||||||
Reactors map[uint32]*InfoStream //map from reactor id to its device info stream
|
|
||||||
sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewSystemViewer() *SystemViewer {
|
|
||||||
rs := NewInfoStream()
|
|
||||||
s := &SystemViewer{ReactorStream: rs}
|
|
||||||
m := make(map[uint32]*InfoStream)
|
|
||||||
s.DeviceStream = &ds{Reactors: m}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SystemViewer) Start() {
|
|
||||||
go s.ReactorStream.Start()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SystemViewer) AddReactorSender() chan *DeviceInfo {
|
|
||||||
return s.ReactorStream.AddSender()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SystemViewer) AddDeviceSender(reactorId uint32) chan *DeviceInfo {
|
|
||||||
s.DeviceStream.Lock()
|
|
||||||
defer s.DeviceStream.Unlock()
|
|
||||||
var ds *InfoStream
|
|
||||||
var ok bool
|
|
||||||
if ds, ok = s.DeviceStream.Reactors[reactorId]; !ok {
|
|
||||||
ds = NewInfoStream()
|
|
||||||
s.DeviceStream.Reactors[reactorId] = ds
|
|
||||||
go ds.Start()
|
|
||||||
}
|
|
||||||
return ds.AddSender()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SystemViewer) AddListener(id, rid int) (chan *DeviceInfo, map[uint32]*DeviceInfo) {
|
|
||||||
// returns a listener for that chan
|
|
||||||
ch := make(chan *DeviceInfo)
|
|
||||||
if rid != 0 {
|
|
||||||
return ch, s.DeviceStream.Reactors[rid].AddListener(id, ch)
|
|
||||||
} else {
|
|
||||||
return ch, s.ReactorStream.AddListener(id, ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SystemViewer) RemoveListener(rid, tid int) {
|
|
||||||
// removes chan for specific tid and rid
|
|
||||||
s.DeviceStream.Lock()
|
|
||||||
defer s.DeviceStream.Unlock()
|
|
||||||
go s.DeviceStream.Reactors[rid].RemoveListener(tid)
|
|
||||||
}
|
|
||||||
*/
|
|
Loading…
Reference in New Issue