1
0
Fork 0

Bump versions, improve and simplify server

pull/1/head
Ambrose Chua 2020-04-22 14:48:07 +08:00
parent bd1d8e7bd3
commit 5ee1a6ace7
12 changed files with 963 additions and 1391 deletions

View File

@ -1,68 +0,0 @@
// GENERATED CODE -- DO NOT EDIT!
'use strict';
var grpc = require('grpc');
var framebuffer_pb = require('./framebuffer_pb.js');
function serialize_DrawResponse(arg) {
if (!(arg instanceof framebuffer_pb.DrawResponse)) {
throw new Error('Expected argument of type DrawResponse');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_DrawResponse(buffer_arg) {
return framebuffer_pb.DrawResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_FrameBuffer(arg) {
if (!(arg instanceof framebuffer_pb.FrameBuffer)) {
throw new Error('Expected argument of type FrameBuffer');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_FrameBuffer(buffer_arg) {
return framebuffer_pb.FrameBuffer.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_FrameSequence(arg) {
if (!(arg instanceof framebuffer_pb.FrameSequence)) {
throw new Error('Expected argument of type FrameSequence');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_FrameSequence(buffer_arg) {
return framebuffer_pb.FrameSequence.deserializeBinary(new Uint8Array(buffer_arg));
}
var DrawerService = exports.DrawerService = {
// DrawFrame draws one frame
drawFrame: {
path: '/Drawer/DrawFrame',
requestStream: false,
responseStream: false,
requestType: framebuffer_pb.FrameBuffer,
responseType: framebuffer_pb.DrawResponse,
requestSerialize: serialize_FrameBuffer,
requestDeserialize: deserialize_FrameBuffer,
responseSerialize: serialize_DrawResponse,
responseDeserialize: deserialize_DrawResponse,
},
// DrawFrames draws a series of frames
drawFrames: {
path: '/Drawer/DrawFrames',
requestStream: false,
responseStream: false,
requestType: framebuffer_pb.FrameSequence,
responseType: framebuffer_pb.DrawResponse,
requestSerialize: serialize_FrameSequence,
requestDeserialize: deserialize_FrameSequence,
responseSerialize: serialize_DrawResponse,
responseDeserialize: deserialize_DrawResponse,
},
};
exports.DrawerClient = grpc.makeGenericClientConstructor(DrawerService);

View File

@ -1,778 +0,0 @@
/**
* @fileoverview
* @enhanceable
* @public
*/
// GENERATED CODE -- DO NOT EDIT!
var jspb = require('google-protobuf');
var goog = jspb;
var global = Function('return this')();
goog.exportSymbol('proto.DrawResponse', null, global);
goog.exportSymbol('proto.FrameBuffer', null, global);
goog.exportSymbol('proto.FrameData', null, global);
goog.exportSymbol('proto.FrameSequence', null, global);
goog.exportSymbol('proto.Layer', null, global);
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.FrameData = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.FrameData.repeatedFields_, null);
};
goog.inherits(proto.FrameData, jspb.Message);
if (goog.DEBUG && !COMPILED) {
proto.FrameData.displayName = 'proto.FrameData';
}
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.FrameData.repeatedFields_ = [1];
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto suitable for use in Soy templates.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance
* for transitional soy proto support: http://goto/soy-param-migration
* @return {!Object}
*/
proto.FrameData.prototype.toObject = function(opt_includeInstance) {
return proto.FrameData.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Whether to include the JSPB
* instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.FrameData} msg The msg instance to transform.
* @return {!Object}
*/
proto.FrameData.toObject = function(includeInstance, msg) {
var f, obj = {
dotsList: jspb.Message.getField(msg, 1),
fill: msg.getFill()
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.FrameData}
*/
proto.FrameData.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.FrameData;
return proto.FrameData.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.FrameData} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.FrameData}
*/
proto.FrameData.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {!Array.<number>} */ (reader.readPackedFixed32());
msg.setDotsList(value);
break;
case 2:
var value = /** @type {number} */ (reader.readFixed32());
msg.setFill(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Class method variant: serializes the given message to binary data
* (in protobuf wire format), writing to the given BinaryWriter.
* @param {!proto.FrameData} message
* @param {!jspb.BinaryWriter} writer
*/
proto.FrameData.serializeBinaryToWriter = function(message, writer) {
message.serializeBinaryToWriter(writer);
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.FrameData.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
this.serializeBinaryToWriter(writer);
return writer.getResultBuffer();
};
/**
* Serializes the message to binary data (in protobuf wire format),
* writing to the given BinaryWriter.
* @param {!jspb.BinaryWriter} writer
*/
proto.FrameData.prototype.serializeBinaryToWriter = function (writer) {
var f = undefined;
f = this.getDotsList();
if (f.length > 0) {
writer.writePackedFixed32(
1,
f
);
}
f = this.getFill();
if (f !== 0) {
writer.writeFixed32(
2,
f
);
}
};
/**
* Creates a deep clone of this proto. No data is shared with the original.
* @return {!proto.FrameData} The clone.
*/
proto.FrameData.prototype.cloneMessage = function() {
return /** @type {!proto.FrameData} */ (jspb.Message.cloneMessage(this));
};
/**
* repeated fixed32 dots = 1;
* If you change this array by adding, removing or replacing elements, or if you
* replace the array itself, then you must call the setter to update it.
* @return {!Array.<number>}
*/
proto.FrameData.prototype.getDotsList = function() {
return /** @type {!Array.<number>} */ (jspb.Message.getField(this, 1));
};
/** @param {Array.<number>} value */
proto.FrameData.prototype.setDotsList = function(value) {
jspb.Message.setField(this, 1, value || []);
};
proto.FrameData.prototype.clearDotsList = function() {
jspb.Message.setField(this, 1, []);
};
/**
* optional fixed32 fill = 2;
* @return {number}
*/
proto.FrameData.prototype.getFill = function() {
return /** @type {number} */ (jspb.Message.getFieldProto3(this, 2, 0));
};
/** @param {number} value */
proto.FrameData.prototype.setFill = function(value) {
jspb.Message.setField(this, 2, value);
};
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.FrameBuffer = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.FrameBuffer, jspb.Message);
if (goog.DEBUG && !COMPILED) {
proto.FrameBuffer.displayName = 'proto.FrameBuffer';
}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto suitable for use in Soy templates.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance
* for transitional soy proto support: http://goto/soy-param-migration
* @return {!Object}
*/
proto.FrameBuffer.prototype.toObject = function(opt_includeInstance) {
return proto.FrameBuffer.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Whether to include the JSPB
* instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.FrameBuffer} msg The msg instance to transform.
* @return {!Object}
*/
proto.FrameBuffer.toObject = function(includeInstance, msg) {
var f, obj = {
frame: (f = msg.getFrame()) && proto.FrameData.toObject(includeInstance, f),
timestamp: msg.getTimestamp(),
layer: msg.getLayer()
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.FrameBuffer}
*/
proto.FrameBuffer.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.FrameBuffer;
return proto.FrameBuffer.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.FrameBuffer} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.FrameBuffer}
*/
proto.FrameBuffer.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = new proto.FrameData;
reader.readMessage(value,proto.FrameData.deserializeBinaryFromReader);
msg.setFrame(value);
break;
case 3:
var value = /** @type {number} */ (reader.readFixed32());
msg.setTimestamp(value);
break;
case 4:
var value = /** @type {!proto.Layer} */ (reader.readEnum());
msg.setLayer(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Class method variant: serializes the given message to binary data
* (in protobuf wire format), writing to the given BinaryWriter.
* @param {!proto.FrameBuffer} message
* @param {!jspb.BinaryWriter} writer
*/
proto.FrameBuffer.serializeBinaryToWriter = function(message, writer) {
message.serializeBinaryToWriter(writer);
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.FrameBuffer.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
this.serializeBinaryToWriter(writer);
return writer.getResultBuffer();
};
/**
* Serializes the message to binary data (in protobuf wire format),
* writing to the given BinaryWriter.
* @param {!jspb.BinaryWriter} writer
*/
proto.FrameBuffer.prototype.serializeBinaryToWriter = function (writer) {
var f = undefined;
f = this.getFrame();
if (f != null) {
writer.writeMessage(
1,
f,
proto.FrameData.serializeBinaryToWriter
);
}
f = this.getTimestamp();
if (f !== 0) {
writer.writeFixed32(
3,
f
);
}
f = this.getLayer();
if (f !== 0.0) {
writer.writeEnum(
4,
f
);
}
};
/**
* Creates a deep clone of this proto. No data is shared with the original.
* @return {!proto.FrameBuffer} The clone.
*/
proto.FrameBuffer.prototype.cloneMessage = function() {
return /** @type {!proto.FrameBuffer} */ (jspb.Message.cloneMessage(this));
};
/**
* optional FrameData frame = 1;
* @return {proto.FrameData}
*/
proto.FrameBuffer.prototype.getFrame = function() {
return /** @type{proto.FrameData} */ (
jspb.Message.getWrapperField(this, proto.FrameData, 1));
};
/** @param {proto.FrameData|undefined} value */
proto.FrameBuffer.prototype.setFrame = function(value) {
jspb.Message.setWrapperField(this, 1, value);
};
proto.FrameBuffer.prototype.clearFrame = function() {
this.setFrame(undefined);
};
/**
* Returns whether this field is set.
* @return{!boolean}
*/
proto.FrameBuffer.prototype.hasFrame = function() {
return jspb.Message.getField(this, 1) != null;
};
/**
* optional fixed32 timestamp = 3;
* @return {number}
*/
proto.FrameBuffer.prototype.getTimestamp = function() {
return /** @type {number} */ (jspb.Message.getFieldProto3(this, 3, 0));
};
/** @param {number} value */
proto.FrameBuffer.prototype.setTimestamp = function(value) {
jspb.Message.setField(this, 3, value);
};
/**
* optional Layer layer = 4;
* @return {!proto.Layer}
*/
proto.FrameBuffer.prototype.getLayer = function() {
return /** @type {!proto.Layer} */ (jspb.Message.getFieldProto3(this, 4, 0));
};
/** @param {!proto.Layer} value */
proto.FrameBuffer.prototype.setLayer = function(value) {
jspb.Message.setField(this, 4, value);
};
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.FrameSequence = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.FrameSequence.repeatedFields_, null);
};
goog.inherits(proto.FrameSequence, jspb.Message);
if (goog.DEBUG && !COMPILED) {
proto.FrameSequence.displayName = 'proto.FrameSequence';
}
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.FrameSequence.repeatedFields_ = [1];
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto suitable for use in Soy templates.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance
* for transitional soy proto support: http://goto/soy-param-migration
* @return {!Object}
*/
proto.FrameSequence.prototype.toObject = function(opt_includeInstance) {
return proto.FrameSequence.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Whether to include the JSPB
* instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.FrameSequence} msg The msg instance to transform.
* @return {!Object}
*/
proto.FrameSequence.toObject = function(includeInstance, msg) {
var f, obj = {
framesList: jspb.Message.toObjectList(msg.getFramesList(),
proto.FrameBuffer.toObject, includeInstance)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.FrameSequence}
*/
proto.FrameSequence.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.FrameSequence;
return proto.FrameSequence.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.FrameSequence} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.FrameSequence}
*/
proto.FrameSequence.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = new proto.FrameBuffer;
reader.readMessage(value,proto.FrameBuffer.deserializeBinaryFromReader);
msg.getFramesList().push(value);
msg.setFramesList(msg.getFramesList());
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Class method variant: serializes the given message to binary data
* (in protobuf wire format), writing to the given BinaryWriter.
* @param {!proto.FrameSequence} message
* @param {!jspb.BinaryWriter} writer
*/
proto.FrameSequence.serializeBinaryToWriter = function(message, writer) {
message.serializeBinaryToWriter(writer);
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.FrameSequence.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
this.serializeBinaryToWriter(writer);
return writer.getResultBuffer();
};
/**
* Serializes the message to binary data (in protobuf wire format),
* writing to the given BinaryWriter.
* @param {!jspb.BinaryWriter} writer
*/
proto.FrameSequence.prototype.serializeBinaryToWriter = function (writer) {
var f = undefined;
f = this.getFramesList();
if (f.length > 0) {
writer.writeRepeatedMessage(
1,
f,
proto.FrameBuffer.serializeBinaryToWriter
);
}
};
/**
* Creates a deep clone of this proto. No data is shared with the original.
* @return {!proto.FrameSequence} The clone.
*/
proto.FrameSequence.prototype.cloneMessage = function() {
return /** @type {!proto.FrameSequence} */ (jspb.Message.cloneMessage(this));
};
/**
* repeated FrameBuffer frames = 1;
* If you change this array by adding, removing or replacing elements, or if you
* replace the array itself, then you must call the setter to update it.
* @return {!Array.<!proto.FrameBuffer>}
*/
proto.FrameSequence.prototype.getFramesList = function() {
return /** @type{!Array.<!proto.FrameBuffer>} */ (
jspb.Message.getRepeatedWrapperField(this, proto.FrameBuffer, 1));
};
/** @param {Array.<!proto.FrameBuffer>} value */
proto.FrameSequence.prototype.setFramesList = function(value) {
jspb.Message.setRepeatedWrapperField(this, 1, value);
};
proto.FrameSequence.prototype.clearFramesList = function() {
this.setFramesList([]);
};
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.DrawResponse = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.DrawResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
proto.DrawResponse.displayName = 'proto.DrawResponse';
}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto suitable for use in Soy templates.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
* @param {boolean=} opt_includeInstance Whether to include the JSPB instance
* for transitional soy proto support: http://goto/soy-param-migration
* @return {!Object}
*/
proto.DrawResponse.prototype.toObject = function(opt_includeInstance) {
return proto.DrawResponse.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Whether to include the JSPB
* instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.DrawResponse} msg The msg instance to transform.
* @return {!Object}
*/
proto.DrawResponse.toObject = function(includeInstance, msg) {
var f, obj = {
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.DrawResponse}
*/
proto.DrawResponse.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.DrawResponse;
return proto.DrawResponse.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.DrawResponse} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.DrawResponse}
*/
proto.DrawResponse.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Class method variant: serializes the given message to binary data
* (in protobuf wire format), writing to the given BinaryWriter.
* @param {!proto.DrawResponse} message
* @param {!jspb.BinaryWriter} writer
*/
proto.DrawResponse.serializeBinaryToWriter = function(message, writer) {
message.serializeBinaryToWriter(writer);
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.DrawResponse.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
this.serializeBinaryToWriter(writer);
return writer.getResultBuffer();
};
/**
* Serializes the message to binary data (in protobuf wire format),
* writing to the given BinaryWriter.
* @param {!jspb.BinaryWriter} writer
*/
proto.DrawResponse.prototype.serializeBinaryToWriter = function (writer) {
var f = undefined;
};
/**
* Creates a deep clone of this proto. No data is shared with the original.
* @return {!proto.DrawResponse} The clone.
*/
proto.DrawResponse.prototype.cloneMessage = function() {
return /** @type {!proto.DrawResponse} */ (jspb.Message.cloneMessage(this));
};
/**
* @enum {number}
*/
proto.Layer = {
NONE: 0,
LIGHT: 10,
COLOR: 20,
NOTIFICATIONS: 90,
GENERAL_0: 40,
GENERAL_1: 41,
GENERAL_2: 42,
GENERAL_3: 43,
GENERAL_4: 44,
GENERAL_5: 45,
GENERAL_6: 46,
GENERAL_7: 47,
GENERAL_8: 48,
GENERAL_9: 49
};
goog.object.extend(exports, proto);

View File

@ -6,9 +6,9 @@
"author": "Ambrose Chua",
"license": "MPL-2.0",
"dependencies": {
"@grpc/grpc-js": "^0.3.6",
"@grpc/proto-loader": "^0.5.0",
"express": "^4.16.4",
"grpc": "^1.19.0"
"@grpc/grpc-js": "^1.0.1",
"@grpc/proto-loader": "^0.5.4",
"express": "^4.17.1",
"grpc": "^1.24.2"
}
}

View File

@ -16,6 +16,7 @@ const express = require('express');
const app = express();
const PORT = 5001;
const PIXEL_COUNT = 275;
// TODO: async
app.post('/on', (req, res, next) => {
@ -31,7 +32,7 @@ app.post('/on', (req, res, next) => {
}
client.drawFrame({
frame: {
fill,
dots: Array(PIXEL_COUNT-1).fill(fill).concat([0xBBFF0000]),
},
layer: 'LIGHT',
}, (err, resp) => {
@ -45,7 +46,7 @@ app.post('/on', (req, res, next) => {
app.post('/off', (req, res, next) => {
client.drawFrame({
frame: {
fill: 0x00000000,
dots: Array(PIXEL_COUNT).fill(0x00000000),
},
layer: 'LIGHT',
}, (err, resp) => {

View File

@ -2,17 +2,17 @@
# yarn lockfile v1
"@grpc/grpc-js@^0.3.6":
version "0.3.6"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-0.3.6.tgz#d9b52043907170d38e06711d9477fde29ab46fa8"
integrity sha512-SmLNuPGlUur64bNS9aHZguqWDVQ8+Df1CGn+xsh7l6T2wiP5ArOMlywZ3TZo6z/rwKtGQgUJY9ZrPYUmHEXd/Q==
"@grpc/grpc-js@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.0.1.tgz#1c09a7a3e276cb1003ff3497f5707e5a74d6c6c5"
integrity sha512-qgdvnNy8IY9LExVNne1vFZAgiVfbZAP+8j0Z8fSN23pjmxlIn5YKze8JV6QkSHIYPmqiufcIw7VNeo4Z+64WlA==
dependencies:
semver "^5.5.0"
semver "^6.2.0"
"@grpc/proto-loader@^0.5.0":
version "0.5.0"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.0.tgz#6d21930530db6089ed68a90f10a22b76fdc3387d"
integrity sha512-kF5toaC4A7PRjAuIxE0fYAv8WarJ6JELYlmHpkoo4EGTFvXUsQwVfyj2bgPV2023M77s2TtDn36wPMJB0sz8nA==
"@grpc/proto-loader@^0.5.4":
version "0.5.4"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.4.tgz#038a3820540f621eeb1b05d81fbedfb045e14de0"
integrity sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==
dependencies:
lodash.camelcase "^4.3.0"
protobufjs "^6.8.6"
@ -70,28 +70,36 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
"@types/long@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef"
integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==
"@types/bytebuffer@^5.0.40":
version "5.0.40"
resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.40.tgz#d6faac40dcfb09cd856cdc4c01d3690ba536d3ee"
integrity sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g==
dependencies:
"@types/long" "*"
"@types/node" "*"
"@types/node@^10.1.0":
version "10.14.4"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.4.tgz#1c586b991457cbb58fef51bc4e0cfcfa347714b5"
integrity sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg==
"@types/long@*", "@types/long@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
"@types/node@*", "@types/node@^13.7.0":
version "13.13.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.2.tgz#160d82623610db590a64e8ca81784e11117e5a54"
integrity sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A==
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
accepts@~1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I=
accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
dependencies:
mime-types "~2.1.18"
negotiator "0.6.1"
mime-types "~2.1.24"
negotiator "0.6.2"
ansi-regex@^2.0.0:
version "2.1.1"
@ -134,21 +142,21 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
body-parser@1.18.3:
version "1.18.3"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=
body-parser@1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
dependencies:
bytes "3.0.0"
bytes "3.1.0"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.2"
http-errors "~1.6.3"
iconv-lite "0.4.23"
http-errors "1.7.2"
iconv-lite "0.4.24"
on-finished "~2.3.0"
qs "6.5.2"
raw-body "2.3.3"
type-is "~1.6.16"
qs "6.7.0"
raw-body "2.4.0"
type-is "~1.6.17"
brace-expansion@^1.1.7:
version "1.1.11"
@ -165,10 +173,10 @@ bytebuffer@~5:
dependencies:
long "~3"
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
bytes@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
camelcase@^2.0.1:
version "2.1.1"
@ -176,9 +184,9 @@ camelcase@^2.0.1:
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
chownr@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
cliui@^3.0.3:
version "3.2.0"
@ -209,10 +217,12 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
content-disposition@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ=
content-disposition@0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
dependencies:
safe-buffer "5.1.2"
content-type@~1.0.4:
version "1.0.4"
@ -224,10 +234,10 @@ cookie-signature@1.0.6:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
cookie@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
cookie@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
core-util-is@~1.0.0:
version "1.0.2"
@ -241,10 +251,10 @@ debug@2.6.9:
dependencies:
ms "2.0.0"
debug@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
debug@^3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
dependencies:
ms "^2.1.1"
@ -298,53 +308,53 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
express@^4.16.4:
version "4.16.4"
resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
express@^4.17.1:
version "4.17.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
dependencies:
accepts "~1.3.5"
accepts "~1.3.7"
array-flatten "1.1.1"
body-parser "1.18.3"
content-disposition "0.5.2"
body-parser "1.19.0"
content-disposition "0.5.3"
content-type "~1.0.4"
cookie "0.3.1"
cookie "0.4.0"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~1.1.2"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
finalhandler "1.1.1"
finalhandler "~1.1.2"
fresh "0.5.2"
merge-descriptors "1.0.1"
methods "~1.1.2"
on-finished "~2.3.0"
parseurl "~1.3.2"
parseurl "~1.3.3"
path-to-regexp "0.1.7"
proxy-addr "~2.0.4"
qs "6.5.2"
range-parser "~1.2.0"
proxy-addr "~2.0.5"
qs "6.7.0"
range-parser "~1.2.1"
safe-buffer "5.1.2"
send "0.16.2"
serve-static "1.13.2"
setprototypeof "1.1.0"
statuses "~1.4.0"
type-is "~1.6.16"
send "0.17.1"
serve-static "1.14.1"
setprototypeof "1.1.1"
statuses "~1.5.0"
type-is "~1.6.18"
utils-merge "1.0.1"
vary "~1.1.2"
finalhandler@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
on-finished "~2.3.0"
parseurl "~1.3.2"
statuses "~1.4.0"
parseurl "~1.3.3"
statuses "~1.5.0"
unpipe "~1.0.0"
forwarded@~0.1.2:
@ -358,11 +368,11 @@ fresh@0.5.2:
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
fs-minipass@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
dependencies:
minipass "^2.2.1"
minipass "^2.6.0"
fs.realpath@^1.0.0:
version "1.0.0"
@ -384,9 +394,9 @@ gauge@~2.7.3:
wide-align "^1.1.0"
glob@^7.0.5, glob@^7.1.3:
version "7.1.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@ -395,15 +405,16 @@ glob@^7.0.5, glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
grpc@^1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.19.0.tgz#129fb30923ea2fa7a9b2623f9e7930eda91a242f"
integrity sha512-xX+jZ1M3YXjngsRj/gTxB4EwM0WoWUr54DmyNq9xTeg1oSuVaTPD/PK9wnZKOJWTt1pkeFspXqwJPhddZNxHOA==
grpc@^1.24.2:
version "1.24.2"
resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.24.2.tgz#76d047bfa7b05b607cbbe3abb99065dcefe0c099"
integrity sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw==
dependencies:
"@types/bytebuffer" "^5.0.40"
lodash.camelcase "^4.3.0"
lodash.clone "^4.5.0"
nan "^2.0.0"
node-pre-gyp "^0.12.0"
nan "^2.13.2"
node-pre-gyp "^0.14.0"
protobufjs "^5.0.3"
has-unicode@^2.0.0:
@ -411,24 +422,29 @@ has-unicode@^2.0.0:
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
version "1.6.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
http-errors@1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
iconv-lite@0.4.23:
version "0.4.23"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==
http-errors@~1.7.2:
version "1.7.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
dependencies:
safer-buffer ">= 2.1.2 < 3"
depd "~1.1.2"
inherits "2.0.4"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
iconv-lite@^0.4.4:
iconv-lite@0.4.24, iconv-lite@^0.4.4:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -436,9 +452,9 @@ iconv-lite@^0.4.4:
safer-buffer ">= 2.1.2 < 3"
ignore-walk@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
version "3.0.3"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
dependencies:
minimatch "^3.0.4"
@ -450,7 +466,12 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@2.0.3, inherits@~2.0.3:
inherits@2, inherits@2.0.4, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
@ -465,10 +486,10 @@ invert-kv@^1.0.0:
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
ipaddr.js@1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4=
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
@ -529,22 +550,22 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
mime-db@~1.38.0:
version "1.38.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad"
integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==
mime-db@1.43.0:
version "1.43.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
mime-types@~2.1.18:
version "2.1.22"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd"
integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==
mime-types@~2.1.24:
version "2.1.26"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
dependencies:
mime-db "~1.38.0"
mime-db "1.43.0"
mime@1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
mime@1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
minimatch@^3.0.4:
version "3.0.4"
@ -553,71 +574,71 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
minipass@^2.2.1, minipass@^2.3.4:
version "2.3.5"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"
minizlib@^1.1.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
minizlib@^1.2.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
dependencies:
minipass "^2.2.1"
minipass "^2.9.0"
mkdirp@^0.5.0, mkdirp@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
dependencies:
minimist "0.0.8"
minimist "^1.2.5"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@^2.1.1:
ms@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
nan@^2.0.0:
version "2.13.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
nan@^2.13.2:
version "2.14.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
needle@^2.2.1:
version "2.3.0"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.0.tgz#ce3fea21197267bacb310705a7bbe24f2a3a3492"
integrity sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==
version "2.4.1"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a"
integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==
dependencies:
debug "^4.1.0"
debug "^3.2.6"
iconv-lite "^0.4.4"
sax "^1.2.4"
negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
node-pre-gyp@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149"
integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==
node-pre-gyp@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
@ -628,28 +649,36 @@ node-pre-gyp@^0.12.0:
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4"
tar "^4.4.2"
nopt@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
dependencies:
abbrev "1"
osenv "^0.1.4"
npm-bundled@^1.0.1:
version "1.0.6"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
version "1.1.1"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
dependencies:
npm-normalize-package-bin "^1.0.1"
npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
npm-packlist@^1.1.6:
version "1.4.1"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
version "1.4.8"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1"
npmlog@^4.0.2:
version "4.1.2"
@ -715,10 +744,10 @@ osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
parseurl@~1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
path-is-absolute@^1.0.0:
version "1.0.1"
@ -731,9 +760,9 @@ path-to-regexp@0.1.7:
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
process-nextick-args@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
protobufjs@^5.0.3:
version "5.0.3"
@ -746,9 +775,9 @@ protobufjs@^5.0.3:
yargs "^3.10.0"
protobufjs@^6.8.6:
version "6.8.8"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c"
integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==
version "6.9.0"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.9.0.tgz#c08b2bf636682598e6fabbf0edb0b1256ff090bd"
integrity sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2"
@ -760,36 +789,36 @@ protobufjs@^6.8.6:
"@protobufjs/path" "^1.1.2"
"@protobufjs/pool" "^1.1.0"
"@protobufjs/utf8" "^1.1.0"
"@types/long" "^4.0.0"
"@types/node" "^10.1.0"
"@types/long" "^4.0.1"
"@types/node" "^13.7.0"
long "^4.0.0"
proxy-addr@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==
proxy-addr@~2.0.5:
version "2.0.6"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
dependencies:
forwarded "~0.1.2"
ipaddr.js "1.8.0"
ipaddr.js "1.9.1"
qs@6.5.2:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
qs@6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
range-parser@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=
range-parser@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
raw-body@2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==
raw-body@2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
dependencies:
bytes "3.0.0"
http-errors "1.6.3"
iconv-lite "0.4.23"
bytes "3.1.0"
http-errors "1.7.2"
iconv-lite "0.4.24"
unpipe "1.0.0"
rc@^1.2.7:
@ -803,9 +832,9 @@ rc@^1.2.7:
strip-json-comments "~2.0.1"
readable-stream@^2.0.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
@ -816,17 +845,22 @@ readable-stream@^2.0.6:
util-deprecate "~1.0.1"
rimraf@^2.6.1:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"
safe-buffer@5.1.2, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@^5.1.2:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
"safer-buffer@>= 2.1.2 < 3":
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
@ -837,15 +871,20 @@ sax@^1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
semver@^5.3.0, semver@^5.5.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
semver@^5.3.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
send@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==
semver@^6.2.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
send@0.17.1:
version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
dependencies:
debug "2.6.9"
depd "~1.1.2"
@ -854,48 +893,43 @@ send@0.16.2:
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
http-errors "~1.6.2"
mime "1.4.1"
ms "2.0.0"
http-errors "~1.7.2"
mime "1.6.0"
ms "2.1.1"
on-finished "~2.3.0"
range-parser "~1.2.0"
statuses "~1.4.0"
range-parser "~1.2.1"
statuses "~1.5.0"
serve-static@1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==
serve-static@1.14.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.2"
send "0.16.2"
parseurl "~1.3.3"
send "0.17.1"
set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
setprototypeof@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
setprototypeof@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
signal-exit@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
"statuses@>= 1.4.0 < 2":
"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
statuses@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@ -939,26 +973,31 @@ strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
tar@^4:
version "4.4.8"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
tar@^4.4.2:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
dependencies:
chownr "^1.1.1"
fs-minipass "^1.2.5"
minipass "^2.3.4"
minizlib "^1.1.1"
minipass "^2.8.6"
minizlib "^1.2.1"
mkdirp "^0.5.0"
safe-buffer "^5.1.2"
yallist "^3.0.2"
yallist "^3.0.3"
type-is@~1.6.16:
version "1.6.16"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
dependencies:
media-typer "0.3.0"
mime-types "~2.1.18"
mime-types "~2.1.24"
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
@ -1010,10 +1049,10 @@ y18n@^3.2.0:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
yallist@^3.0.0, yallist@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
yallist@^3.0.0, yallist@^3.0.3:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
yargs@^3.10.0:
version "3.32.0"

47
draw.go
View File

@ -2,15 +2,20 @@ package main // import "github.com/serverwentdown/leet"
import (
"log"
"time"
ws2811 "github.com/rpi-ws281x/rpi-ws281x-go"
)
// TODO: full-sized grid with multiple channels mapped onto the grid
const (
MAX_LAYERS = 10
)
type Drawer struct {
Length int
layers [][]uint32
length int
device *ws2811.WS2811
}
@ -20,8 +25,14 @@ func NewDrawer(length int) (*Drawer, error) {
opt.Channels[0].Brightness = 255
d := &Drawer{}
d.length = length
d.layers = make([][]uint32, 100)
d.Length = length
d.layers = make([][]uint32, MAX_LAYERS)
for i := range d.layers {
d.layers[i] = make([]uint32, length)
}
for i := range d.layers[0] {
d.layers[0][i] = 0xff000000
}
dev, err := ws2811.MakeWS2811(&opt)
if err != nil {
return nil, err
@ -36,40 +47,37 @@ func NewDrawer(length int) (*Drawer, error) {
}
func (d *Drawer) SetLayer(layer int32, dots []uint32) {
d.layers[layer] = dots
}
func (d *Drawer) SetLayerOrFill(layer int32, dots []uint32, fill uint32) {
if dots == nil {
fillDots := make([]uint32, d.length)
for i := 0; i < d.length; i++ {
fillDots[i] = fill
for i, dot := range dots {
if i > d.Length {
break
}
d.layers[layer] = fillDots
} else {
d.SetLayer(layer, dots)
d.layers[layer][i] = dot
}
}
func (d *Drawer) Draw() error {
for i := 0; i < len(d.device.Leds(0)); i++ {
timeMixStart := time.Now()
for i := 0; i < d.Length; i++ {
dot := mix(d.layers, i)
d.device.Leds(0)[i] = dot
}
timeMixEnd := time.Now()
if err := d.device.Render(); err != nil {
return err
}
log.Printf("mix took %d milliseconds", timeMixEnd.Sub(timeMixStart)/1000/1000)
return nil
}
func mix(layers [][]uint32, j int) uint32 {
func mix(layers [][]uint32, i int) uint32 {
var base uint32
for i := 0; i < len(layers); i++ {
if j >= len(layers[i]) {
for _, layer := range layers {
if i >= len(layer) {
continue
}
base = mixColors(base, layers[i][j])
base = mixColors(layer[i], base)
}
return base
}
@ -81,7 +89,6 @@ func mixColors(a uint32, b uint32) uint32 {
ag, bg := a&uint32(0x0000FF00)>>8, b&uint32(0x0000FF00)>>8
ab, bb := a&uint32(0x000000FF), b&uint32(0x000000FF)
// Apply alpha computation to each channel
log.Println(aa, ar, ag, ab, ba, br, bg, bb)
oa := uint32(ba*(255-aa)/255 + aa)
or := uint32(br*ba*(255-aa)/(255*255) + ar*aa/255)
og := uint32(bg*ba*(255-aa)/(255*255) + ag*aa/255)

View File

@ -1,204 +1,208 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.21.0
// protoc (unknown)
// source: framebuffer.proto
package framebuffer
import (
context "context"
fmt "fmt"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
math "math"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
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)
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4
//
//Layer defines some default layers for compositing animations onto for
//various purposes, and also defines some generic layers. Each service
//should be allocated a unique enum eventually.
//
//In the future, this system should be replaced by a configuration file
//that assigns priorities to each service.
//various purposes.
type Layer int32
const (
Layer_NONE Layer = 0
// Well-known layers
Layer_LIGHT Layer = 10
Layer_COLOR Layer = 20
Layer_NOTIFICATIONS Layer = 90
// Public layers
Layer_GENERAL_0 Layer = 40
Layer_GENERAL_1 Layer = 41
Layer_GENERAL_2 Layer = 42
Layer_GENERAL_3 Layer = 43
Layer_GENERAL_4 Layer = 44
Layer_GENERAL_5 Layer = 45
Layer_GENERAL_6 Layer = 46
Layer_GENERAL_7 Layer = 47
Layer_GENERAL_8 Layer = 48
Layer_GENERAL_9 Layer = 49
Layer_LIGHT Layer = 1
Layer_COLOR Layer = 2
Layer_NOTIFICATIONS Layer = 8
Layer_PRIORITY Layer = 9
)
var Layer_name = map[int32]string{
0: "NONE",
10: "LIGHT",
20: "COLOR",
90: "NOTIFICATIONS",
40: "GENERAL_0",
41: "GENERAL_1",
42: "GENERAL_2",
43: "GENERAL_3",
44: "GENERAL_4",
45: "GENERAL_5",
46: "GENERAL_6",
47: "GENERAL_7",
48: "GENERAL_8",
49: "GENERAL_9",
}
// Enum value maps for Layer.
var (
Layer_name = map[int32]string{
0: "NONE",
1: "LIGHT",
2: "COLOR",
8: "NOTIFICATIONS",
9: "PRIORITY",
}
Layer_value = map[string]int32{
"NONE": 0,
"LIGHT": 1,
"COLOR": 2,
"NOTIFICATIONS": 8,
"PRIORITY": 9,
}
)
var Layer_value = map[string]int32{
"NONE": 0,
"LIGHT": 10,
"COLOR": 20,
"NOTIFICATIONS": 90,
"GENERAL_0": 40,
"GENERAL_1": 41,
"GENERAL_2": 42,
"GENERAL_3": 43,
"GENERAL_4": 44,
"GENERAL_5": 45,
"GENERAL_6": 46,
"GENERAL_7": 47,
"GENERAL_8": 48,
"GENERAL_9": 49,
func (x Layer) Enum() *Layer {
p := new(Layer)
*p = x
return p
}
func (x Layer) String() string {
return proto.EnumName(Layer_name, int32(x))
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Layer) Descriptor() protoreflect.EnumDescriptor {
return file_framebuffer_proto_enumTypes[0].Descriptor()
}
func (Layer) Type() protoreflect.EnumType {
return &file_framebuffer_proto_enumTypes[0]
}
func (x Layer) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Layer.Descriptor instead.
func (Layer) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_4476fbda566a3634, []int{0}
return file_framebuffer_proto_rawDescGZIP(), []int{0}
}
//
//FrameData represents either an array of dots or a fixed fill color to apply
//to all dots. Having two use cases makes it easier for applications to
//draw solid fill colors.
//FrameData represents an ARGB array of dots.
type FrameData struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// ARGB
Dots []uint32 `protobuf:"fixed32,1,rep,packed,name=dots,proto3" json:"dots,omitempty"`
Fill uint32 `protobuf:"fixed32,2,opt,name=fill,proto3" json:"fill,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
Dots []uint32 `protobuf:"fixed32,1,rep,packed,name=dots,proto3" json:"dots,omitempty"`
}
func (m *FrameData) Reset() { *m = FrameData{} }
func (m *FrameData) String() string { return proto.CompactTextString(m) }
func (*FrameData) ProtoMessage() {}
func (x *FrameData) Reset() {
*x = FrameData{}
if protoimpl.UnsafeEnabled {
mi := &file_framebuffer_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *FrameData) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*FrameData) ProtoMessage() {}
func (x *FrameData) ProtoReflect() protoreflect.Message {
mi := &file_framebuffer_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 FrameData.ProtoReflect.Descriptor instead.
func (*FrameData) Descriptor() ([]byte, []int) {
return fileDescriptor_4476fbda566a3634, []int{0}
return file_framebuffer_proto_rawDescGZIP(), []int{0}
}
func (m *FrameData) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FrameData.Unmarshal(m, b)
}
func (m *FrameData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_FrameData.Marshal(b, m, deterministic)
}
func (m *FrameData) XXX_Merge(src proto.Message) {
xxx_messageInfo_FrameData.Merge(m, src)
}
func (m *FrameData) XXX_Size() int {
return xxx_messageInfo_FrameData.Size(m)
}
func (m *FrameData) XXX_DiscardUnknown() {
xxx_messageInfo_FrameData.DiscardUnknown(m)
}
var xxx_messageInfo_FrameData proto.InternalMessageInfo
func (m *FrameData) GetDots() []uint32 {
if m != nil {
return m.Dots
func (x *FrameData) GetDots() []uint32 {
if x != nil {
return x.Dots
}
return nil
}
func (m *FrameData) GetFill() uint32 {
if m != nil {
return m.Fill
}
return 0
}
//
//FrameBuffer represents an entire frame together with a layer tag. It also
//defines a timestamp that can be used within a FrameSequence to define the
//duration a frame will be shown.
type FrameBuffer struct {
Frame *FrameData `protobuf:"bytes,1,opt,name=frame,proto3" json:"frame,omitempty"`
Timestamp uint32 `protobuf:"fixed32,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
Layer Layer `protobuf:"varint,4,opt,name=layer,proto3,enum=Layer" json:"layer,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Frame *FrameData `protobuf:"bytes,1,opt,name=frame,proto3" json:"frame,omitempty"`
// Time offset from start of frame in milliseconds
Timestamp uint32 `protobuf:"fixed32,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
// Layer to apply the frame to
Layer Layer `protobuf:"varint,3,opt,name=layer,proto3,enum=Layer" json:"layer,omitempty"`
}
func (m *FrameBuffer) Reset() { *m = FrameBuffer{} }
func (m *FrameBuffer) String() string { return proto.CompactTextString(m) }
func (*FrameBuffer) ProtoMessage() {}
func (x *FrameBuffer) Reset() {
*x = FrameBuffer{}
if protoimpl.UnsafeEnabled {
mi := &file_framebuffer_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *FrameBuffer) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*FrameBuffer) ProtoMessage() {}
func (x *FrameBuffer) ProtoReflect() protoreflect.Message {
mi := &file_framebuffer_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 FrameBuffer.ProtoReflect.Descriptor instead.
func (*FrameBuffer) Descriptor() ([]byte, []int) {
return fileDescriptor_4476fbda566a3634, []int{1}
return file_framebuffer_proto_rawDescGZIP(), []int{1}
}
func (m *FrameBuffer) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FrameBuffer.Unmarshal(m, b)
}
func (m *FrameBuffer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_FrameBuffer.Marshal(b, m, deterministic)
}
func (m *FrameBuffer) XXX_Merge(src proto.Message) {
xxx_messageInfo_FrameBuffer.Merge(m, src)
}
func (m *FrameBuffer) XXX_Size() int {
return xxx_messageInfo_FrameBuffer.Size(m)
}
func (m *FrameBuffer) XXX_DiscardUnknown() {
xxx_messageInfo_FrameBuffer.DiscardUnknown(m)
}
var xxx_messageInfo_FrameBuffer proto.InternalMessageInfo
func (m *FrameBuffer) GetFrame() *FrameData {
if m != nil {
return m.Frame
func (x *FrameBuffer) GetFrame() *FrameData {
if x != nil {
return x.Frame
}
return nil
}
func (m *FrameBuffer) GetTimestamp() uint32 {
if m != nil {
return m.Timestamp
func (x *FrameBuffer) GetTimestamp() uint32 {
if x != nil {
return x.Timestamp
}
return 0
}
func (m *FrameBuffer) GetLayer() Layer {
if m != nil {
return m.Layer
func (x *FrameBuffer) GetLayer() Layer {
if x != nil {
return x.Layer
}
return Layer_NONE
}
@ -211,118 +215,370 @@ func (m *FrameBuffer) GetLayer() Layer {
//In the future, this should have more metadata like looping counts and async
//animations.
type FrameSequence struct {
Frames []*FrameBuffer `protobuf:"bytes,1,rep,name=frames,proto3" json:"frames,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Frames []*FrameBuffer `protobuf:"bytes,1,rep,name=frames,proto3" json:"frames,omitempty"`
// Number of times to loop the sequence
Loop int32 `protobuf:"varint,2,opt,name=loop,proto3" json:"loop,omitempty"`
}
func (m *FrameSequence) Reset() { *m = FrameSequence{} }
func (m *FrameSequence) String() string { return proto.CompactTextString(m) }
func (*FrameSequence) ProtoMessage() {}
func (x *FrameSequence) Reset() {
*x = FrameSequence{}
if protoimpl.UnsafeEnabled {
mi := &file_framebuffer_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *FrameSequence) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*FrameSequence) ProtoMessage() {}
func (x *FrameSequence) ProtoReflect() protoreflect.Message {
mi := &file_framebuffer_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 FrameSequence.ProtoReflect.Descriptor instead.
func (*FrameSequence) Descriptor() ([]byte, []int) {
return fileDescriptor_4476fbda566a3634, []int{2}
return file_framebuffer_proto_rawDescGZIP(), []int{2}
}
func (m *FrameSequence) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FrameSequence.Unmarshal(m, b)
}
func (m *FrameSequence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_FrameSequence.Marshal(b, m, deterministic)
}
func (m *FrameSequence) XXX_Merge(src proto.Message) {
xxx_messageInfo_FrameSequence.Merge(m, src)
}
func (m *FrameSequence) XXX_Size() int {
return xxx_messageInfo_FrameSequence.Size(m)
}
func (m *FrameSequence) XXX_DiscardUnknown() {
xxx_messageInfo_FrameSequence.DiscardUnknown(m)
}
var xxx_messageInfo_FrameSequence proto.InternalMessageInfo
func (m *FrameSequence) GetFrames() []*FrameBuffer {
if m != nil {
return m.Frames
func (x *FrameSequence) GetFrames() []*FrameBuffer {
if x != nil {
return x.Frames
}
return nil
}
func (x *FrameSequence) GetLoop() int32 {
if x != nil {
return x.Loop
}
return 0
}
type DrawResponse struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
}
func (m *DrawResponse) Reset() { *m = DrawResponse{} }
func (m *DrawResponse) String() string { return proto.CompactTextString(m) }
func (*DrawResponse) ProtoMessage() {}
func (x *DrawResponse) Reset() {
*x = DrawResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_framebuffer_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *DrawResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*DrawResponse) ProtoMessage() {}
func (x *DrawResponse) ProtoReflect() protoreflect.Message {
mi := &file_framebuffer_proto_msgTypes[3]
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 DrawResponse.ProtoReflect.Descriptor instead.
func (*DrawResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_4476fbda566a3634, []int{3}
return file_framebuffer_proto_rawDescGZIP(), []int{3}
}
func (m *DrawResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DrawResponse.Unmarshal(m, b)
}
func (m *DrawResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_DrawResponse.Marshal(b, m, deterministic)
}
func (m *DrawResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_DrawResponse.Merge(m, src)
}
func (m *DrawResponse) XXX_Size() int {
return xxx_messageInfo_DrawResponse.Size(m)
}
func (m *DrawResponse) XXX_DiscardUnknown() {
xxx_messageInfo_DrawResponse.DiscardUnknown(m)
type LengthRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
}
var xxx_messageInfo_DrawResponse proto.InternalMessageInfo
func init() {
proto.RegisterEnum("Layer", Layer_name, Layer_value)
proto.RegisterType((*FrameData)(nil), "FrameData")
proto.RegisterType((*FrameBuffer)(nil), "FrameBuffer")
proto.RegisterType((*FrameSequence)(nil), "FrameSequence")
proto.RegisterType((*DrawResponse)(nil), "DrawResponse")
func (x *LengthRequest) Reset() {
*x = LengthRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_framebuffer_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func init() { proto.RegisterFile("framebuffer.proto", fileDescriptor_4476fbda566a3634) }
func (x *LengthRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
var fileDescriptor_4476fbda566a3634 = []byte{
// 349 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x92, 0x4f, 0x6f, 0xaa, 0x40,
0x14, 0xc5, 0xe5, 0x29, 0xbc, 0xc7, 0x55, 0xcc, 0x78, 0xf3, 0x16, 0xe4, 0xc5, 0x05, 0x21, 0x6f,
0x41, 0x6d, 0xa5, 0x8a, 0xb5, 0x7f, 0x96, 0xd6, 0x7f, 0x25, 0x21, 0x90, 0x8c, 0xae, 0xba, 0x69,
0xd0, 0x0e, 0x89, 0xa9, 0x8a, 0x05, 0x4c, 0xd3, 0x6f, 0xd9, 0x8f, 0xd4, 0xcc, 0xd8, 0xd8, 0x31,
0xdd, 0x9d, 0xdf, 0xb9, 0x97, 0x93, 0xcb, 0xc9, 0x40, 0x23, 0xc9, 0xe2, 0x0d, 0x5b, 0xec, 0x93,
0x84, 0x65, 0xee, 0x2e, 0x4b, 0x8b, 0xd4, 0xee, 0x81, 0x3e, 0xe1, 0xe6, 0x28, 0x2e, 0x62, 0x44,
0xa8, 0x3c, 0xa7, 0x45, 0x6e, 0x2a, 0x56, 0xd9, 0xf9, 0x4d, 0x85, 0xe6, 0x5e, 0xb2, 0x5a, 0xaf,
0xcd, 0x5f, 0x96, 0xc2, 0x3d, 0xae, 0xed, 0x17, 0xa8, 0x8a, 0x8f, 0xee, 0x45, 0x12, 0x5a, 0xa0,
0x8a, 0x60, 0x53, 0xb1, 0x14, 0xa7, 0xea, 0x81, 0x7b, 0x4c, 0xa4, 0x87, 0x01, 0x36, 0x41, 0x2f,
0x56, 0x1b, 0x96, 0x17, 0xf1, 0x66, 0x67, 0x96, 0x45, 0xd2, 0xb7, 0x81, 0x4d, 0x50, 0xd7, 0xf1,
0x3b, 0xcb, 0xcc, 0x8a, 0xa5, 0x38, 0x75, 0x4f, 0x73, 0x03, 0x4e, 0xf4, 0x60, 0xda, 0x7d, 0x30,
0x44, 0xde, 0x8c, 0xbd, 0xee, 0xd9, 0x76, 0xc9, 0xf0, 0x3f, 0x68, 0x22, 0xf5, 0x70, 0x67, 0xd5,
0xab, 0xb9, 0xd2, 0x31, 0xf4, 0x6b, 0x66, 0xd7, 0xa1, 0x36, 0xca, 0xe2, 0x37, 0xca, 0xf2, 0x5d,
0xba, 0xcd, 0x59, 0xeb, 0x43, 0x01, 0x55, 0xe4, 0xe2, 0x1f, 0xa8, 0x84, 0x51, 0x38, 0x26, 0x25,
0xd4, 0x41, 0x0d, 0xfc, 0xe9, 0xc3, 0x9c, 0x00, 0x97, 0xc3, 0x28, 0x88, 0x28, 0xf9, 0x8b, 0x0d,
0x30, 0xc2, 0x68, 0xee, 0x4f, 0xfc, 0xe1, 0x60, 0xee, 0x47, 0xe1, 0x8c, 0x3c, 0xa2, 0x01, 0xfa,
0x74, 0x1c, 0x8e, 0xe9, 0x20, 0x78, 0xea, 0x10, 0x47, 0xc6, 0x2e, 0x39, 0x93, 0xd1, 0x23, 0x2d,
0x19, 0x7b, 0xe4, 0x5c, 0xc6, 0x2b, 0x72, 0x21, 0x63, 0x9f, 0xb4, 0x65, 0xbc, 0x26, 0xae, 0x8c,
0x37, 0xe4, 0x52, 0xc6, 0x5b, 0xd2, 0x91, 0xf1, 0x8e, 0x74, 0xbd, 0x25, 0x68, 0xfc, 0x17, 0x59,
0x86, 0x2d, 0xd0, 0xb9, 0x12, 0x3d, 0xe0, 0x49, 0x1f, 0xff, 0x0c, 0x57, 0xae, 0xc1, 0x2e, 0x61,
0x1b, 0xe0, 0xb8, 0x9b, 0x63, 0xdd, 0x3d, 0x29, 0xf7, 0xc7, 0xfa, 0x42, 0x13, 0xef, 0xa4, 0xf7,
0x19, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x99, 0xbe, 0xf0, 0x3c, 0x02, 0x00, 0x00,
func (*LengthRequest) ProtoMessage() {}
func (x *LengthRequest) ProtoReflect() protoreflect.Message {
mi := &file_framebuffer_proto_msgTypes[4]
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 LengthRequest.ProtoReflect.Descriptor instead.
func (*LengthRequest) Descriptor() ([]byte, []int) {
return file_framebuffer_proto_rawDescGZIP(), []int{4}
}
type LengthResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Length uint32 `protobuf:"fixed32,1,opt,name=length,proto3" json:"length,omitempty"`
}
func (x *LengthResponse) Reset() {
*x = LengthResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_framebuffer_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *LengthResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*LengthResponse) ProtoMessage() {}
func (x *LengthResponse) ProtoReflect() protoreflect.Message {
mi := &file_framebuffer_proto_msgTypes[5]
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 LengthResponse.ProtoReflect.Descriptor instead.
func (*LengthResponse) Descriptor() ([]byte, []int) {
return file_framebuffer_proto_rawDescGZIP(), []int{5}
}
func (x *LengthResponse) GetLength() uint32 {
if x != nil {
return x.Length
}
return 0
}
var File_framebuffer_proto protoreflect.FileDescriptor
var file_framebuffer_proto_rawDesc = []byte{
0x0a, 0x11, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x22, 0x1f, 0x0a, 0x09, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61,
0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x07, 0x52, 0x04,
0x64, 0x6f, 0x74, 0x73, 0x22, 0x6b, 0x0a, 0x0b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x42, 0x75, 0x66,
0x66, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x05, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05,
0x66, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01,
0x28, 0x0e, 0x32, 0x06, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65,
0x72, 0x22, 0x49, 0x0a, 0x0d, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e,
0x63, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72,
0x52, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x6f, 0x70,
0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0x0e, 0x0a, 0x0c,
0x44, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x0a, 0x0d,
0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x28, 0x0a,
0x0e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x52,
0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2a, 0x48, 0x0a, 0x05, 0x4c, 0x61, 0x79, 0x65, 0x72,
0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x49,
0x47, 0x48, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x10, 0x02,
0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e,
0x53, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x10,
0x09, 0x32, 0x93, 0x01, 0x0a, 0x06, 0x44, 0x72, 0x61, 0x77, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x09,
0x44, 0x72, 0x61, 0x77, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0c, 0x2e, 0x46, 0x72, 0x61, 0x6d,
0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x1a, 0x0d, 0x2e, 0x44, 0x72, 0x61, 0x77, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x0a, 0x44, 0x72, 0x61, 0x77,
0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x0e, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x65,
0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x1a, 0x0d, 0x2e, 0x44, 0x72, 0x61, 0x77, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x65,
0x6e, 0x67, 0x74, 0x68, 0x12, 0x0e, 0x2e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_framebuffer_proto_rawDescOnce sync.Once
file_framebuffer_proto_rawDescData = file_framebuffer_proto_rawDesc
)
func file_framebuffer_proto_rawDescGZIP() []byte {
file_framebuffer_proto_rawDescOnce.Do(func() {
file_framebuffer_proto_rawDescData = protoimpl.X.CompressGZIP(file_framebuffer_proto_rawDescData)
})
return file_framebuffer_proto_rawDescData
}
var file_framebuffer_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_framebuffer_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_framebuffer_proto_goTypes = []interface{}{
(Layer)(0), // 0: Layer
(*FrameData)(nil), // 1: FrameData
(*FrameBuffer)(nil), // 2: FrameBuffer
(*FrameSequence)(nil), // 3: FrameSequence
(*DrawResponse)(nil), // 4: DrawResponse
(*LengthRequest)(nil), // 5: LengthRequest
(*LengthResponse)(nil), // 6: LengthResponse
}
var file_framebuffer_proto_depIdxs = []int32{
1, // 0: FrameBuffer.frame:type_name -> FrameData
0, // 1: FrameBuffer.layer:type_name -> Layer
2, // 2: FrameSequence.frames:type_name -> FrameBuffer
2, // 3: Drawer.DrawFrame:input_type -> FrameBuffer
3, // 4: Drawer.DrawFrames:input_type -> FrameSequence
5, // 5: Drawer.GetLength:input_type -> LengthRequest
4, // 6: Drawer.DrawFrame:output_type -> DrawResponse
4, // 7: Drawer.DrawFrames:output_type -> DrawResponse
6, // 8: Drawer.GetLength:output_type -> LengthResponse
6, // [6:9] is the sub-list for method output_type
3, // [3:6] is the sub-list for method input_type
3, // [3:3] is the sub-list for extension type_name
3, // [3:3] is the sub-list for extension extendee
0, // [0:3] is the sub-list for field type_name
}
func init() { file_framebuffer_proto_init() }
func file_framebuffer_proto_init() {
if File_framebuffer_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_framebuffer_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FrameData); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_framebuffer_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FrameBuffer); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_framebuffer_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FrameSequence); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_framebuffer_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*DrawResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_framebuffer_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*LengthRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_framebuffer_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*LengthResponse); 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_framebuffer_proto_rawDesc,
NumEnums: 1,
NumMessages: 6,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_framebuffer_proto_goTypes,
DependencyIndexes: file_framebuffer_proto_depIdxs,
EnumInfos: file_framebuffer_proto_enumTypes,
MessageInfos: file_framebuffer_proto_msgTypes,
}.Build()
File_framebuffer_proto = out.File
file_framebuffer_proto_rawDesc = nil
file_framebuffer_proto_goTypes = nil
file_framebuffer_proto_depIdxs = nil
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
var _ grpc.ClientConnInterface
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
const _ = grpc.SupportPackageIsVersion6
// DrawerClient is the client API for Drawer service.
//
@ -332,13 +588,15 @@ type DrawerClient interface {
DrawFrame(ctx context.Context, in *FrameBuffer, opts ...grpc.CallOption) (*DrawResponse, error)
// DrawFrames draws a series of frames
DrawFrames(ctx context.Context, in *FrameSequence, opts ...grpc.CallOption) (*DrawResponse, error)
// GetLength returns the length of the strip
GetLength(ctx context.Context, in *LengthRequest, opts ...grpc.CallOption) (*LengthResponse, error)
}
type drawerClient struct {
cc *grpc.ClientConn
cc grpc.ClientConnInterface
}
func NewDrawerClient(cc *grpc.ClientConn) DrawerClient {
func NewDrawerClient(cc grpc.ClientConnInterface) DrawerClient {
return &drawerClient{cc}
}
@ -360,12 +618,37 @@ func (c *drawerClient) DrawFrames(ctx context.Context, in *FrameSequence, opts .
return out, nil
}
func (c *drawerClient) GetLength(ctx context.Context, in *LengthRequest, opts ...grpc.CallOption) (*LengthResponse, error) {
out := new(LengthResponse)
err := c.cc.Invoke(ctx, "/Drawer/GetLength", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// DrawerServer is the server API for Drawer service.
type DrawerServer interface {
// DrawFrame draws one frame
DrawFrame(context.Context, *FrameBuffer) (*DrawResponse, error)
// DrawFrames draws a series of frames
DrawFrames(context.Context, *FrameSequence) (*DrawResponse, error)
// GetLength returns the length of the strip
GetLength(context.Context, *LengthRequest) (*LengthResponse, error)
}
// UnimplementedDrawerServer can be embedded to have forward compatible implementations.
type UnimplementedDrawerServer struct {
}
func (*UnimplementedDrawerServer) DrawFrame(context.Context, *FrameBuffer) (*DrawResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method DrawFrame not implemented")
}
func (*UnimplementedDrawerServer) DrawFrames(context.Context, *FrameSequence) (*DrawResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method DrawFrames not implemented")
}
func (*UnimplementedDrawerServer) GetLength(context.Context, *LengthRequest) (*LengthResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetLength not implemented")
}
func RegisterDrawerServer(s *grpc.Server, srv DrawerServer) {
@ -408,6 +691,24 @@ func _Drawer_DrawFrames_Handler(srv interface{}, ctx context.Context, dec func(i
return interceptor(ctx, in, info, handler)
}
func _Drawer_GetLength_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(LengthRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(DrawerServer).GetLength(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/Drawer/GetLength",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(DrawerServer).GetLength(ctx, req.(*LengthRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Drawer_serviceDesc = grpc.ServiceDesc{
ServiceName: "Drawer",
HandlerType: (*DrawerServer)(nil),
@ -420,6 +721,10 @@ var _Drawer_serviceDesc = grpc.ServiceDesc{
MethodName: "DrawFrames",
Handler: _Drawer_DrawFrames_Handler,
},
{
MethodName: "GetLength",
Handler: _Drawer_GetLength_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "framebuffer.proto",

View File

@ -2,40 +2,23 @@ syntax = "proto3";
/*
Layer defines some default layers for compositing animations onto for
various purposes, and also defines some generic layers. Each service
should be allocated a unique enum eventually.
In the future, this system should be replaced by a configuration file
that assigns priorities to each service.
various purposes.
*/
enum Layer {
NONE = 0;
// Well-known layers
LIGHT = 10;
COLOR = 20;
NOTIFICATIONS = 90;
// Public layers
GENERAL_0 = 40;
GENERAL_1 = 41;
GENERAL_2 = 42;
GENERAL_3 = 43;
GENERAL_4 = 44;
GENERAL_5 = 45;
GENERAL_6 = 46;
GENERAL_7 = 47;
GENERAL_8 = 48;
GENERAL_9 = 49;
LIGHT = 1;
COLOR = 2;
NOTIFICATIONS = 8;
PRIORITY = 9;
}
/*
FrameData represents either an array of dots or a fixed fill color to apply
to all dots. Having two use cases makes it easier for applications to
draw solid fill colors.
FrameData represents an ARGB array of dots.
*/
message FrameData {
// ARGB
repeated fixed32 dots = 1;
fixed32 fill = 2;
}
/*
@ -45,8 +28,10 @@ message FrameData {
*/
message FrameBuffer {
FrameData frame = 1;
fixed32 timestamp = 3;
Layer layer = 4;
// Time offset from start of frame in milliseconds
fixed32 timestamp = 2;
// Layer to apply the frame to
Layer layer = 3;
}
/*
@ -59,15 +44,26 @@ message FrameBuffer {
*/
message FrameSequence {
repeated FrameBuffer frames = 1;
// Number of times to loop the sequence
int32 loop = 2;
}
message DrawResponse {
}
message LengthRequest {
}
message LengthResponse {
fixed32 length = 1;
}
service Drawer {
// DrawFrame draws one frame
rpc DrawFrame (FrameBuffer) returns (DrawResponse) {}
// DrawFrames draws a series of frames
rpc DrawFrames (FrameSequence) returns (DrawResponse) {}
// GetLength returns the length of the strip
rpc GetLength (LengthRequest) returns (LengthResponse) {}
}

9
go.mod
View File

@ -2,10 +2,9 @@ module github.com/serverwentdown/leet
go 1.12
replace github.com/rpi-ws281x/rpi-ws281x-go => github.com/serverwentdown/rpi-ws281x-go v1.0.4
require (
github.com/golang/protobuf v1.3.1
github.com/rpi-ws281x/rpi-ws281x-go v0.0.0-00010101000000-000000000000
google.golang.org/grpc v1.19.1
github.com/golang/protobuf v1.4.0
github.com/rpi-ws281x/rpi-ws281x-go v1.0.5
google.golang.org/grpc v1.29.0
google.golang.org/protobuf v1.21.0
)

61
go.sum
View File

@ -1,6 +1,13 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
@ -8,23 +15,77 @@ github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0 h1:aRz0NBceriICVtjhCgKkDvl+RudKu1CT6h0ZvUTrNfE=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rpi-ws281x/rpi-ws281x-go v1.0.5 h1:XZ4S5je+Sj3PKbTKGcsg92AhThZHQ0jnYG5YFqRU3YQ=
github.com/rpi-ws281x/rpi-ws281x-go v1.0.5/go.mod h1:Swt7ePLxEtCqQvFZZPHsnfstkaVRVICwC8Di6SdeO30=
github.com/serverwentdown/rpi-ws281x-go v1.0.4 h1:Ti+oxrYcU/lp0NjBl/y0EMcJp9gqvKJka2zFSCM2r2c=
github.com/serverwentdown/rpi-ws281x-go v1.0.4/go.mod h1:NJ9ZCa/NPRHHb841qr+G9IEJe1J4aOgBMwkf9xyDnmk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522 h1:Ve1ORMCxvRmSXBwJK+t3Oy+V2vRW2OetUQBq4rJIkZE=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.19.1 h1:TrBcJ1yqAl1G++wO39nD/qtgpsW9/1+QGrluyMGEYgM=
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

View File

@ -9,7 +9,7 @@ import (
)
const listen = ":5000"
const length = 287
const length = 275
func main() {
log.Print("starting server")
@ -20,7 +20,7 @@ func main() {
}
s := grpc.NewServer()
drawer, err := NewDrawer(287)
drawer, err := NewDrawer(length)
if err != nil {
log.Fatalf("failed to setup WS281x library: %v", err)
}

View File

@ -5,6 +5,7 @@ package main // import "github.com/serverwentdown/leet"
import (
"context"
"log"
"time"
"github.com/serverwentdown/leet/framebuffer"
)
@ -21,12 +22,14 @@ func NewServer(drawer *Drawer) *Server {
}
func (s *Server) DrawFrame(ctx context.Context, in *framebuffer.FrameBuffer) (*framebuffer.DrawResponse, error) {
log.Print("DrawFrame")
s.drawer.SetLayerOrFill(int32(in.Layer), in.Frame.Dots, in.Frame.Fill)
s.drawer.SetLayer(int32(in.Layer), in.Frame.Dots)
timeDrawStart := time.Now()
err := s.drawer.Draw()
timeDrawEnd := time.Now()
if err != nil {
return nil, err
}
log.Printf("Draw took %d milliseconds", timeDrawEnd.Sub(timeDrawStart)/1000/1000)
return &framebuffer.DrawResponse{}, nil
}
@ -34,3 +37,10 @@ func (s *Server) DrawFrames(ctx context.Context, in *framebuffer.FrameSequence)
log.Print("Received FrameSequence, but not implemented")
return &framebuffer.DrawResponse{}, nil
}
func (s *Server) GetLength(ctx context.Context, in *framebuffer.LengthRequest) (*framebuffer.LengthResponse, error) {
length := uint32(s.drawer.Length)
return &framebuffer.LengthResponse{
Length: length,
}, nil
}