PK ۈTH^nnindex.js(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports"], factory); } else if (typeof exports !== "undefined") { factory(exports); } else { var mod = { exports: {} }; factory(mod.exports); global.unknown = mod.exports; } })(this, function (_exports) { "use strict"; Object.defineProperty(_exports, "__esModule", { value: true }); _exports.default = void 0; !function (global) { "use strict"; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty; var undefined; var $Symbol = typeof Symbol === "function" ? Symbol : {}; var iteratorSymbol = $Symbol.iterator || "@@iterator"; var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; var inModule = typeof module === "object"; var runtime = global.regeneratorRuntime; if (runtime) { if (inModule) { module.exports = runtime; } return; } runtime = global.regeneratorRuntime = inModule ? module.exports || {} : {}; function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; var generator = Object.create(protoGenerator.prototype); var context = new Context(tryLocsList || []); generator._invoke = makeInvokeMethod(innerFn, self, context); return generator; } runtime.wrap = wrap; function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } var GenStateSuspendedStart = "suspendedStart"; var GenStateSuspendedYield = "suspendedYield"; var GenStateExecuting = "executing"; var GenStateCompleted = "completed"; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; IteratorPrototype[iteratorSymbol] = function () { return this; }; var getProto = Object.getPrototypeOf; var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { IteratorPrototype = NativeIteratorPrototype; } var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; GeneratorFunctionPrototype.constructor = GeneratorFunction; GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { prototype[method] = function (arg) { return this._invoke(method, arg); }; }); } runtime.isGeneratorFunction = function (genFun) { var ctor = typeof genFun === "function" && genFun.constructor; return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false; }; runtime.mark = function (genFun) { if (Object.setPrototypeOf) { Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); } else { genFun.__proto__ = GeneratorFunctionPrototype; if (!(toStringTagSymbol in genFun)) { genFun[toStringTagSymbol] = "GeneratorFunction"; } } genFun.prototype = Object.create(Gp); return genFun; }; runtime.awrap = function (arg) { return { __await: arg }; }; function AsyncIterator(generator) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (record.type === "throw") { reject(record.arg); } else { var result = record.arg; var value = result.value; if (value && typeof value === "object" && hasOwn.call(value, "__await")) { return Promise.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }); } return Promise.resolve(value).then(function (unwrapped) { result.value = unwrapped; resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } } var previousPromise; function enqueue(method, arg) { function callInvokeWithMethodAndArg() { return new Promise(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } this._invoke = enqueue; } defineIteratorMethods(AsyncIterator.prototype); AsyncIterator.prototype[asyncIteratorSymbol] = function () { return this; }; runtime.AsyncIterator = AsyncIterator; runtime.async = function (innerFn, outerFn, self, tryLocsList) { var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList)); return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }; function makeInvokeMethod(innerFn, self, context) { var state = GenStateSuspendedStart; return function invoke(method, arg) { if (state === GenStateExecuting) { throw new Error("Generator is already running"); } if (state === GenStateCompleted) { if (method === "throw") { throw arg; } return doneResult(); } context.method = method; context.arg = arg; while (true) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (context.method === "next") { context.sent = context._sent = context.arg; } else if (context.method === "throw") { if (state === GenStateSuspendedStart) { state = GenStateCompleted; throw context.arg; } context.dispatchException(context.arg); } else if (context.method === "return") { context.abrupt("return", context.arg); } state = GenStateExecuting; var record = tryCatch(innerFn, self, context); if (record.type === "normal") { state = context.done ? GenStateCompleted : GenStateSuspendedYield; if (record.arg === ContinueSentinel) { continue; } return { value: record.arg, done: context.done }; } else if (record.type === "throw") { state = GenStateCompleted; context.method = "throw"; context.arg = record.arg; } } }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (method === undefined) { context.delegate = null; if (context.method === "throw") { if (delegate.iterator.return) { context.method = "return"; context.arg = undefined; maybeInvokeDelegate(delegate, context); if (context.method === "throw") { return ContinueSentinel; } } context.method = "throw"; context.arg = new TypeError("The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if (record.type === "throw") { context.method = "throw"; context.arg = record.arg; context.delegate = null; return ContinueSentinel; } var info = record.arg; if (!info) { context.method = "throw"; context.arg = new TypeError("iterator result is not an object"); context.delegate = null; return ContinueSentinel; } if (info.done) { context[delegate.resultName] = info.value; context.next = delegate.nextLoc; if (context.method !== "return") { context.method = "next"; context.arg = undefined; } } else { return info; } context.delegate = null; return ContinueSentinel; } defineIteratorMethods(Gp); Gp[toStringTagSymbol] = "Generator"; Gp[iteratorSymbol] = function () { return this; }; Gp.toString = function () { return "[object Generator]"; }; function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; if (1 in locs) { entry.catchLoc = locs[1]; } if (2 in locs) { entry.finallyLoc = locs[2]; entry.afterLoc = locs[3]; } this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal"; delete record.arg; entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }]; tryLocsList.forEach(pushTryEntry, this); this.reset(true); } runtime.keys = function (object) { var keys = []; for (var key in object) { keys.push(key); } keys.reverse(); return function next() { while (keys.length) { var key = keys.pop(); if (key in object) { next.value = key; next.done = false; return next; } } next.done = true; return next; }; }; function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) { return iteratorMethod.call(iterable); } if (typeof iterable.next === "function") { return iterable; } if (!isNaN(iterable.length)) { var i = -1, next = function next() { while (++i < iterable.length) { if (hasOwn.call(iterable, i)) { next.value = iterable[i]; next.done = false; return next; } } next.value = undefined; next.done = true; return next; }; return next.next = next; } } return { next: doneResult }; } runtime.values = values; function doneResult() { return { value: undefined, done: true }; } Context.prototype = { constructor: Context, reset: function (skipTempReset) { this.prev = 0; this.next = 0; this.sent = this._sent = undefined; this.done = false; this.delegate = null; this.method = "next"; this.arg = undefined; this.tryEntries.forEach(resetTryEntry); if (!skipTempReset) { for (var name in this) { if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { this[name] = undefined; } } } }, stop: function () { this.done = true; var rootEntry = this.tryEntries[0]; var rootRecord = rootEntry.completion; if (rootRecord.type === "throw") { throw rootRecord.arg; } return this.rval; }, dispatchException: function (exception) { if (this.done) { throw exception; } var context = this; function handle(loc, caught) { record.type = "throw"; record.arg = exception; context.next = loc; if (caught) { context.method = "next"; context.arg = undefined; } return !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; var record = entry.completion; if (entry.tryLoc === "root") { return handle("end"); } if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"); var hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } else if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else if (hasCatch) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } } else if (hasFinally) { if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else { throw new Error("try statement without catch or finally"); } } } }, abrupt: function (type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { finallyEntry = null; } var record = finallyEntry ? finallyEntry.completion : {}; record.type = type; record.arg = arg; if (finallyEntry) { this.method = "next"; this.next = finallyEntry.finallyLoc; return ContinueSentinel; } return this.complete(record); }, complete: function (record, afterLoc) { if (record.type === "throw") { throw record.arg; } if (record.type === "break" || record.type === "continue") { this.next = record.arg; } else if (record.type === "return") { this.rval = this.arg = record.arg; this.method = "return"; this.next = "end"; } else if (record.type === "normal" && afterLoc) { this.next = afterLoc; } return ContinueSentinel; }, finish: function (finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) { this.complete(entry.completion, entry.afterLoc); resetTryEntry(entry); return ContinueSentinel; } } }, "catch": function (tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (record.type === "throw") { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function (iterable, resultName, nextLoc) { this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }; if (this.method === "next") { this.arg = undefined; } return ContinueSentinel; } }; }(function () { return this || typeof self === "object" && self; }() || Function("return this")()); const disableBlocks = { debug: [], upload: [] }; const mustLoginBlocks = []; const triggerBlocksStatus = async (mode, app) => {}; class ExtImpl {} const extTranslationMap = { "zh": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "de": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "es": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "fr": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "id": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "ja": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "ja-jph": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "ko": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "pl": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "uk": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "zh-hant": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "nl": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "it": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "hr": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "ru": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "pt": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "fi": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "tr": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "tk": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }, "en": { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" } }; const codeSnippets = { arduinoc: {} }; const extGenerators = [{ lang: 'arduinoc', template: `// generated by mBlock5 for // codes make you happy //( include //) #include //( lib //) //({ this.$ALL_VARIABLES.length==0?'':this.$ALL_VARIABLES.map(v=>"float "+v+" = 0;").join('\\n') }//) //( declare //) void _delay(float seconds) { long endTime = millis() + seconds * 1000; while(millis() < endTime) _loop(); } //( void setup() { //( setup //) //( code //) } //) void _loop() { //( _loop //) } void loop() { _loop(); }`, splitor: { frame: { left: "//(", right: "//)" }, expression: { left: "/*{", right: "}*/" } }, reducers: [{ name: 'include', reduce: codes => { let codes1 = []; for (let code of codes) { let codeStr = ''; if (typeof code === 'string') { codeStr = code; } else if (typeof code === 'function') { codeStr = code(); } if (codes1.indexOf(codeStr) === -1) { codes1.push(codeStr); } } if (codes1.length === 0) { return undefined; } return codes1.map(code => { return '#include ' + code; }).join('\n') + '\n'; } }] }]; const extSources = { arduino: [{ filename: "src/Grove_I2C_Motor_Driver.cpp", code: "/*\n Grove_I2C_Motor_Driver.cpp\n A library for Grove - I2C Motor Driver v1.3\n\n Copyright (c) 2012 seeed technology inc.\n Website : www.seeed.cc\n Author : Jerry Yip\n Create Time: 2017-02\n Change Log : 2018-05-31 1.support two phase stepper motor\n\n The MIT License (MIT)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n*/\n\n\n#include \"Grove_I2C_Motor_Driver.h\"\n#include \n\n/*********************************stepper motor type*******************************/\n// Define stepper motor type. Support 4 phase stepper motor by default.\n// If 2 phase motor is used, define TWO_PHASE_STEPPER_MOTOR in the ino file.\n// #define TWO_PHASE_STEPPER_MOTOR\n\n// *********************************Initialize*********************************\n// Initialize I2C with an I2C address you set on Grove - I2C Motor Driver v1.3\n// default i2c address: 0x0f\nint I2CMotorDriver::begin(unsigned char i2c_add) {\n if (i2c_add > 0x0f) {\n Serial.println(\"Error! I2C address must be between 0x00 to 0x0F\");\n return (-1); // I2C address error\n }\n Wire.begin();\n delayMicroseconds(10000);\n this->_i2c_add = i2c_add;\n // Set default frequence to F_3921Hz\n frequence(F_3921Hz);\n return (0); // OK\n}\n\n// *****************************Private Function*******************************\n// Set the direction of 2 motors\n// _direction: M1CWM2ACW(M1 ClockWise M2 AntiClockWise), M1ACWM2CW, BothClockWise, BothAntiClockWise,\nvoid I2CMotorDriver::direction(unsigned char _direction) {\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(DirectionSet); // Direction control header\n Wire.write(_direction); // send direction control information\n Wire.write(Nothing); // need to send this byte as the third byte(no meaning)\n Wire.endTransmission(); // stop transmitting\n delay(4); \t\t\t\t // wait\n}\n\n// *****************************DC Motor Function******************************\n// Set the speed of a motor, speed is equal to duty cycle here\n// motor_id: MOTOR1, MOTOR2\n// _speed: -100~100, when _speed>0, dc motor runs clockwise; when _speed<0,\n// dc motor runs anticlockwise\nvoid I2CMotorDriver::speed(unsigned char motor_id, int _speed) {\n if (motor_id < MOTOR1 || motor_id > MOTOR2) {\n Serial.println(\"Motor id error! Must be MOTOR1 or MOTOR2\");\n return;\n }\n\n if (motor_id == MOTOR1) {\n if (_speed >= 0) {\n this->_M1_direction = 1;\n _speed = _speed > 100 ? 100 : _speed;\n this->_speed1 = map(_speed, 0, 100, 0, 255);\n } else if (_speed < 0) {\n this->_M1_direction = -1;\n _speed = _speed < -100 ? 100 : -(_speed);\n this->_speed1 = map(_speed, 0, 100, 0, 255);\n }\n } else if (motor_id == MOTOR2) {\n if (_speed >= 0) {\n this->_M2_direction = 1;\n _speed = _speed > 100 ? 100 : _speed;\n this->_speed2 = map(_speed, 0, 100, 0, 255);\n } else if (_speed < 0) {\n this->_M2_direction = -1;\n _speed = _speed < -100 ? 100 : -(_speed);\n this->_speed2 = map(_speed, 0, 100, 0, 255);\n }\n }\n // Set the direction\n if (_M1_direction == 1 && _M2_direction == 1) {\n direction(BothClockWise);\n }\n if (_M1_direction == 1 && _M2_direction == -1) {\n direction(M1CWM2ACW);\n }\n if (_M1_direction == -1 && _M2_direction == 1) {\n direction(M1ACWM2CW);\n }\n if (_M1_direction == -1 && _M2_direction == -1) {\n direction(BothAntiClockWise);\n }\n // send command\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(MotorSpeedSet); // set pwm header\n Wire.write(this->_speed1); // send speed of motor1\n Wire.write(this->_speed2); // send speed of motor2\n Wire.endTransmission(); \t\t // stop transmitting\n delay(4); \t\t\t\t // Wait\n}\n\n// Set the frequence of PWM(cycle length = 510, system clock = 16MHz)\n// F_3921Hz is default\n// _frequence: F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\nvoid I2CMotorDriver::frequence(unsigned char _frequence) {\n if (_frequence < F_31372Hz || _frequence > F_30Hz) {\n Serial.println(\"frequence error! Must be F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\");\n return;\n }\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(PWMFrequenceSet); // set frequence header\n Wire.write(_frequence); // send frequence\n Wire.write(Nothing); // need to send this byte as the third byte(no meaning)\n Wire.endTransmission(); // stop transmitting\n delay(4); \t\t\t\t // wait\n}\n\n// Stop one motor\n// motor_id: MOTOR1, MOTOR2\nvoid I2CMotorDriver::stop(unsigned char motor_id) {\n if (motor_id < MOTOR1 || motor_id > MOTOR2) {\n Serial.println(\"Motor id error! Must be MOTOR1 or MOTOR2\");\n return;\n }\n speed(motor_id, 0);\n}\n\n// ***************************Stepper Motor Function***************************\n// Drive a stepper motor\n// _step: -1024~1024, when _step>0, stepper motor runs clockwise; when _step<0,\n// stepper motor runs anticlockwise; when _step is 512, the stepper motor will\n// run a complete turn; if step is 1024, the stepper motor will run 2 turns.\n// _type: 0 -> 4 phase stepper motor, default\n// 1 -> 2 phase stepper motor\n// _mode: 0 -> compatible mode (_step=1 corresponds 4 steps)\n// 1 -> fine mode (_step1 corresponds 1 steps)\nvoid I2CMotorDriver::StepperRun(int _step, int _type, int _mode) {\n int _direction = 1;\n if (_step > 0) {\n _direction = 1; //clockwise\n _step = _step > 1024 ? 1024 : _step;\n } else if (_step < 0) {\n _direction = -1; //anti-clockwise\n _step = _step < -1024 ? 1024 : -(_step);\n }\n this->_speed1 = 255;\n this->_speed2 = 255;\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(MotorSpeedSet); // set pwm header\n Wire.write(this->_speed1); // send speed of motor1\n Wire.write(this->_speed2); // send speed of motor2\n Wire.endTransmission(); \t\t // stop transmitting\n delay(4); \t\t\t\t // wait\n\n if (_type == 1) {\n if (_direction == 1) {\t\t\t\t// 2 phase motor\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b0001);\n direction(0b0101);\n direction(0b0100);\n direction(0b0110);\n direction(0b0010);\n direction(0b1010);\n direction(0b1000);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b0001); direction(0b0101); break;\n case 1 : direction(0b0100); direction(0b0110); break;\n case 2 : direction(0b0010); direction(0b1010); break;\n case 3 : direction(0b1000); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n } else if (_direction == -1) {\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b1000);\n direction(0b1010);\n direction(0b0010);\n direction(0b0110);\n direction(0b0100);\n direction(0b0101);\n direction(0b0001);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b1000); direction(0b1010); break;\n case 1 : direction(0b0010); direction(0b0110); break;\n case 2 : direction(0b0100); direction(0b0101); break;\n case 3 : direction(0b0001); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n }\n } else if (_type == 0) {\n if (_direction == 1) {\t\t\t\t// 4 phase motor\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b0001);\n direction(0b0011);\n direction(0b0010);\n direction(0b0110);\n direction(0b0100);\n direction(0b1100);\n direction(0b1000);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b0001); direction(0b0011); break;\n case 2 : direction(0b0010); direction(0b0110); break;\n case 3 : direction(0b0100); direction(0b1100); break;\n case 4 : direction(0b1000); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n } else if (_direction == -1) {\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b1000);\n direction(0b1100);\n direction(0b0100);\n direction(0b0110);\n direction(0b0010);\n direction(0b0011);\n direction(0b0001);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b1000); direction(0b1100); break;\n case 1 : direction(0b0100); direction(0b0110); break;\n case 2 : direction(0b0010); direction(0b0011); break;\n case 3 : direction(0b0001); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n }\n }\n}\n\n\nI2CMotorDriver Motor;\n\n// End of File\n" }, { filename: "src/Grove_I2C_Motor_Driver.h", code: "/*\n Grove_I2C_Motor_Driver.h\n A library for Grove - I2C Motor Driver v1.3\n\n Copyright (c) 2012 seeed technology inc.\n Website : www.seeed.cc\n Author : Jerry Yip\n Create Time: 2017-02\n Change Log :\n\n The MIT License (MIT)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n*/\n\n#ifndef __I2CMOTORDRIVER_H__\n#define __I2CMOTORDRIVER_H__\n\n#include \n\n/******I2C command definitions*************/\n#define MotorSpeedSet 0x82\n#define PWMFrequenceSet 0x84\n#define DirectionSet 0xaa\n#define MotorSetA 0xa1\n#define MotorSetB 0xa5\n#define Nothing 0x01\n/**************Motor ID**********************/\n#define MOTOR1 \t\t\t 1\n#define MOTOR2 \t\t\t 2\n/**************Motor Direction***************/\n#define BothClockWise 0x0a\n#define BothAntiClockWise 0x05\n#define M1CWM2ACW 0x06\n#define M1ACWM2CW 0x09\n/**************Motor Direction***************/\n#define ClockWise 0x0a\n#define AntiClockWise 0x05\n/**************Prescaler Frequence***********/\n#define F_31372Hz 0x01\n#define F_3921Hz 0x02\n#define F_490Hz 0x03\n#define F_122Hz 0x04\n#define F_30Hz 0x05\n\n/*************************Class for Grove I2C Motor Driver********************/\nclass I2CMotorDriver {\n\n private:\n // _speed0: 0~100 _speed1: 0~100\n unsigned char _speed1 = 0;\n unsigned char _speed2 = 0;\n // the direction of M1 and M2 DC motor 1:clockwise -1:anticlockwise\n int _M1_direction = 1;\n int _M2_direction = 1;\n // _i2c_add: 0x00~0x0f\n unsigned char _i2c_add = 0x0f;\n // Set the direction of both motors\n // _direction: BothClockWise, BothAntiClockWise, M1CWM2ACW, M1ACWM2CW\n void direction(unsigned char _direction);\n unsigned char _step_cnt = 0;\n\n public:\n // Initialize I2C with an I2C address you set on Grove - I2C Motor Driver v1.3\n // default i2c address: 0x0f\n int begin(unsigned char i2c_add);\n // Set the speed of a motor, speed is equal to duty cycle here\n // motor_id: MOTOR1, MOTOR2\n // _speed: -100~100, when _speed>0, dc motor runs clockwise;\n // when _speed<0, dc motor runs anticlockwise\n void speed(unsigned char motor_id, int _speed);\n // Set the frequence of PWM(cycle length = 510, system clock = 16MHz)\n // F_3921Hz is default\n // _frequence: F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\n void frequence(unsigned char _frequence);\n // Stop one motor\n // motor_id: MOTOR1, MOTOR2\n void stop(unsigned char motor_id);\n // Drive a stepper motor\n // _step: -1024~1024, when _step>0, stepper motor runs clockwise; when\n // _step<0, stepper motor runs anticlockwise; when _step is 512, the stepper\n // motor will run a complete turn; if step is 1024, the stepper motor will\n // run 2 turns.\n // _type: 0 -> 4 phase stepper motor\n // 1 -> 2 phase stepper motor\n // _mode: 0 -> compatible mode (_step=1 corresponds 4 steps)\n // 1 -> fine mode (_step1 corresponds 1 steps)\n void StepperRun(int _step, int _type = 0, int _mode = 0);\n};\n\nextern I2CMotorDriver Motor;\n\n#endif\n" }, { filename: "src/SparkFunMiniMoto.cpp", code: "/****************************************************************\n Example code demonstrating the use of the Arduino Library for\n the SparkFun MiniMoto board, which uses the TI DRV8830 IC for I2C\n low-voltage DC motor control.\n\n This code is beerware; if you use it, please buy me (or any other\n SparkFun employee) a cold beverage next time you run into one of\n us at the local.\n\n 17 Sep 2013- Mike Hord, SparkFun Electronics\n\n Code developed in Arduino 1.0.5, on a Fio classic board.\n\n**Updated for Arduino 1.6.4 5/2015**\n****************************************************************/\n\n\n#include \n#include \"SparkFunMiniMoto.h\"\n// The address of the part is set by a jumper on the board.\n// See datasheet or schematic for details; default is 0xD0.\nMiniMoto::MiniMoto(byte addr) {\n _addr = addr;\n\n // This sets the bit rate of the bus; I want 100kHz. See the\n // datasheet for details on how I came up with this value.\n#if !(defined(__SAMD21__) || defined(__SAMD51__))\n TWBR = 72;\n#endif\n}\n\n// Return the fault status of the DRV8830 chip. Also clears any existing faults.\nbyte MiniMoto::getFault() {\n byte buffer = 0;\n byte clearFault = 0x80;\n I2CReadBytes(0x01, &buffer, 1);\n I2CWriteBytes(0x01, &clearFault, 1);\n return buffer;\n}\n\n// Send the drive command over I2C to the DRV8830 chip. Bits 7:2 are the speed\n// setting; range is 0-63. Bits 1:0 are the mode setting:\n// - 00 = HI-Z\n// - 01 = Reverse\n// - 10 = Forward\n// - 11 = H-H (brake)\nvoid MiniMoto::drive(int speed) {\n byte regValue = 0x80; // Before we do anything, we'll want to\n // clear the fault status. To do that\n // write 0x80 to register 0x01 on the\n // DRV8830.\n I2CWriteBytes(0x01, ®Value, 1); // Clear the fault status.\n regValue = (byte)abs(speed); // Find the byte-ish abs value of the input\n if (regValue > 63) {\n regValue = 63; // Cap the value at 63.\n }\n regValue = regValue << 2; // Left shift to make room for bits 1:0\n if (speed < 0) {\n regValue |= 0x01; // Set bits 1:0 based on sign of input.\n } else {\n regValue |= 0x02;\n }\n\n I2CWriteBytes(0x00, ®Value, 1);\n}\n\n// Coast to a stop by hi-z'ing the drivers.\nvoid MiniMoto::stop() {\n byte regValue = 0; // See above for bit 1:0 explanation.\n\n I2CWriteBytes(0x00, ®Value, 1);\n}\n\n// Stop the motor by providing a heavy load on it.\nvoid MiniMoto::brake() {\n byte regValue = 0x03; // See above for bit 1:0 explanation.\n\n I2CWriteBytes(0x00, ®Value, 1);\n}\n\n// Private function that reads some number of bytes from the accelerometer.\nvoid MiniMoto::I2CReadBytes(byte addr, byte* buffer, byte len) {\n#if defined(__SAMD21__) || defined(__SAMD51__)\n\tWire.begin();\n\tWire.beginTransmission((uint16_t)_addr >> 1 & 0x7f);\n\tWire.write(addr);\n\tWire.endTransmission();\n\tWire.requestFrom((uint16_t)_addr >> 1 & 0x7f, len);\n\twhile(! Wire.available());\n\tfor (byte i = 0; i < len ; i++){\n\t\tbuffer[i] = Wire.read();\n\t}\n#else\n byte temp = 0;\n // First, we need to write the address we want to read from, so issue a write\n // with that address. That's two steps: first, the slave address:\n TWCR = START_COND; // Send a start condition\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\n // can initiate data transfer.\n TWDR = _addr; // Load the slave address\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n // Now, we need to send the address we want to read from:\n TWDR = addr; // Load the slave address\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n TWCR = STOP_COND;\n\n // Now, we issue a repeated start (by doing what we just did again), and this\n // time, we set the READ bit as well.\n TWCR = START_COND; // Send a start condition\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\n // can initiate data transfer.\n TWDR = (_addr) | I2C_READ; // Load the slave address and set the read bit\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n\n // Now, we can fetch data from the slave by clearing TWINT, waiting, and\n // reading the data. Rinse, repeat, as often as needed.\n for (byte i = 0; i < len; i++) {\n if (i == len - 1) {\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n }\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n else {\n TWCR = NEXT_BYTE;\n }\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n buffer[i] = TWDR; // Now our data can be fetched from TWDR.\n }\n // Now that we're done reading our data, we can transmit a stop condition.\n TWCR = STOP_COND;\n#endif\n}\n\nvoid MiniMoto::I2CWriteBytes(byte addr, byte* buffer, byte len) {\n#if defined(__SAMD21__) || defined(__SAMD51__)\n\tWire.begin();\n\tWire.beginTransmission((uint16_t)_addr >> 1 & 0x7f);\n\tWire.write(addr);\n\tfor (byte i = 0; i < len ; i++){\n\tWire.write(buffer[i]);\n\t}\n\tWire.endTransmission();\n#else\n // First, we need to write the address we want to read from, so issue a write\n // with that address. That's two steps: first, the slave address:\n TWCR = START_COND; // Send a start condition\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\n // can initiate data transfer.\n TWDR = _addr; // Load the slave address\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n // Now, we need to send the address we want to read from:\n TWDR = addr; // Load the slave address\n TWCR |= CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n\n // Now, we can send data to the slave by putting data into TWDR, clearing\n // TWINT, and waiting for TWINT. Rinse, repeat, as often as needed.\n for (byte i = 0; i < len; i++) {\n TWDR = buffer[i]; // Now our data can be sent to TWDR.\n TWCR |= CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n }\n // Now that we're done writing our data, we can transmit a stop condition.\n TWCR = STOP_COND;\n#endif\n}\n" }, { filename: "src/SparkFunMiniMoto.h", code: "/****************************************************************\n Example code demonstrating the use of the Arduino Library for\n the SparkFun MiniMoto board, which uses the TI DRV8830 IC for I2C\n low-voltage DC motor control.\n\n This code is beerware; if you use it, please buy me (or any other\n SparkFun employee) a cold beverage next time you run into one of\n us at the local.\n\n 17 Sep 2013- Mike Hord, SparkFun Electronics\n\n Code developed in Arduino 1.0.5, on a Fio classic board.\n\n**Updated for Arduino 1.6.4 5/2015**\n****************************************************************/\n\n\n#ifndef SparkFunMiniMoto_h\n#define SparkFunMiniMoto_h\n\n#include \n\n// I2C support constants\n#define I2C_READ 0x01 // I2C read bit set\n// Some values we'll load into TWCR a lot\n#define START_COND 0xA4 // (1< { that.worker.remote.runExtension('onLoad', target.id); }); } }, onUnload: function onUnload(app) { this.__workerSetupInstance = null; this.worker.remote.runExtension('onUnload'); this.worker.dispose(); }, onConnect: function onConnect(app, device) { this.worker.remote.runExtension('onConnect', device.id); }, onDisconnect: function onDisconnect(app, device) { this.worker.remote.runExtension('onDisconnect', device.id); }, onStopAll: function onStopAll(app, device) { this.worker.remote.runExtension('onStopAll', device.id); }, beforeChangeUploadMode: function beforeChangeUploadMode(app, device) { return this.worker.remote.runExtension('beforeChangeUploadMode', device.id); }, beforeChangeDebugMode: function beforeChangeDebugMode(app, device) { return this.worker.remote.runExtension('beforeChangeDebugMode', device.id); }, afterChangeUploadMode: function afterChangeUploadMode(app, device) { this.worker.remote.runExtension('afterChangeUploadMode', device.id); }, afterChangeDebugMode: function afterChangeDebugMode(app, device) { this.worker.remote.runExtension('afterChangeDebugMode', device.id); }, onSelect: function onSelect(app, device) { if (!this.worker) { setTimeout(() => { this.onSelect(app, device); }, 200); return; } this.worker.remote.runExtension('onSelect', device.id); }, onUnselect: function onUnselect(app, device) { this.worker.remote.runExtension('onUnselect', device.id); }, beforeCodeUpload: function beforeCodeUpload(app, device) { this.worker.remote.runExtension('beforeCodeUpload', device.id); }, afterCodeUpload: function afterCodeUpload(app, device) { this.worker.remote.runExtension('afterCodeUpload', device.id); }, onRead: function onRead(app, device) { this.worker.remote.runExtension('onRead', device.id); }, beforeFirmwareUpdate: function beforeFirmwareUpdate(app, device) { this.worker.remote.runExtension('beforeFirmwareUpdate', device.id); }, afterFirmwareUpdate: function afterFirmwareUpdate(app, device) { this.worker.remote.runExtension('afterFirmwareUpdate', device.id); } }; class ExtVdrGroveMoteur { constructor() { this.checkFirmwareInForce = typeof checkFirmwareInForce !== 'undefined' ? checkFirmwareInForce : false; const handlerProxyUrl = window.MbApi.getExtResPath('vdr_grove_moteur/handlerProxy.js', 'vdr_grove_moteur'); const that = this; that.workerSetup = async function (exports) { that.worker = await window.__web_worker_rpc.create(handlerProxyUrl, exports).then(worker => { worker.CONFIG.TIMEOUT = 42000; worker.CONFIG.HEARTBEAT = 4200; worker.onFail = () => { that.worker = null; that.workerSetup(exports); const app = exports.app; if (app) { app.workspace.resetEvents(); } }; return worker; }); }; this.funcs = { 'BLOCK_1654872700954': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock('BLOCK_1654872700954', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args)); } }, 'BLOCK_1654872701201': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock('BLOCK_1654872701201', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args)); } }, 'BLOCK_1654880700150': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock('BLOCK_1654880700150', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args)); } }, 'BLOCK_1654880700383': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock('BLOCK_1654880700383', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args)); } } }; } getInfo() { return { "id": "vdr_grove_moteur", "targets": [{ "name": "arduino_mega2560", "options": { "upload": { "middlewares": [{ "name": "arduino", "params": { "sources": extSources.arduino } }] } } }, { "name": "arduino_uno", "options": { "upload": { "middlewares": [{ "name": "arduino", "params": { "sources": extSources.arduino } }] } } }], "codeTypes": ["arduinoc"], "version": "1.0.0", "platform": ["mblockpc"], "categories": [{ "name": "cate_ee80b27a", "colors": ["#FF6F00", "#E66400", "#CC5900"], "menuIconURI": "", "blockIcon": null, "blocks": [{ "opcode": "BLOCK_1654872700954", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "1", "menu": "BLOCK_1654872700954_PORT" }, "speed": { "type": "number", "defaultValue": 100 } }, "branchCount": 0, "codes": { "arduinoc": { "code": `motor/*{port}*/.drive(/*{speed}*/);`, "sections": { "include": ["\"src/SparkFunMiniMoto.h\""], "declare": `MiniMoto motor0(0xC4);\r\nMiniMoto motor1(0xC0);` } } }, "handler": this.funcs.BLOCK_1654872700954 }, { "opcode": "BLOCK_1654872701201", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "0", "menu": "BLOCK_1654872701201_PORT" }, "frein": { "type": "fieldMenu", "defaultValue": "stop", "menu": "BLOCK_1654872701201_FREIN" } }, "branchCount": 0, "codes": { "arduinoc": { "code": `motor/*{port}*/./*{frein}*/();`, "sections": { "include": ["\"src/SparkFunMiniMoto.h\""], "declare": `MiniMoto motor0(0xC4);\r\nMiniMoto motor1(0xC0);` } } }, "handler": this.funcs.BLOCK_1654872701201 }], "menus": { "BLOCK_1654872700954_PORT": [{ "text": "BLOCK_1654872700954_PORT_0", "value": "1" }, { "text": "BLOCK_1654872700954_PORT_1", "value": "2" }], "BLOCK_1654872701201_PORT": [{ "text": "BLOCK_1654872701201_PORT_0", "value": "0" }, { "text": "BLOCK_1654872701201_PORT_1", "value": "1" }], "BLOCK_1654872701201_FREIN": [{ "text": "BLOCK_1654872701201_FREIN_0", "value": "stop" }, { "text": "BLOCK_1654872701201_FREIN_1", "value": "brake" }] } }, { "name": "cate_f5fb6cd1", "colors": ["#FF6F00", "#E66400", "#CC5900"], "menuIconURI": "", "blockIcon": null, "blocks": [{ "opcode": "BLOCK_1654880700150", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "MOTOR1", "menu": "BLOCK_1654880700150_PORT" }, "vitesse": { "type": "number", "defaultValue": 100 } }, "branchCount": 0, "codes": { "arduinoc": { "code": `Motor.speed(/*{port}*/, /*{vitesse}*/);`, "sections": { "include": ["\"src/Grove_I2C_Motor_Driver.h\""], "declare": `#define I2C_ADDRESS 0x0f`, "setup": `Motor.begin(I2C_ADDRESS);` } } }, "handler": this.funcs.BLOCK_1654880700150 }, { "opcode": "BLOCK_1654880700383", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "MOTOR1", "menu": "BLOCK_1654880700150_PORT" } }, "branchCount": 0, "codes": { "arduinoc": { "code": `Motor.stop(/*{port}*/);`, "sections": { "include": ["\"src/Grove_I2C_Motor_Driver.h\""], "declare": `#define I2C_ADDRESS 0x0f`, "setup": `Motor.begin(I2C_ADDRESS);` } } }, "handler": this.funcs.BLOCK_1654880700383 }], "menus": { "BLOCK_1654880700150_PORT": [{ "text": "BLOCK_1654880700150_PORT_0", "value": "MOTOR1" }, { "text": "BLOCK_1654880700150_PORT_1", "value": "MOTOR2" }] } }], "generators": extGenerators, "translationMap": extTranslationMap, "snippets": codeSnippets, "generatorStartBlocks": [], "feature": ["worker"], "mustLoginBlocks": [], "disabledOffline": [], "disabledOnline": [] }; } getHandler() { if (typeof ExtHandler === 'object') { return ExtHandler; } else if (typeof ExtHandler === 'function') { return new ExtHandler(); } } } var _default = ExtVdrGroveMoteur; _exports.default = _default; });PK ۈTa^S4S4handlerProxy.js"use strict";function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg),value=info.value}catch(error){return void reject(error)}info.done?resolve(value):Promise.resolve(value).then(_next,_throw)}function _asyncToGenerator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}var gen=fn.apply(self,args);_next(void 0)})}}function _instanceof(left,right){return null!=right&&"undefined"!=typeof Symbol&&right[Symbol.hasInstance]?!!right[Symbol.hasInstance](left):left instanceof right}function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}self.rpc.CONFIG.TIMEOUT=42e3,self.rpc.CONFIG.HEARTBEAT=4200;var __context={app:self.rpc.remote.app,getDevice:function(deviceId){return new Proxy({},{get:function get(target,name){return"id"==name?deviceId:function(){for(var runDevice=__context.app.runDevice,_len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return runDevice.apply(void 0,[deviceId,name].concat(args))}}})}};!function(global){"use strict";function wrap(innerFn,outerFn,self,tryLocsList){var protoGenerator=outerFn&&_instanceof(outerFn.prototype,Generator)?outerFn:Generator,generator=Object.create(protoGenerator.prototype),context=new Context(tryLocsList||[]);return generator._invoke=makeInvokeMethod(innerFn,self,context),generator}function tryCatch(fn,obj,arg){try{return{type:"normal",arg:fn.call(obj,arg)}}catch(err){return{type:"throw",arg:err}}}function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}function defineIteratorMethods(prototype){["next","throw","return"].forEach(function(method){prototype[method]=function(arg){return this._invoke(method,arg)}})}function AsyncIterator(generator){function invoke(method,arg,resolve,reject){var record=tryCatch(generator[method],generator,arg);if("throw"===record.type)reject(record.arg);else{var result=record.arg,value=result.value;return value&&"object"===_typeof(value)&&hasOwn.call(value,"__await")?Promise.resolve(value.__await).then(function(value){invoke("next",value,resolve,reject)},function(err){invoke("throw",err,resolve,reject)}):Promise.resolve(value).then(function(unwrapped){result.value=unwrapped,resolve(result)},function(error){return invoke("throw",error,resolve,reject)})}}function enqueue(method,arg){function callInvokeWithMethodAndArg(){return new Promise(function(resolve,reject){invoke(method,arg,resolve,reject)})}return previousPromise=previousPromise?previousPromise.then(callInvokeWithMethodAndArg,callInvokeWithMethodAndArg):callInvokeWithMethodAndArg()}var previousPromise;this._invoke=enqueue}function makeInvokeMethod(innerFn,self,context){var state="suspendedStart";return function(method,arg){if(state==="executing")throw new Error("Generator is already running");if("completed"===state){if("throw"===method)throw arg;return doneResult()}for(context.method=method,context.arg=arg;;){var delegate=context.delegate;if(delegate){var delegateResult=maybeInvokeDelegate(delegate,context);if(delegateResult){if(delegateResult===ContinueSentinel)continue;return delegateResult}}if("next"===context.method)context.sent=context._sent=context.arg;else if("throw"===context.method){if("suspendedStart"===state)throw state="completed",context.arg;context.dispatchException(context.arg)}else"return"===context.method&&context.abrupt("return",context.arg);state="executing";var record=tryCatch(innerFn,self,context);if("normal"===record.type){if(state=context.done?"completed":"suspendedYield",record.arg===ContinueSentinel)continue;return{value:record.arg,done:context.done}}"throw"===record.type&&(state="completed",context.method="throw",context.arg=record.arg)}}}function maybeInvokeDelegate(delegate,context){var method=delegate.iterator[context.method];if(void 0===method){if(context.delegate=null,"throw"===context.method){if(delegate.iterator.return&&(context.method="return",context.arg=void 0,maybeInvokeDelegate(delegate,context),"throw"===context.method))return ContinueSentinel;context.method="throw",context.arg=new TypeError("The iterator does not provide a 'throw' method")}return ContinueSentinel}var record=tryCatch(method,delegate.iterator,context.arg);if("throw"===record.type)return context.method="throw",context.arg=record.arg,context.delegate=null,ContinueSentinel;var info=record.arg;if(!info)return context.method="throw",context.arg=new TypeError("iterator result is not an object"),context.delegate=null,ContinueSentinel;if(info.done)context[delegate.resultName]=info.value,context.next=delegate.nextLoc,"return"!==context.method&&(context.method="next",context.arg=void 0);else return info;return context.delegate=null,ContinueSentinel}function pushTryEntry(locs){var entry={tryLoc:locs[0]};1 in locs&&(entry.catchLoc=locs[1]),2 in locs&&(entry.finallyLoc=locs[2],entry.afterLoc=locs[3]),this.tryEntries.push(entry)}function resetTryEntry(entry){var record=entry.completion||{};record.type="normal",delete record.arg,entry.completion=record}function Context(tryLocsList){this.tryEntries=[{tryLoc:"root"}],tryLocsList.forEach(pushTryEntry,this),this.reset(!0)}function values(iterable){if(iterable){var iteratorMethod=iterable[iteratorSymbol];if(iteratorMethod)return iteratorMethod.call(iterable);if("function"==typeof iterable.next)return iterable;if(!isNaN(iterable.length)){var i=-1,next=function next(){for(;++i= 0; --i) { var entry = this.tryEntries[i]; var record = entry.completion; if (entry.tryLoc === "root") { return handle("end") } if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"); var hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true) } else if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc) } } else if (hasCatch) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true) } } else if (hasFinally) { if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc) } } else { throw new Error("try statement without catch or finally") } } } }, abrupt: function(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break } } if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { finallyEntry = null } var record = finallyEntry ? finallyEntry.completion : {}; record.type = type; record.arg = arg; if (finallyEntry) { this.method = "next"; this.next = finallyEntry.finallyLoc; return ContinueSentinel } return this.complete(record) }, complete: function(record, afterLoc) { if (record.type === "throw") { throw record.arg } if (record.type === "break" || record.type === "continue") { this.next = record.arg } else if (record.type === "return") { this.rval = this.arg = record.arg; this.method = "return"; this.next = "end" } else if (record.type === "normal" && afterLoc) { this.next = afterLoc } return ContinueSentinel }, finish: function(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) { this.complete(entry.completion, entry.afterLoc); resetTryEntry(entry); return ContinueSentinel } } }, "catch": function(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (record.type === "throw") { var thrown = record.arg; resetTryEntry(entry) } return thrown } } throw new Error("illegal catch attempt") }, delegateYield: function(iterable, resultName, nextLoc) { this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }; if (this.method === "next") { this.arg = undefined } return ContinueSentinel } } }(function() { return this || typeof self === "object" && self }() || Function("return this")()); // enter your javascript code here const disableBlocks = { debug: [], upload: [] }; const mustLoginBlocks = []; const triggerBlocksStatus = async (mode, app) => {} class ExtVdrGroveMoteur { constructor() { this.funcs = { 'BLOCK_1654872700954': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock( 'BLOCK_1654872700954', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args) ); } }, 'BLOCK_1654872701201': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock( 'BLOCK_1654872701201', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args) ); } }, 'BLOCK_1654880700150': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock( 'BLOCK_1654880700150', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args) ); } }, 'BLOCK_1654880700383': { onRun: (args, app, device, block) => { return this.worker.remote.runBlock( 'BLOCK_1654880700383', 'onRun', device.id, { id: block.id, opcode: block.opcode, arguments: block.arguments }, Object.assign({}, args) ); } } }; } getInfo() { return { "id": "vdr_grove_moteur", "targets": [{ "name": "arduino_mega2560", "options": { "upload": { "middlewares": [{ "name": "arduino", "params": { "sources": extSources.arduino } }] } } }, { "name": "arduino_uno", "options": { "upload": { "middlewares": [{ "name": "arduino", "params": { "sources": extSources.arduino } }] } } } ], "codeTypes": [ "arduinoc" ], "version": "1.0.0", "platform": [ "mblockpc" ], "categories": cates(facepanels), "generators": extGenerators, "translationMap": extTranslationMap, "snippets": codeSnippets, "generatorStartBlocks": [], "feature": [ "worker" ], "mustLoginBlocks": [], "disabledOffline": [], "disabledOnline": [] }; } getHandler() { if (typeof extHandler === 'object') { return extHandler; } else if (typeof extHandler === 'function') { return new extHandler(); } } } export default ExtVdrGroveMoteur;PK ۈT"v&&src/snippets.jsexport default [ "arduinoc: {}" ];PK ۈTI~src/generators.jsexport default [({ lang: 'arduinoc', template: `// generated by mBlock5 for // codes make you happy //( include //) #include //( lib //) //({ this.$ALL_VARIABLES.length==0?'':this.$ALL_VARIABLES.map(v=>"float "+v+" = 0;").join('\\n') }//) //( declare //) void _delay(float seconds) { long endTime = millis() + seconds * 1000; while(millis() < endTime) _loop(); } //( void setup() { //( setup //) //( code //) } //) void _loop() { //( _loop //) } void loop() { _loop(); }`, splitor: { frame: { left: "//(", right: "//)", }, expression: { left: "/*{", right: "}*/", } }, reducers: [{ name: 'include', reduce: (codes) => { let codes1 = [] for (let code of codes) { let codeStr = ''; if (typeof code === 'string') { codeStr = code; } else if (typeof code === 'function') { codeStr = code(); } if (codes1.indexOf(codeStr) === -1) { codes1.push(codeStr); } } if (codes1.length === 0) { return undefined; } return codes1.map(code => { return '#include ' + code; }).join('\n') + '\n' } }] })];PK ۈT#*ddsrc/arduinosources.jsexport default [ "{ filename: \"src/Grove_I2C_Motor_Driver.cpp\", code: \"/*\\n Grove_I2C_Motor_Driver.cpp\\n A library for Grove - I2C Motor Driver v1.3\\n\\n Copyright (c) 2012 seeed technology inc.\\n Website : www.seeed.cc\\n Author : Jerry Yip\\n Create Time: 2017-02\\n Change Log : 2018-05-31 1.support two phase stepper motor\\n\\n The MIT License (MIT)\\n\\n Permission is hereby granted, free of charge, to any person obtaining a copy\\n of this software and associated documentation files (the \\\"Software\\\"), to deal\\n in the Software without restriction, including without limitation the rights\\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\n copies of the Software, and to permit persons to whom the Software is\\n furnished to do so, subject to the following conditions:\\n\\n The above copyright notice and this permission notice shall be included in\\n all copies or substantial portions of the Software.\\n\\n THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\\n THE SOFTWARE.\\n*/\\n\\n\\n#include \\\"Grove_I2C_Motor_Driver.h\\\"\\n#include \\n\\n/*********************************stepper motor type*******************************/\\n// Define stepper motor type. Support 4 phase stepper motor by default.\\n// If 2 phase motor is used, define TWO_PHASE_STEPPER_MOTOR in the ino file.\\n// #define TWO_PHASE_STEPPER_MOTOR\\n\\n// *********************************Initialize*********************************\\n// Initialize I2C with an I2C address you set on Grove - I2C Motor Driver v1.3\\n// default i2c address: 0x0f\\nint I2CMotorDriver::begin(unsigned char i2c_add) {\\n if (i2c_add > 0x0f) {\\n Serial.println(\\\"Error! I2C address must be between 0x00 to 0x0F\\\");\\n return (-1); // I2C address error\\n }\\n Wire.begin();\\n delayMicroseconds(10000);\\n this->_i2c_add = i2c_add;\\n // Set default frequence to F_3921Hz\\n frequence(F_3921Hz);\\n return (0); // OK\\n}\\n\\n// *****************************Private Function*******************************\\n// Set the direction of 2 motors\\n// _direction: M1CWM2ACW(M1 ClockWise M2 AntiClockWise), M1ACWM2CW, BothClockWise, BothAntiClockWise,\\nvoid I2CMotorDriver::direction(unsigned char _direction) {\\n Wire.beginTransmission(this->_i2c_add); // begin transmission\\n Wire.write(DirectionSet); // Direction control header\\n Wire.write(_direction); // send direction control information\\n Wire.write(Nothing); // need to send this byte as the third byte(no meaning)\\n Wire.endTransmission(); // stop transmitting\\n delay(4); \\t\\t\\t\\t // wait\\n}\\n\\n// *****************************DC Motor Function******************************\\n// Set the speed of a motor, speed is equal to duty cycle here\\n// motor_id: MOTOR1, MOTOR2\\n// _speed: -100~100, when _speed>0, dc motor runs clockwise; when _speed<0,\\n// dc motor runs anticlockwise\\nvoid I2CMotorDriver::speed(unsigned char motor_id, int _speed) {\\n if (motor_id < MOTOR1 || motor_id > MOTOR2) {\\n Serial.println(\\\"Motor id error! Must be MOTOR1 or MOTOR2\\\");\\n return;\\n }\\n\\n if (motor_id == MOTOR1) {\\n if (_speed >= 0) {\\n this->_M1_direction = 1;\\n _speed = _speed > 100 ? 100 : _speed;\\n this->_speed1 = map(_speed, 0, 100, 0, 255);\\n } else if (_speed < 0) {\\n this->_M1_direction = -1;\\n _speed = _speed < -100 ? 100 : -(_speed);\\n this->_speed1 = map(_speed, 0, 100, 0, 255);\\n }\\n } else if (motor_id == MOTOR2) {\\n if (_speed >= 0) {\\n this->_M2_direction = 1;\\n _speed = _speed > 100 ? 100 : _speed;\\n this->_speed2 = map(_speed, 0, 100, 0, 255);\\n } else if (_speed < 0) {\\n this->_M2_direction = -1;\\n _speed = _speed < -100 ? 100 : -(_speed);\\n this->_speed2 = map(_speed, 0, 100, 0, 255);\\n }\\n }\\n // Set the direction\\n if (_M1_direction == 1 && _M2_direction == 1) {\\n direction(BothClockWise);\\n }\\n if (_M1_direction == 1 && _M2_direction == -1) {\\n direction(M1CWM2ACW);\\n }\\n if (_M1_direction == -1 && _M2_direction == 1) {\\n direction(M1ACWM2CW);\\n }\\n if (_M1_direction == -1 && _M2_direction == -1) {\\n direction(BothAntiClockWise);\\n }\\n // send command\\n Wire.beginTransmission(this->_i2c_add); // begin transmission\\n Wire.write(MotorSpeedSet); // set pwm header\\n Wire.write(this->_speed1); // send speed of motor1\\n Wire.write(this->_speed2); // send speed of motor2\\n Wire.endTransmission(); \\t\\t // stop transmitting\\n delay(4); \\t\\t\\t\\t // Wait\\n}\\n\\n// Set the frequence of PWM(cycle length = 510, system clock = 16MHz)\\n// F_3921Hz is default\\n// _frequence: F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\\nvoid I2CMotorDriver::frequence(unsigned char _frequence) {\\n if (_frequence < F_31372Hz || _frequence > F_30Hz) {\\n Serial.println(\\\"frequence error! Must be F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\\\");\\n return;\\n }\\n Wire.beginTransmission(this->_i2c_add); // begin transmission\\n Wire.write(PWMFrequenceSet); // set frequence header\\n Wire.write(_frequence); // send frequence\\n Wire.write(Nothing); // need to send this byte as the third byte(no meaning)\\n Wire.endTransmission(); // stop transmitting\\n delay(4); \\t\\t\\t\\t // wait\\n}\\n\\n// Stop one motor\\n// motor_id: MOTOR1, MOTOR2\\nvoid I2CMotorDriver::stop(unsigned char motor_id) {\\n if (motor_id < MOTOR1 || motor_id > MOTOR2) {\\n Serial.println(\\\"Motor id error! Must be MOTOR1 or MOTOR2\\\");\\n return;\\n }\\n speed(motor_id, 0);\\n}\\n\\n// ***************************Stepper Motor Function***************************\\n// Drive a stepper motor\\n// _step: -1024~1024, when _step>0, stepper motor runs clockwise; when _step<0,\\n// stepper motor runs anticlockwise; when _step is 512, the stepper motor will\\n// run a complete turn; if step is 1024, the stepper motor will run 2 turns.\\n// _type: 0 -> 4 phase stepper motor, default\\n// 1 -> 2 phase stepper motor\\n// _mode: 0 -> compatible mode (_step=1 corresponds 4 steps)\\n// 1 -> fine mode (_step1 corresponds 1 steps)\\nvoid I2CMotorDriver::StepperRun(int _step, int _type, int _mode) {\\n int _direction = 1;\\n if (_step > 0) {\\n _direction = 1; //clockwise\\n _step = _step > 1024 ? 1024 : _step;\\n } else if (_step < 0) {\\n _direction = -1; //anti-clockwise\\n _step = _step < -1024 ? 1024 : -(_step);\\n }\\n this->_speed1 = 255;\\n this->_speed2 = 255;\\n Wire.beginTransmission(this->_i2c_add); // begin transmission\\n Wire.write(MotorSpeedSet); // set pwm header\\n Wire.write(this->_speed1); // send speed of motor1\\n Wire.write(this->_speed2); // send speed of motor2\\n Wire.endTransmission(); \\t\\t // stop transmitting\\n delay(4); \\t\\t\\t\\t // wait\\n\\n if (_type == 1) {\\n if (_direction == 1) {\\t\\t\\t\\t// 2 phase motor\\n for (int i = 0; i < _step; i++) {\\n if (_mode == 0) {\\n direction(0b0001);\\n direction(0b0101);\\n direction(0b0100);\\n direction(0b0110);\\n direction(0b0010);\\n direction(0b1010);\\n direction(0b1000);\\n direction(0b1001);\\n } else {\\n switch (_step_cnt) {\\n case 0 : direction(0b0001); direction(0b0101); break;\\n case 1 : direction(0b0100); direction(0b0110); break;\\n case 2 : direction(0b0010); direction(0b1010); break;\\n case 3 : direction(0b1000); direction(0b1001); break;\\n }\\n _step_cnt = (_step_cnt + 1) % 4;\\n }\\n }\\n } else if (_direction == -1) {\\n for (int i = 0; i < _step; i++) {\\n if (_mode == 0) {\\n direction(0b1000);\\n direction(0b1010);\\n direction(0b0010);\\n direction(0b0110);\\n direction(0b0100);\\n direction(0b0101);\\n direction(0b0001);\\n direction(0b1001);\\n } else {\\n switch (_step_cnt) {\\n case 0 : direction(0b1000); direction(0b1010); break;\\n case 1 : direction(0b0010); direction(0b0110); break;\\n case 2 : direction(0b0100); direction(0b0101); break;\\n case 3 : direction(0b0001); direction(0b1001); break;\\n }\\n _step_cnt = (_step_cnt + 1) % 4;\\n }\\n }\\n }\\n } else if (_type == 0) {\\n if (_direction == 1) {\\t\\t\\t\\t// 4 phase motor\\n for (int i = 0; i < _step; i++) {\\n if (_mode == 0) {\\n direction(0b0001);\\n direction(0b0011);\\n direction(0b0010);\\n direction(0b0110);\\n direction(0b0100);\\n direction(0b1100);\\n direction(0b1000);\\n direction(0b1001);\\n } else {\\n switch (_step_cnt) {\\n case 0 : direction(0b0001); direction(0b0011); break;\\n case 2 : direction(0b0010); direction(0b0110); break;\\n case 3 : direction(0b0100); direction(0b1100); break;\\n case 4 : direction(0b1000); direction(0b1001); break;\\n }\\n _step_cnt = (_step_cnt + 1) % 4;\\n }\\n }\\n } else if (_direction == -1) {\\n for (int i = 0; i < _step; i++) {\\n if (_mode == 0) {\\n direction(0b1000);\\n direction(0b1100);\\n direction(0b0100);\\n direction(0b0110);\\n direction(0b0010);\\n direction(0b0011);\\n direction(0b0001);\\n direction(0b1001);\\n } else {\\n switch (_step_cnt) {\\n case 0 : direction(0b1000); direction(0b1100); break;\\n case 1 : direction(0b0100); direction(0b0110); break;\\n case 2 : direction(0b0010); direction(0b0011); break;\\n case 3 : direction(0b0001); direction(0b1001); break;\\n }\\n _step_cnt = (_step_cnt + 1) % 4;\\n }\\n }\\n }\\n }\\n}\\n\\n\\nI2CMotorDriver Motor;\\n\\n// End of File\\n\" }", "{ filename: \"src/Grove_I2C_Motor_Driver.h\", code: \"/*\\n Grove_I2C_Motor_Driver.h\\n A library for Grove - I2C Motor Driver v1.3\\n\\n Copyright (c) 2012 seeed technology inc.\\n Website : www.seeed.cc\\n Author : Jerry Yip\\n Create Time: 2017-02\\n Change Log :\\n\\n The MIT License (MIT)\\n\\n Permission is hereby granted, free of charge, to any person obtaining a copy\\n of this software and associated documentation files (the \\\"Software\\\"), to deal\\n in the Software without restriction, including without limitation the rights\\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\n copies of the Software, and to permit persons to whom the Software is\\n furnished to do so, subject to the following conditions:\\n\\n The above copyright notice and this permission notice shall be included in\\n all copies or substantial portions of the Software.\\n\\n THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\\n THE SOFTWARE.\\n*/\\n\\n#ifndef __I2CMOTORDRIVER_H__\\n#define __I2CMOTORDRIVER_H__\\n\\n#include \\n\\n/******I2C command definitions*************/\\n#define MotorSpeedSet 0x82\\n#define PWMFrequenceSet 0x84\\n#define DirectionSet 0xaa\\n#define MotorSetA 0xa1\\n#define MotorSetB 0xa5\\n#define Nothing 0x01\\n/**************Motor ID**********************/\\n#define MOTOR1 \\t\\t\\t 1\\n#define MOTOR2 \\t\\t\\t 2\\n/**************Motor Direction***************/\\n#define BothClockWise 0x0a\\n#define BothAntiClockWise 0x05\\n#define M1CWM2ACW 0x06\\n#define M1ACWM2CW 0x09\\n/**************Motor Direction***************/\\n#define ClockWise 0x0a\\n#define AntiClockWise 0x05\\n/**************Prescaler Frequence***********/\\n#define F_31372Hz 0x01\\n#define F_3921Hz 0x02\\n#define F_490Hz 0x03\\n#define F_122Hz 0x04\\n#define F_30Hz 0x05\\n\\n/*************************Class for Grove I2C Motor Driver********************/\\nclass I2CMotorDriver {\\n\\n private:\\n // _speed0: 0~100 _speed1: 0~100\\n unsigned char _speed1 = 0;\\n unsigned char _speed2 = 0;\\n // the direction of M1 and M2 DC motor 1:clockwise -1:anticlockwise\\n int _M1_direction = 1;\\n int _M2_direction = 1;\\n // _i2c_add: 0x00~0x0f\\n unsigned char _i2c_add = 0x0f;\\n // Set the direction of both motors\\n // _direction: BothClockWise, BothAntiClockWise, M1CWM2ACW, M1ACWM2CW\\n void direction(unsigned char _direction);\\n unsigned char _step_cnt = 0;\\n\\n public:\\n // Initialize I2C with an I2C address you set on Grove - I2C Motor Driver v1.3\\n // default i2c address: 0x0f\\n int begin(unsigned char i2c_add);\\n // Set the speed of a motor, speed is equal to duty cycle here\\n // motor_id: MOTOR1, MOTOR2\\n // _speed: -100~100, when _speed>0, dc motor runs clockwise;\\n // when _speed<0, dc motor runs anticlockwise\\n void speed(unsigned char motor_id, int _speed);\\n // Set the frequence of PWM(cycle length = 510, system clock = 16MHz)\\n // F_3921Hz is default\\n // _frequence: F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\\n void frequence(unsigned char _frequence);\\n // Stop one motor\\n // motor_id: MOTOR1, MOTOR2\\n void stop(unsigned char motor_id);\\n // Drive a stepper motor\\n // _step: -1024~1024, when _step>0, stepper motor runs clockwise; when\\n // _step<0, stepper motor runs anticlockwise; when _step is 512, the stepper\\n // motor will run a complete turn; if step is 1024, the stepper motor will\\n // run 2 turns.\\n // _type: 0 -> 4 phase stepper motor\\n // 1 -> 2 phase stepper motor\\n // _mode: 0 -> compatible mode (_step=1 corresponds 4 steps)\\n // 1 -> fine mode (_step1 corresponds 1 steps)\\n void StepperRun(int _step, int _type = 0, int _mode = 0);\\n};\\n\\nextern I2CMotorDriver Motor;\\n\\n#endif\\n\" }", "{ filename: \"src/SparkFunMiniMoto.cpp\", code: \"/****************************************************************\\n Example code demonstrating the use of the Arduino Library for\\n the SparkFun MiniMoto board, which uses the TI DRV8830 IC for I2C\\n low-voltage DC motor control.\\n\\n This code is beerware; if you use it, please buy me (or any other\\n SparkFun employee) a cold beverage next time you run into one of\\n us at the local.\\n\\n 17 Sep 2013- Mike Hord, SparkFun Electronics\\n\\n Code developed in Arduino 1.0.5, on a Fio classic board.\\n\\n**Updated for Arduino 1.6.4 5/2015**\\n****************************************************************/\\n\\n\\n#include \\n#include \\\"SparkFunMiniMoto.h\\\"\\n// The address of the part is set by a jumper on the board.\\n// See datasheet or schematic for details; default is 0xD0.\\nMiniMoto::MiniMoto(byte addr) {\\n _addr = addr;\\n\\n // This sets the bit rate of the bus; I want 100kHz. See the\\n // datasheet for details on how I came up with this value.\\n#if !(defined(__SAMD21__) || defined(__SAMD51__))\\n TWBR = 72;\\n#endif\\n}\\n\\n// Return the fault status of the DRV8830 chip. Also clears any existing faults.\\nbyte MiniMoto::getFault() {\\n byte buffer = 0;\\n byte clearFault = 0x80;\\n I2CReadBytes(0x01, &buffer, 1);\\n I2CWriteBytes(0x01, &clearFault, 1);\\n return buffer;\\n}\\n\\n// Send the drive command over I2C to the DRV8830 chip. Bits 7:2 are the speed\\n// setting; range is 0-63. Bits 1:0 are the mode setting:\\n// - 00 = HI-Z\\n// - 01 = Reverse\\n// - 10 = Forward\\n// - 11 = H-H (brake)\\nvoid MiniMoto::drive(int speed) {\\n byte regValue = 0x80; // Before we do anything, we'll want to\\n // clear the fault status. To do that\\n // write 0x80 to register 0x01 on the\\n // DRV8830.\\n I2CWriteBytes(0x01, ®Value, 1); // Clear the fault status.\\n regValue = (byte)abs(speed); // Find the byte-ish abs value of the input\\n if (regValue > 63) {\\n regValue = 63; // Cap the value at 63.\\n }\\n regValue = regValue << 2; // Left shift to make room for bits 1:0\\n if (speed < 0) {\\n regValue |= 0x01; // Set bits 1:0 based on sign of input.\\n } else {\\n regValue |= 0x02;\\n }\\n\\n I2CWriteBytes(0x00, ®Value, 1);\\n}\\n\\n// Coast to a stop by hi-z'ing the drivers.\\nvoid MiniMoto::stop() {\\n byte regValue = 0; // See above for bit 1:0 explanation.\\n\\n I2CWriteBytes(0x00, ®Value, 1);\\n}\\n\\n// Stop the motor by providing a heavy load on it.\\nvoid MiniMoto::brake() {\\n byte regValue = 0x03; // See above for bit 1:0 explanation.\\n\\n I2CWriteBytes(0x00, ®Value, 1);\\n}\\n\\n// Private function that reads some number of bytes from the accelerometer.\\nvoid MiniMoto::I2CReadBytes(byte addr, byte* buffer, byte len) {\\n#if defined(__SAMD21__) || defined(__SAMD51__)\\n\\tWire.begin();\\n\\tWire.beginTransmission((uint16_t)_addr >> 1 & 0x7f);\\n\\tWire.write(addr);\\n\\tWire.endTransmission();\\n\\tWire.requestFrom((uint16_t)_addr >> 1 & 0x7f, len);\\n\\twhile(! Wire.available());\\n\\tfor (byte i = 0; i < len ; i++){\\n\\t\\tbuffer[i] = Wire.read();\\n\\t}\\n#else\\n byte temp = 0;\\n // First, we need to write the address we want to read from, so issue a write\\n // with that address. That's two steps: first, the slave address:\\n TWCR = START_COND; // Send a start condition\\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\\n // can initiate data transfer.\\n TWDR = _addr; // Load the slave address\\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\\n // it LOOKS like I'm setting it, but this is\\n // how we clear that bit. Dumb.)\\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\\n // Now, we need to send the address we want to read from:\\n TWDR = addr; // Load the slave address\\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\\n // it LOOKS like I'm setting it, but this is\\n // how we clear that bit. Dumb.)\\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\\n TWCR = STOP_COND;\\n\\n // Now, we issue a repeated start (by doing what we just did again), and this\\n // time, we set the READ bit as well.\\n TWCR = START_COND; // Send a start condition\\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\\n // can initiate data transfer.\\n TWDR = (_addr) | I2C_READ; // Load the slave address and set the read bit\\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\\n // it LOOKS like I'm setting it, but this is\\n // how we clear that bit. Dumb.)\\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\\n\\n // Now, we can fetch data from the slave by clearing TWINT, waiting, and\\n // reading the data. Rinse, repeat, as often as needed.\\n for (byte i = 0; i < len; i++) {\\n if (i == len - 1) {\\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\\n }\\n // it LOOKS like I'm setting it, but this is\\n // how we clear that bit. Dumb.)\\n else {\\n TWCR = NEXT_BYTE;\\n }\\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\\n buffer[i] = TWDR; // Now our data can be fetched from TWDR.\\n }\\n // Now that we're done reading our data, we can transmit a stop condition.\\n TWCR = STOP_COND;\\n#endif\\n}\\n\\nvoid MiniMoto::I2CWriteBytes(byte addr, byte* buffer, byte len) {\\n#if defined(__SAMD21__) || defined(__SAMD51__)\\n\\tWire.begin();\\n\\tWire.beginTransmission((uint16_t)_addr >> 1 & 0x7f);\\n\\tWire.write(addr);\\n\\tfor (byte i = 0; i < len ; i++){\\n\\tWire.write(buffer[i]);\\n\\t}\\n\\tWire.endTransmission();\\n#else\\n // First, we need to write the address we want to read from, so issue a write\\n // with that address. That's two steps: first, the slave address:\\n TWCR = START_COND; // Send a start condition\\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\\n // can initiate data transfer.\\n TWDR = _addr; // Load the slave address\\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\\n // it LOOKS like I'm setting it, but this is\\n // how we clear that bit. Dumb.)\\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\\n // Now, we need to send the address we want to read from:\\n TWDR = addr; // Load the slave address\\n TWCR |= CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\\n // it LOOKS like I'm setting it, but this is\\n // how we clear that bit. Dumb.)\\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\\n\\n // Now, we can send data to the slave by putting data into TWDR, clearing\\n // TWINT, and waiting for TWINT. Rinse, repeat, as often as needed.\\n for (byte i = 0; i < len; i++) {\\n TWDR = buffer[i]; // Now our data can be sent to TWDR.\\n TWCR |= CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\\n // it LOOKS like I'm setting it, but this is\\n // how we clear that bit. Dumb.)\\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\\n }\\n // Now that we're done writing our data, we can transmit a stop condition.\\n TWCR = STOP_COND;\\n#endif\\n}\\n\" }", "{ filename: \"src/SparkFunMiniMoto.h\", code: \"/****************************************************************\\n Example code demonstrating the use of the Arduino Library for\\n the SparkFun MiniMoto board, which uses the TI DRV8830 IC for I2C\\n low-voltage DC motor control.\\n\\n This code is beerware; if you use it, please buy me (or any other\\n SparkFun employee) a cold beverage next time you run into one of\\n us at the local.\\n\\n 17 Sep 2013- Mike Hord, SparkFun Electronics\\n\\n Code developed in Arduino 1.0.5, on a Fio classic board.\\n\\n**Updated for Arduino 1.6.4 5/2015**\\n****************************************************************/\\n\\n\\n#ifndef SparkFunMiniMoto_h\\n#define SparkFunMiniMoto_h\\n\\n#include \\n\\n// I2C support constants\\n#define I2C_READ 0x01 // I2C read bit set\\n// Some values we'll load into TWCR a lot\\n#define START_COND 0xA4 // (1<= 0; --i) { var entry = this.tryEntries[i]; var record = entry.completion; if (entry.tryLoc === "root") { return handle("end"); } if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"); var hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } else if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else if (hasCatch) { if (this.prev < entry.catchLoc) { return handle(entry.catchLoc, true); } } else if (hasFinally) { if (this.prev < entry.finallyLoc) { return handle(entry.finallyLoc); } } else { throw new Error("try statement without catch or finally"); } } } }, abrupt: function (type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { finallyEntry = null; } var record = finallyEntry ? finallyEntry.completion : {}; record.type = type; record.arg = arg; if (finallyEntry) { this.method = "next"; this.next = finallyEntry.finallyLoc; return ContinueSentinel; } return this.complete(record); }, complete: function (record, afterLoc) { if (record.type === "throw") { throw record.arg; } if (record.type === "break" || record.type === "continue") { this.next = record.arg; } else if (record.type === "return") { this.rval = this.arg = record.arg; this.method = "return"; this.next = "end"; } else if (record.type === "normal" && afterLoc) { this.next = afterLoc; } return ContinueSentinel; }, finish: function (finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) { this.complete(entry.completion, entry.afterLoc); resetTryEntry(entry); return ContinueSentinel; } } }, "catch": function (tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (record.type === "throw") { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function (iterable, resultName, nextLoc) { this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }; if (this.method === "next") { this.arg = undefined; } return ContinueSentinel; } }; }(function () { return this || typeof self === "object" && self; }() || Function("return this")()); const disableBlocks = { debug: [], upload: [] }; const mustLoginBlocks = []; const triggerBlocksStatus = async (mode, app) => {}; const blockHandlers = { 'BLOCK_1654872700954': { onRun: (args, app, device, block) => {} }, 'BLOCK_1654872701201': { onRun: (args, app, device, block) => {} }, 'BLOCK_1654880700150': { onRun: (args, app, device, block) => {} }, 'BLOCK_1654880700383': { onRun: (args, app, device, block) => {} } }; const ExtHandler = { onLoad(app, target) {}, onUnload(app) {}, onConnect(app, device) {}, onDisconnect(app, device) {}, onStopAll(app, device) {}, beforeChangeUploadMode(app, device) { return true; }, beforeChangeDebugMode(app, device) { return true; }, afterChangeUploadMode(app, device) { return true; }, afterChangeDebugMode(app, device) { return true; }, onSelect(app, device) {}, onUnselect(app, device) {}, beforeCodeUpload(app, device) {}, afterCodeUpload(app, device) {}, onRead(app, device) {} }; self.rpc.exports = { runBlock: function runBlock(opcode, method, deviceId, block, args) { var blockHandler = blockHandlers[opcode]; if (!blockHandler) { console.error('cannot find opcode of ' + opcode); return null; } var handle = blockHandler[method]; let app = __context.app; let device = __context.getDevice(deviceId); if (method === 'onRun') { return handle(args, app, device, block); } else { return handle(app, device, block); } }, runExtension: function runExtension(srcMethod, deviceId) { var method = ExtHandler[srcMethod]; if (!method) { console.error('method of ' + srcMethod + ' is no valid'); return null; } let app = __context.app; if (deviceId) { let device = __context.getDevice(deviceId); return method(app, device); } else { return method(app); } } };PK ۈT src/cates/PK ۈTsrc/cates/cate_ee80b27a/PK ۈTtQQ src/cates/cate_ee80b27a/index.jsimport blocks from './blocks.js'; const cate_ee80b27a = (facepanels) => ({ "name": "cate_ee80b27a", "colors": [ "#FF6F00", "#E66400", "#CC5900" ], "menuIconURI": "", "blockIcon": null, "blocks": blocks(facepanels), "menus": { "BLOCK_1654872700954_PORT": [{ "text": "BLOCK_1654872700954_PORT_0", "value": "1" }, { "text": "BLOCK_1654872700954_PORT_1", "value": "2" } ], "BLOCK_1654872701201_PORT": [{ "text": "BLOCK_1654872701201_PORT_0", "value": "0" }, { "text": "BLOCK_1654872701201_PORT_1", "value": "1" } ], "BLOCK_1654872701201_FREIN": [{ "text": "BLOCK_1654872701201_FREIN_0", "value": "stop" }, { "text": "BLOCK_1654872701201_FREIN_1", "value": "brake" } ] } }); export default cate_ee80b27a;PK ۈTsrc/cates/cate_f5fb6cd1/PK ۈT}KK src/cates/cate_f5fb6cd1/index.jsimport blocks from './blocks.js'; const cate_f5fb6cd1 = (facepanels) => ({ "name": "cate_f5fb6cd1", "colors": [ "#FF6F00", "#E66400", "#CC5900" ], "menuIconURI": "", "blockIcon": null, "blocks": blocks(facepanels), "menus": { "BLOCK_1654880700150_PORT": [{ "text": "BLOCK_1654880700150_PORT_0", "value": "MOTOR1" }, { "text": "BLOCK_1654880700150_PORT_1", "value": "MOTOR2" } ] } }); export default cate_f5fb6cd1;PK ۈT+<&src/cates/index.jsimport cate_ee80b27a from './cate_ee80b27a/index.js'; import cate_f5fb6cd1 from './cate_f5fb6cd1/index.js'; const cates = (facepanels) => ([ cate_ee80b27a(facepanels), cate_f5fb6cd1(facepanels) ]); export default cates;PK ۈT}ff!src/cates/cate_ee80b27a/blocks.jsconst blocks = (extFacePanels) => ([{ "opcode": "BLOCK_1654872700954", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "1", "menu": "BLOCK_1654872700954_PORT" }, "speed": { "type": "number", "defaultValue": 100 } }, "branchCount": 0, "codes": { "arduinoc": { "code": `motor/*{port}*/.drive(/*{speed}*/);`, "sections": { "include": [ "\"src/SparkFunMiniMoto.h\"" ], "declare": `MiniMoto motor0(0xC4);\r\nMiniMoto motor1(0xC0);` } } }, "handler": this.funcs.BLOCK_1654872700954 }, { "opcode": "BLOCK_1654872701201", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "0", "menu": "BLOCK_1654872701201_PORT" }, "frein": { "type": "fieldMenu", "defaultValue": "stop", "menu": "BLOCK_1654872701201_FREIN" } }, "branchCount": 0, "codes": { "arduinoc": { "code": `motor/*{port}*/./*{frein}*/();`, "sections": { "include": [ "\"src/SparkFunMiniMoto.h\"" ], "declare": `MiniMoto motor0(0xC4);\r\nMiniMoto motor1(0xC0);` } } }, "handler": this.funcs.BLOCK_1654872701201 } ]); export default blocks;PK ۈTƂy!src/cates/cate_f5fb6cd1/blocks.jsconst blocks = (extFacePanels) => ([{ "opcode": "BLOCK_1654880700150", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "MOTOR1", "menu": "BLOCK_1654880700150_PORT" }, "vitesse": { "type": "number", "defaultValue": 100 } }, "branchCount": 0, "codes": { "arduinoc": { "code": `Motor.speed(/*{port}*/, /*{vitesse}*/);`, "sections": { "include": [ "\"src/Grove_I2C_Motor_Driver.h\"" ], "declare": `#define I2C_ADDRESS 0x0f`, "setup": `Motor.begin(I2C_ADDRESS);` } } }, "handler": this.funcs.BLOCK_1654880700150 }, { "opcode": "BLOCK_1654880700383", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "arguments": { "port": { "type": "fieldMenu", "defaultValue": "MOTOR1", "menu": "BLOCK_1654880700150_PORT" } }, "branchCount": 0, "codes": { "arduinoc": { "code": `Motor.stop(/*{port}*/);`, "sections": { "include": [ "\"src/Grove_I2C_Motor_Driver.h\"" ], "declare": `#define I2C_ADDRESS 0x0f`, "setup": `Motor.begin(I2C_ADDRESS);` } } }, "handler": this.funcs.BLOCK_1654880700383 } ]); export default blocks;PK ۈT src/langs/PK ۈTƟi<<src/langs/zh.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/de.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/es.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/fr.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/id.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/ja.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/ja-jph.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/ko.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/pl.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/uk.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/zh-hant.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/nl.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/it.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/hr.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/ru.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/pt.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/fi.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/tr.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/tk.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTƟi<<src/langs/en.jsexport default { "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" };PK ۈTiisrc/langs/index.jsimport zh from './zh.js'; import de from './de.js'; import es from './es.js'; import fr from './fr.js'; import id from './id.js'; import ja from './ja.js'; import jaJph from './ja-jph.js'; import ko from './ko.js'; import pl from './pl.js'; import uk from './uk.js'; import zhHant from './zh-hant.js'; import nl from './nl.js'; import it from './it.js'; import hr from './hr.js'; import ru from './ru.js'; import pt from './pt.js'; import fi from './fi.js'; import tr from './tr.js'; import tk from './tk.js'; import en from './en.js'; const langs = { 'zh': zh, 'de': de, 'es': es, 'fr': fr, 'id': id, 'ja': ja, 'ja-jph': jaJph, 'ko': ko, 'pl': pl, 'uk': uk, 'zh-hant': zhHant, 'nl': nl, 'it': it, 'hr': hr, 'ru': ru, 'pt': pt, 'fi': fi, 'tr': tr, 'tk': tk, 'en': en }; export default langs;PK ۈTM3ss manifest.json{ "id": "vdr_grove_moteur", "iconURL": "vdr_grove_moteur/imgs/df6d9f30cdf14ac38c24c642088ebd28.jpg", "coverURL": "./res/df6d9f30cdf14ac38c24c642088ebd28.jpg", "name": { "zh": "vdr grove moteur", "de": "vdr grove moteur", "es": "vdr grove moteur", "fr": "vdr grove moteur", "id": "vdr grove moteur", "ja": "vdr grove moteur", "ja-jph": "vdr grove moteur", "ko": "vdr grove moteur", "pl": "vdr grove moteur", "uk": "vdr grove moteur", "zh-hant": "vdr grove moteur", "nl": "vdr grove moteur", "it": "vdr grove moteur", "hr": "vdr grove moteur", "ru": "vdr grove moteur", "pt": "vdr grove moteur", "fi": "vdr grove moteur", "tr": "vdr grove moteur", "tk": "vdr grove moteur", "en": "vdr grove moteur" }, "description": { "zh": "", "de": "", "es": "", "fr": "", "id": "", "ja": "", "ja-jph": "", "ko": "", "pl": "", "uk": "", "zh-hant": "", "nl": "", "it": "", "hr": "", "ru": "", "pt": "", "fi": "", "tr": "", "tk": "", "en": "" }, "targets": [ "arduino_mega2560", "arduino_uno" ], "main": "vdr_grove_moteur/index.js", "codeTypes": [ "arduinoc" ], "device": false, "sortId": 999, "version": "1.0.0", "extApiVersion": [ "1.0.3" ], "platform": [ "mblockpc" ], "homepage": "", "feature": [ "worker" ] }PK ۈT data.bak/PK ۈTOϬ`r`rdata.bak/ext.json{ "identify": "vdr_grove_moteur", "version": "1.0.0", "device": false, "template": "arduinoc", "cover": { "name": "I2CMotorDriver_New.jpg", "url": "https://mblock-expanded.oss-cn-shenzhen.aliyuncs.com/df6d9f30cdf14ac38c24c642088ebd28.jpg" }, "codeTypes": [ "arduinoc" ], "generator": { "arduinoc": { "template": "// generated by mBlock5 for \n// codes make you happy\n\n//( include //)\n#include \n//( lib //)\n\n//({\n this.$ALL_VARIABLES.length==0?'':this.$ALL_VARIABLES.map(v=>\"float \"+v+\" = 0;\").join('\\\\n')\n}//)\n\n//( declare //)\n\n\nvoid _delay(float seconds) {\n long endTime = millis() + seconds * 1000;\n while(millis() < endTime) _loop();\n}\n\n//(\nvoid setup() {\n //( setup //)\n //( code //)\n}\n//)\n\nvoid _loop() {\n //( _loop //)\n}\n\nvoid loop() {\n _loop();\n}", "generator": "({\n lang: 'arduinoc',\n template: `<%=template%>`,\n splitor: {\n frame: {\n left: \"//(\",\n right: \"//)\",\n },\n expression: {\n left: \"/*{\",\n right: \"}*/\",\n }\n },\n reducers: [\n {\n name: 'include',\n reduce: (codes) => {\n let codes1 = []\n for (let code of codes) {\n let codeStr = '';\n if (typeof code === 'string') {\n codeStr = code;\n } else if (typeof code === 'function') {\n codeStr = code();\n }\n if (codes1.indexOf(codeStr) === -1) {\n codes1.push(codeStr);\n }\n }\n if (codes1.length === 0) {\n return undefined;\n }\n return codes1.map(code => {\n return '#include ' + code;\n }).join('\\n') + '\\n'\n }\n }\n ]\n})", "snippets": "", "sources": [ { "name": "src/Grove_I2C_Motor_Driver.cpp", "url": "src/Grove_I2C_Motor_Driver.cpp", "fileData": "/*\n Grove_I2C_Motor_Driver.cpp\n A library for Grove - I2C Motor Driver v1.3\n\n Copyright (c) 2012 seeed technology inc.\n Website : www.seeed.cc\n Author : Jerry Yip\n Create Time: 2017-02\n Change Log : 2018-05-31 1.support two phase stepper motor\n\n The MIT License (MIT)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n*/\n\n\n#include \"Grove_I2C_Motor_Driver.h\"\n#include \n\n/*********************************stepper motor type*******************************/\n// Define stepper motor type. Support 4 phase stepper motor by default.\n// If 2 phase motor is used, define TWO_PHASE_STEPPER_MOTOR in the ino file.\n// #define TWO_PHASE_STEPPER_MOTOR\n\n// *********************************Initialize*********************************\n// Initialize I2C with an I2C address you set on Grove - I2C Motor Driver v1.3\n// default i2c address: 0x0f\nint I2CMotorDriver::begin(unsigned char i2c_add) {\n if (i2c_add > 0x0f) {\n Serial.println(\"Error! I2C address must be between 0x00 to 0x0F\");\n return (-1); // I2C address error\n }\n Wire.begin();\n delayMicroseconds(10000);\n this->_i2c_add = i2c_add;\n // Set default frequence to F_3921Hz\n frequence(F_3921Hz);\n return (0); // OK\n}\n\n// *****************************Private Function*******************************\n// Set the direction of 2 motors\n// _direction: M1CWM2ACW(M1 ClockWise M2 AntiClockWise), M1ACWM2CW, BothClockWise, BothAntiClockWise,\nvoid I2CMotorDriver::direction(unsigned char _direction) {\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(DirectionSet); // Direction control header\n Wire.write(_direction); // send direction control information\n Wire.write(Nothing); // need to send this byte as the third byte(no meaning)\n Wire.endTransmission(); // stop transmitting\n delay(4); \t\t\t\t // wait\n}\n\n// *****************************DC Motor Function******************************\n// Set the speed of a motor, speed is equal to duty cycle here\n// motor_id: MOTOR1, MOTOR2\n// _speed: -100~100, when _speed>0, dc motor runs clockwise; when _speed<0,\n// dc motor runs anticlockwise\nvoid I2CMotorDriver::speed(unsigned char motor_id, int _speed) {\n if (motor_id < MOTOR1 || motor_id > MOTOR2) {\n Serial.println(\"Motor id error! Must be MOTOR1 or MOTOR2\");\n return;\n }\n\n if (motor_id == MOTOR1) {\n if (_speed >= 0) {\n this->_M1_direction = 1;\n _speed = _speed > 100 ? 100 : _speed;\n this->_speed1 = map(_speed, 0, 100, 0, 255);\n } else if (_speed < 0) {\n this->_M1_direction = -1;\n _speed = _speed < -100 ? 100 : -(_speed);\n this->_speed1 = map(_speed, 0, 100, 0, 255);\n }\n } else if (motor_id == MOTOR2) {\n if (_speed >= 0) {\n this->_M2_direction = 1;\n _speed = _speed > 100 ? 100 : _speed;\n this->_speed2 = map(_speed, 0, 100, 0, 255);\n } else if (_speed < 0) {\n this->_M2_direction = -1;\n _speed = _speed < -100 ? 100 : -(_speed);\n this->_speed2 = map(_speed, 0, 100, 0, 255);\n }\n }\n // Set the direction\n if (_M1_direction == 1 && _M2_direction == 1) {\n direction(BothClockWise);\n }\n if (_M1_direction == 1 && _M2_direction == -1) {\n direction(M1CWM2ACW);\n }\n if (_M1_direction == -1 && _M2_direction == 1) {\n direction(M1ACWM2CW);\n }\n if (_M1_direction == -1 && _M2_direction == -1) {\n direction(BothAntiClockWise);\n }\n // send command\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(MotorSpeedSet); // set pwm header\n Wire.write(this->_speed1); // send speed of motor1\n Wire.write(this->_speed2); // send speed of motor2\n Wire.endTransmission(); \t\t // stop transmitting\n delay(4); \t\t\t\t // Wait\n}\n\n// Set the frequence of PWM(cycle length = 510, system clock = 16MHz)\n// F_3921Hz is default\n// _frequence: F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\nvoid I2CMotorDriver::frequence(unsigned char _frequence) {\n if (_frequence < F_31372Hz || _frequence > F_30Hz) {\n Serial.println(\"frequence error! Must be F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\");\n return;\n }\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(PWMFrequenceSet); // set frequence header\n Wire.write(_frequence); // send frequence\n Wire.write(Nothing); // need to send this byte as the third byte(no meaning)\n Wire.endTransmission(); // stop transmitting\n delay(4); \t\t\t\t // wait\n}\n\n// Stop one motor\n// motor_id: MOTOR1, MOTOR2\nvoid I2CMotorDriver::stop(unsigned char motor_id) {\n if (motor_id < MOTOR1 || motor_id > MOTOR2) {\n Serial.println(\"Motor id error! Must be MOTOR1 or MOTOR2\");\n return;\n }\n speed(motor_id, 0);\n}\n\n// ***************************Stepper Motor Function***************************\n// Drive a stepper motor\n// _step: -1024~1024, when _step>0, stepper motor runs clockwise; when _step<0,\n// stepper motor runs anticlockwise; when _step is 512, the stepper motor will\n// run a complete turn; if step is 1024, the stepper motor will run 2 turns.\n// _type: 0 -> 4 phase stepper motor, default\n// 1 -> 2 phase stepper motor\n// _mode: 0 -> compatible mode (_step=1 corresponds 4 steps)\n// 1 -> fine mode (_step1 corresponds 1 steps)\nvoid I2CMotorDriver::StepperRun(int _step, int _type, int _mode) {\n int _direction = 1;\n if (_step > 0) {\n _direction = 1; //clockwise\n _step = _step > 1024 ? 1024 : _step;\n } else if (_step < 0) {\n _direction = -1; //anti-clockwise\n _step = _step < -1024 ? 1024 : -(_step);\n }\n this->_speed1 = 255;\n this->_speed2 = 255;\n Wire.beginTransmission(this->_i2c_add); // begin transmission\n Wire.write(MotorSpeedSet); // set pwm header\n Wire.write(this->_speed1); // send speed of motor1\n Wire.write(this->_speed2); // send speed of motor2\n Wire.endTransmission(); \t\t // stop transmitting\n delay(4); \t\t\t\t // wait\n\n if (_type == 1) {\n if (_direction == 1) {\t\t\t\t// 2 phase motor\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b0001);\n direction(0b0101);\n direction(0b0100);\n direction(0b0110);\n direction(0b0010);\n direction(0b1010);\n direction(0b1000);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b0001); direction(0b0101); break;\n case 1 : direction(0b0100); direction(0b0110); break;\n case 2 : direction(0b0010); direction(0b1010); break;\n case 3 : direction(0b1000); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n } else if (_direction == -1) {\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b1000);\n direction(0b1010);\n direction(0b0010);\n direction(0b0110);\n direction(0b0100);\n direction(0b0101);\n direction(0b0001);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b1000); direction(0b1010); break;\n case 1 : direction(0b0010); direction(0b0110); break;\n case 2 : direction(0b0100); direction(0b0101); break;\n case 3 : direction(0b0001); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n }\n } else if (_type == 0) {\n if (_direction == 1) {\t\t\t\t// 4 phase motor\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b0001);\n direction(0b0011);\n direction(0b0010);\n direction(0b0110);\n direction(0b0100);\n direction(0b1100);\n direction(0b1000);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b0001); direction(0b0011); break;\n case 2 : direction(0b0010); direction(0b0110); break;\n case 3 : direction(0b0100); direction(0b1100); break;\n case 4 : direction(0b1000); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n } else if (_direction == -1) {\n for (int i = 0; i < _step; i++) {\n if (_mode == 0) {\n direction(0b1000);\n direction(0b1100);\n direction(0b0100);\n direction(0b0110);\n direction(0b0010);\n direction(0b0011);\n direction(0b0001);\n direction(0b1001);\n } else {\n switch (_step_cnt) {\n case 0 : direction(0b1000); direction(0b1100); break;\n case 1 : direction(0b0100); direction(0b0110); break;\n case 2 : direction(0b0010); direction(0b0011); break;\n case 3 : direction(0b0001); direction(0b1001); break;\n }\n _step_cnt = (_step_cnt + 1) % 4;\n }\n }\n }\n }\n}\n\n\nI2CMotorDriver Motor;\n\n// End of File\n" }, { "name": "src/Grove_I2C_Motor_Driver.h", "url": "src/Grove_I2C_Motor_Driver.h", "fileData": "/*\n Grove_I2C_Motor_Driver.h\n A library for Grove - I2C Motor Driver v1.3\n\n Copyright (c) 2012 seeed technology inc.\n Website : www.seeed.cc\n Author : Jerry Yip\n Create Time: 2017-02\n Change Log :\n\n The MIT License (MIT)\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n*/\n\n#ifndef __I2CMOTORDRIVER_H__\n#define __I2CMOTORDRIVER_H__\n\n#include \n\n/******I2C command definitions*************/\n#define MotorSpeedSet 0x82\n#define PWMFrequenceSet 0x84\n#define DirectionSet 0xaa\n#define MotorSetA 0xa1\n#define MotorSetB 0xa5\n#define Nothing 0x01\n/**************Motor ID**********************/\n#define MOTOR1 \t\t\t 1\n#define MOTOR2 \t\t\t 2\n/**************Motor Direction***************/\n#define BothClockWise 0x0a\n#define BothAntiClockWise 0x05\n#define M1CWM2ACW 0x06\n#define M1ACWM2CW 0x09\n/**************Motor Direction***************/\n#define ClockWise 0x0a\n#define AntiClockWise 0x05\n/**************Prescaler Frequence***********/\n#define F_31372Hz 0x01\n#define F_3921Hz 0x02\n#define F_490Hz 0x03\n#define F_122Hz 0x04\n#define F_30Hz 0x05\n\n/*************************Class for Grove I2C Motor Driver********************/\nclass I2CMotorDriver {\n\n private:\n // _speed0: 0~100 _speed1: 0~100\n unsigned char _speed1 = 0;\n unsigned char _speed2 = 0;\n // the direction of M1 and M2 DC motor 1:clockwise -1:anticlockwise\n int _M1_direction = 1;\n int _M2_direction = 1;\n // _i2c_add: 0x00~0x0f\n unsigned char _i2c_add = 0x0f;\n // Set the direction of both motors\n // _direction: BothClockWise, BothAntiClockWise, M1CWM2ACW, M1ACWM2CW\n void direction(unsigned char _direction);\n unsigned char _step_cnt = 0;\n\n public:\n // Initialize I2C with an I2C address you set on Grove - I2C Motor Driver v1.3\n // default i2c address: 0x0f\n int begin(unsigned char i2c_add);\n // Set the speed of a motor, speed is equal to duty cycle here\n // motor_id: MOTOR1, MOTOR2\n // _speed: -100~100, when _speed>0, dc motor runs clockwise;\n // when _speed<0, dc motor runs anticlockwise\n void speed(unsigned char motor_id, int _speed);\n // Set the frequence of PWM(cycle length = 510, system clock = 16MHz)\n // F_3921Hz is default\n // _frequence: F_31372Hz, F_3921Hz, F_490Hz, F_122Hz, F_30Hz\n void frequence(unsigned char _frequence);\n // Stop one motor\n // motor_id: MOTOR1, MOTOR2\n void stop(unsigned char motor_id);\n // Drive a stepper motor\n // _step: -1024~1024, when _step>0, stepper motor runs clockwise; when\n // _step<0, stepper motor runs anticlockwise; when _step is 512, the stepper\n // motor will run a complete turn; if step is 1024, the stepper motor will\n // run 2 turns.\n // _type: 0 -> 4 phase stepper motor\n // 1 -> 2 phase stepper motor\n // _mode: 0 -> compatible mode (_step=1 corresponds 4 steps)\n // 1 -> fine mode (_step1 corresponds 1 steps)\n void StepperRun(int _step, int _type = 0, int _mode = 0);\n};\n\nextern I2CMotorDriver Motor;\n\n#endif\n" }, { "name": "src/SparkFunMiniMoto.cpp", "url": "src/SparkFunMiniMoto.cpp", "fileData": "/****************************************************************\n Example code demonstrating the use of the Arduino Library for\n the SparkFun MiniMoto board, which uses the TI DRV8830 IC for I2C\n low-voltage DC motor control.\n\n This code is beerware; if you use it, please buy me (or any other\n SparkFun employee) a cold beverage next time you run into one of\n us at the local.\n\n 17 Sep 2013- Mike Hord, SparkFun Electronics\n\n Code developed in Arduino 1.0.5, on a Fio classic board.\n\n**Updated for Arduino 1.6.4 5/2015**\n****************************************************************/\n\n\n#include \n#include \"SparkFunMiniMoto.h\"\n// The address of the part is set by a jumper on the board.\n// See datasheet or schematic for details; default is 0xD0.\nMiniMoto::MiniMoto(byte addr) {\n _addr = addr;\n\n // This sets the bit rate of the bus; I want 100kHz. See the\n // datasheet for details on how I came up with this value.\n#if !(defined(__SAMD21__) || defined(__SAMD51__))\n TWBR = 72;\n#endif\n}\n\n// Return the fault status of the DRV8830 chip. Also clears any existing faults.\nbyte MiniMoto::getFault() {\n byte buffer = 0;\n byte clearFault = 0x80;\n I2CReadBytes(0x01, &buffer, 1);\n I2CWriteBytes(0x01, &clearFault, 1);\n return buffer;\n}\n\n// Send the drive command over I2C to the DRV8830 chip. Bits 7:2 are the speed\n// setting; range is 0-63. Bits 1:0 are the mode setting:\n// - 00 = HI-Z\n// - 01 = Reverse\n// - 10 = Forward\n// - 11 = H-H (brake)\nvoid MiniMoto::drive(int speed) {\n byte regValue = 0x80; // Before we do anything, we'll want to\n // clear the fault status. To do that\n // write 0x80 to register 0x01 on the\n // DRV8830.\n I2CWriteBytes(0x01, ®Value, 1); // Clear the fault status.\n regValue = (byte)abs(speed); // Find the byte-ish abs value of the input\n if (regValue > 63) {\n regValue = 63; // Cap the value at 63.\n }\n regValue = regValue << 2; // Left shift to make room for bits 1:0\n if (speed < 0) {\n regValue |= 0x01; // Set bits 1:0 based on sign of input.\n } else {\n regValue |= 0x02;\n }\n\n I2CWriteBytes(0x00, ®Value, 1);\n}\n\n// Coast to a stop by hi-z'ing the drivers.\nvoid MiniMoto::stop() {\n byte regValue = 0; // See above for bit 1:0 explanation.\n\n I2CWriteBytes(0x00, ®Value, 1);\n}\n\n// Stop the motor by providing a heavy load on it.\nvoid MiniMoto::brake() {\n byte regValue = 0x03; // See above for bit 1:0 explanation.\n\n I2CWriteBytes(0x00, ®Value, 1);\n}\n\n// Private function that reads some number of bytes from the accelerometer.\nvoid MiniMoto::I2CReadBytes(byte addr, byte* buffer, byte len) {\n#if defined(__SAMD21__) || defined(__SAMD51__)\n\tWire.begin();\n\tWire.beginTransmission((uint16_t)_addr >> 1 & 0x7f);\n\tWire.write(addr);\n\tWire.endTransmission();\n\tWire.requestFrom((uint16_t)_addr >> 1 & 0x7f, len);\n\twhile(! Wire.available());\n\tfor (byte i = 0; i < len ; i++){\n\t\tbuffer[i] = Wire.read();\n\t}\n#else\n byte temp = 0;\n // First, we need to write the address we want to read from, so issue a write\n // with that address. That's two steps: first, the slave address:\n TWCR = START_COND; // Send a start condition\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\n // can initiate data transfer.\n TWDR = _addr; // Load the slave address\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n // Now, we need to send the address we want to read from:\n TWDR = addr; // Load the slave address\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n TWCR = STOP_COND;\n\n // Now, we issue a repeated start (by doing what we just did again), and this\n // time, we set the READ bit as well.\n TWCR = START_COND; // Send a start condition\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\n // can initiate data transfer.\n TWDR = (_addr) | I2C_READ; // Load the slave address and set the read bit\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n\n // Now, we can fetch data from the slave by clearing TWINT, waiting, and\n // reading the data. Rinse, repeat, as often as needed.\n for (byte i = 0; i < len; i++) {\n if (i == len - 1) {\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n }\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n else {\n TWCR = NEXT_BYTE;\n }\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n buffer[i] = TWDR; // Now our data can be fetched from TWDR.\n }\n // Now that we're done reading our data, we can transmit a stop condition.\n TWCR = STOP_COND;\n#endif\n}\n\nvoid MiniMoto::I2CWriteBytes(byte addr, byte* buffer, byte len) {\n#if defined(__SAMD21__) || defined(__SAMD51__)\n\tWire.begin();\n\tWire.beginTransmission((uint16_t)_addr >> 1 & 0x7f);\n\tWire.write(addr);\n\tfor (byte i = 0; i < len ; i++){\n\tWire.write(buffer[i]);\n\t}\n\tWire.endTransmission();\n#else\n // First, we need to write the address we want to read from, so issue a write\n // with that address. That's two steps: first, the slave address:\n TWCR = START_COND; // Send a start condition\n while (!(TWCR & (1 << TWINT))); // When TWINT is set, start is complete, and we\n // can initiate data transfer.\n TWDR = _addr; // Load the slave address\n TWCR = CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n // Now, we need to send the address we want to read from:\n TWDR = addr; // Load the slave address\n TWCR |= CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n\n // Now, we can send data to the slave by putting data into TWDR, clearing\n // TWINT, and waiting for TWINT. Rinse, repeat, as often as needed.\n for (byte i = 0; i < len; i++) {\n TWDR = buffer[i]; // Now our data can be sent to TWDR.\n TWCR |= CLEAR_TWINT; // Clear TWINT to begin transmission (I know,\n // it LOOKS like I'm setting it, but this is\n // how we clear that bit. Dumb.)\n while (!(TWCR & (1 << TWINT))); // Wait for TWINT again.\n }\n // Now that we're done writing our data, we can transmit a stop condition.\n TWCR = STOP_COND;\n#endif\n}\n" }, { "name": "src/SparkFunMiniMoto.h", "url": "src/SparkFunMiniMoto.h", "fileData": "/****************************************************************\n Example code demonstrating the use of the Arduino Library for\n the SparkFun MiniMoto board, which uses the TI DRV8830 IC for I2C\n low-voltage DC motor control.\n\n This code is beerware; if you use it, please buy me (or any other\n SparkFun employee) a cold beverage next time you run into one of\n us at the local.\n\n 17 Sep 2013- Mike Hord, SparkFun Electronics\n\n Code developed in Arduino 1.0.5, on a Fio classic board.\n\n**Updated for Arduino 1.6.4 5/2015**\n****************************************************************/\n\n\n#ifndef SparkFunMiniMoto_h\n#define SparkFunMiniMoto_h\n\n#include \n\n// I2C support constants\n#define I2C_READ 0x01 // I2C read bit set\n// Some values we'll load into TWCR a lot\n#define START_COND 0xA4 // (1< {\n // JavaScript code\n}" }, "codes": { "arduinoc": { "include": [ "\"src/SparkFunMiniMoto.h\"" ], "lib": "", "declare": "MiniMoto motor0(0xC4);\r\nMiniMoto motor1(0xC0);", "setup": "", "code": "motor/*{port}*/.drive(/*{speed}*/);", "_loop": "" } }, "id": "314813", "create_time": 1634911077, "modify_time": 1634911077, "uid": 1281238 }, { "eid": "18917", "cid": "32157", "name": "Mini I2C motor sur @[Dropdown](fieldMenu) @[Dropdown](fieldMenu) ", "opcode": "BLOCK_1654872701201", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "disableOnline": false, "disableOffline": false, "generatorCode": false, "blockState": "incomplete", "sort": 999, "args": [ { "type": "fieldMenu", "name": "port", "val": "0", "menus": [ { "text": "port1", "value": "0" }, { "text": "port2", "value": "1" } ] }, { "type": "fieldMenu", "name": "frein", "val": "stop", "menus": [ { "text": "Arret", "value": "stop" }, { "text": "Freiner", "value": "brake" } ] } ], "handler": { "onRun": "(args, app, device, block) => {\n // JavaScript code\n}" }, "codes": { "arduinoc": { "include": [ "\"src/SparkFunMiniMoto.h\"" ], "lib": "", "declare": "MiniMoto motor0(0xC4);\r\nMiniMoto motor1(0xC0);", "setup": "", "code": "motor/*{port}*/./*{frein}*/();", "_loop": "" } }, "id": "314814", "create_time": 1634911077, "modify_time": 1654880766, "uid": 1281238 }, { "eid": "18917", "cid": "32159", "name": "I2C motor driver @[Dropdown](fieldMenu) vitesse @[Number](number) %", "opcode": "BLOCK_1654880700150", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "disableOnline": false, "disableOffline": false, "generatorCode": false, "blockState": "incomplete", "sort": 999, "args": [ { "type": "fieldMenu", "name": "port", "val": "MOTOR1", "menus": [ { "text": "port1", "value": "MOTOR1" }, { "text": "port2", "value": "MOTOR2" } ] }, { "type": "number", "name": "vitesse", "val": 100 } ], "handler": { "onRun": "(args, app, device, block) => {\n // JavaScript code\n}" }, "codes": { "arduinoc": { "include": [ "\"src/Grove_I2C_Motor_Driver.h\"" ], "lib": "", "declare": "#define I2C_ADDRESS 0x0f", "setup": "Motor.begin(I2C_ADDRESS);", "code": "Motor.speed(/*{port}*/, /*{vitesse}*/);", "_loop": "" } }, "id": "314820", "create_time": 1634911077, "modify_time": 1634911077, "uid": 1281238 }, { "eid": "18917", "cid": "32159", "name": "I2C motor driver stop @[Dropdown](fieldMenu) ", "opcode": "BLOCK_1654880700383", "blockType": "command", "checkboxInFlyout": false, "gap": 12, "disableOnline": false, "disableOffline": false, "generatorCode": false, "blockState": "incomplete", "sort": 999, "args": [ { "type": "fieldMenu", "name": "port", "menus": [ { "text": "port1", "value": "MOTOR1" }, { "text": "port2", "value": "MOTOR2" } ], "val": "MOTOR1" } ], "handler": { "onRun": "(args, app, device, block) => {\n // JavaScript code\n}" }, "codes": { "arduinoc": { "include": [ "\"src/Grove_I2C_Motor_Driver.h\"" ], "lib": "", "declare": "#define I2C_ADDRESS 0x0f", "setup": "Motor.begin(I2C_ADDRESS);", "code": "Motor.stop(/*{port}*/);", "_loop": "" } }, "id": "314821", "create_time": 1634911077, "modify_time": 1634911077, "uid": 1281238 } ]PK ۈT)L data.bak/translate.json[]PK ۈT)L data.bak/facepanel.json[]PK ۈTimgs/PK ۈT<9)imgs/df6d9f30cdf14ac38c24c642088ebd28.jpgJFIF,,0ExifII*bj(1 r2i,,GIMP 2.10.302022:04:13 18:10:55  $*/JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( HZYX^K1 58.uM'J{ՎGcpq1}*CV"rW;?h7_fayOEZؒ(S|}I o{ nt#$b/|-o&m,N EiF_s3W w@lŢ+xۜ ̟]u;X`qé9'۵q6-ôV@cӏJҊ=YٸD~ZwZ٧-w[y ݗ? xE7@XRv}E}'<)*Q0#mz264V5BJ(6 ( ( ( ( ( ( ( ( ('4W;xCЃ ̪?!~UZƻ-oK=%VСRJ̥Zv{=F[ui(k>,Zn81}^ W$/wy,8?MCiyA%,0 kzt#)γ^l;_ lJ3X e1'}n7t |75!@0GT5}BM6$Hv ؏ֻV4i)QKSRWr@.'` xVH"F ;z|/f7xxʭΉP縼X'\³aE{w goTx(u&][~o!܌\j§XmdƽKqx]yą^gxW涶E G gz7X{{ BZ@FkXl:%]*{QXAEPEPEPEPEPEPEG,BuEK u߉^ѷ 73s?ZBSv2b&vT:=۰+;RkCIrkƾ.xSNFȓjzujJ4np3rZ>"kxcoFJ.RU򫵲kԅ+_#<1=oFf;>w\vL[ ZLڿ,TWk%TZ@ps3 &.haoݻӹ>k:v8o=+~ XRh#ɏ3ya5&&^@K \6{}^i"F/5O#y[鷖Yf zGMOYZDd$`OJ[#VbT=+Su)IiBjQz4-5u"爌ֆgu@*nu=& G͞խ\k`F\33ާ~&fGH[$c=kT]5;t:'kos qWU\>3߽|HYٞ]D-!Jk6䌞x:T @F G ]8rMk71ȤsEr/\^5ݰOw^=xUc*|p4v=a}c ):FjdhQE#0Q@kƚ&2q_cOwSCi.'*I#q圗]'95RzUNHCb1To\=RwN lDX,l$``bhpvr'kr3R+R15x[KBrˍWzrۢotJkiZJ~a sMo/βU9UAFX>+jQk0^ AbHb :U/Gs!X3%љ7c_=KƱ$v3OC`. bˈ,8ND*8ϝn\VW->{,ê1P{2pq6wֹ)BN[ԕܻbiY#̐sEz|'|cŹ*axBOMG4a;gwc)(N;3 Q-r3Eq'+ u \Dbǭ|bLi7SЌW>=EuJQ2= ȯG/8qOijh 3qZVz-ȫHFrsW}fU|砪+NXk0My2XH]:D,qM,a\?Ι~\(Āؚ{.4sIgn@I:"Asqw; k{dK{aN:iKmFg^R%!F3ssNAes}q4Es_N!wyfT-3^NT]X#FM8>ҵxx5;h+*&̈z;vmm"\U ^^VWŁrP}O kigQq珹2e#޳}TZD@-}_쯨M$vWS-V>`0?:-4,cts&9~RQK2my1W8g'Yj#]ybChKscP' cibGNQwLhշ׵ Simpc$dgYŜoQAl/=7!UeIqM{Tj+*y`t ݯn "`sc6G+7IܟA=F1<1I;$_ŚdcyM,{mzqu%:ۇ,Ǟ@W9NqȮVtN6SJ7Ecns\ޭfeиp)*P0AnOjց۠vB'8Fpz1ZM_UR lH%3zt6%Fs'Sz]Xg. a4KmCw !u;4"=?EE& 䧖rzqmZPѮ$(Tr"ЖTrm#ַoV קjgDrȥ6^98ϧJn>ט&v7OT<U^.5t;RZqy_յsYpu*ןAS?Z׼-4!ZH y3]qks1UySon4M]@7,vz:}橬^"5 O:)i3r&Mn#i r"ʌWQEBml[W=KX#j*zm{H6zp Szjʜ얅2EMB+s;W<\,AhaVoٛҤ[p5O JXڜZnqcxVcp*ApVL*N9SxEMq,ı$rdZdE*ʞExh8QK"lڃZabܒM4Ұ\Cj%&SF FI$tźo #b p{kvA9=T#=ֽLW;Mx5M-͸sW5ݥ燭nDKnbt@nq3$㹯?;E8HV s:f18XTzhcC(-u6<1uR-#:dw]U-DXgy 5Oj.Ȭ!fr=s%ݯs4#;v85ṗE ' yڙᫍ#W7xyg|&a9v 1rr*F]vAzFᴼ>Ѓ o_LI2!R(?Ī3ߎx\.\(LĠ'<}j{WUK;v!~ pMBצVwufo`r*k^ա>\xM=+׼!nIpQuB#*%GBr=+oVbOhk2Ur0Jʎ.4'eupάugxDVi f@w31S޻[T2^!C`(Hf^:xj#֙ӬLE FVt=GkCWڊϩ (˝>;>lCs;΂Q"ԒZm w3E D l%۽e_~ dJIN<6Ak{%LQ yFHz۷s=ڡxae*%@$qƦ%chLUiW)#S9~Zhj\Eb@<ڽNP .A&62wtfZ+Odhdn N?,כZ/s_FPc'9vqq# bH=kR.㕞2p9`@aízjf<ںJJZ!/u8$i#A?S+3kSX&ǽmTc;_?-|3si6F:{s\<KOj^#[{{UGVI?`(RyiF{@#=;FAžHKlgC;h!\ %F;ڨ}8y<6P]Kqscr5c9!oN wj7tbh|R1 sҀ2#uldM܍"OT4X2]4$*~zWTrI\(5+َ0O9,ԑCF c]SOc&-p#?\ȑ4C% i:eͥ)t8ֽiԌ:hvVi5t[9=NyÞ&ν׭e7By ~kIc5dK8_a68uUi-t\+w9Vr;(ZFג; >^iROt/e<O5v2]h7:ܚb>Vτ&ZyWqC:cݹƝƋFIĉei] EGcejWr[q8AB:Z IpPM&dg[}UIM&2 ȐzS}gWLΰ'tI@8ϥwA(RnU%j&ii>K,0b@Hrs_Ae`,lnC ʪ#:N>n rw~#dwb۰Y7˞2OJwq|C CRgI9qT7^Yim19^sU|! ڵdz~Yi 8$O:~ *y~O^+;H`KY`!FЌW̾&>մ7@}CcǾ/^]宷.B| #?\G]wXm , 8=nWu}R2}I^gY G{tʤ`q=6D \\[*ަL%#,60ZRI;4EI7}49[$6+6BgK4伱:w4IeT)%<$Cq8@Y]V# *d[y6$^yP#Pt+Ty:}I U^C6wk_bgoԌ[GvsԚt z4P-+I4dJ⫘՜;/Ě8X?urGN+%% &׬֮$U@w3j֦XGY te?"cjF$tYXt$KxP$K_P,02k!5 nfxpsۡA>rGn!Ȍ6~(Ԯ.uHbw;}V*5w=5ۙE.Ykϝ]pʭ"Ɲ :/Qڝ\\pGC 9cuLj+YmnVX`Hp:U_Wn -߼ Aϯ9]t`MKUөӽ:I fȁث}sκ1^C}^eDVި޼ioiR}Yў[EFFi޶'D㜆#+˘,+k>E|nsI\SAa%޹78ٸ<2roZj6Shq %ے Ͻup=TϋC>_R/Evnl|40WCf'KaLܶ4,-"CG8XqKM 1.Z8*UGԤAf?k\+˵_ϐĂx։5kǥjTT6x|qOo~&VmpK@>½GDki$㻌 +)Cqz?MQhf}Ig#eGsoZt_5K?.zצCV5E%ei,+_] ֶ= X-NHz' l ?BwSSo,63ҹOEp#~8ݎ98WEyT99, BzcWu+딷;p3\\]^ȗ,[x6 nW pqktRjV}4oiM$7BۏY w/>#ٵm", sycM{Q\ҿT[n5贡q[2n͓GZbifK 9 pyAMRc3qNwviQ UQμW-dw4ddxeLH*r2+j{iKu*gݐ8YtYe=AV-* |جGGrjTTtVtj5QEc)9;DVAERQEQEQEQEQEQEfY^A'phP\XRQrX׹W5 u[$8#օWNjFUH84(әdTt;RG?O:3+LU\DRDTE-Vl"*1/$zWª䍤0LW5Tjz9G$yLtkFKM!cW:3A8LsJ88.RZsIF=Fh6A^\Ż2ҶwhZ[Xnʾ4}7H0:j%o^B}qr$JݎPZ={1 ,kk/O XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC     C     ϯ*P|Cٛ*N獀9(zָ$igyNXCgEOX+4Y5ї\x6>ŜR5 4VV]}3426jiǠI1;=ةv|qNzLͫg_ZT!Ks-DWIEbofӸQ]Q.4xBvj+-k|qvK7UtoxT)mkyMCoL~o+1B~_)6V5v ORѷkvX1 IqVoj:2s-خn؛3N+mqԈx,5wynjc:Dr̓>"_OAdJՊ>ڗ826w㕮7R|H+cS!6/Es7<}zĉ͟VڸN~M;d2?wjmr\v/RlY1FBWO[~/ÑxN2r ^oIonK,SIkM\w60]2ĕeTY&Dgh 6z`j{vqe5ʍLwvХF4tGkɯozVհnk.;kҮ"9V7u2WzM9NyezF>j'-tYZT2mt׻gs:Y;V|ڷOꧺx'Ӟl`v0xݬ[gW`hm+/*O3bIͅp'm]'='4nXx~̺p[YZ6 \ڲ˯.uF![>lI20} +0!"@ #1AP7ZAU5-K95mTdNX\U ~)ZՂfmɉH /- ax>B C$gG>Ċqk{k&e[3m+M[Q$Խ˝+*)lJ4͹GL)#Ǟ02Y([z6UX\ Mlū[ ITΛrU !pKPJ%6V4ə>Ty_رs/}iۀsnz ^ mPOXd`~}#'Ņq2wSlkPNh_c.7S㆑Mj*~]Q(?bUm#VyOc08fm5[VZ8##%wMń:Eƻ͡n]%JԾנwM˧vr&Pv(]_f̀Y]XbyoY7/ܰXet׷F#i.sWn<2%DED<ؤhxjb; NJ[j--.&k1Wf{ʠݔ4 +[ͧϛsKFEEHmƿ 6o7jE}JRgfG/ȫ,]'%jcaH)UiC#}u`-Bn],IH5IU6d_ULV``'[n UOs=" 0JU[V,^b}T&1f u}ݵXla8 <-Ab1!#WJxxRSϴ_8m ǰt:"TཛྷaWW=+=[lL26*&0[LByrlYw˳ROi5R-1mD3j9vJZd_0cZt+?p!/yBSe_'u3%]&dbkͶf"Rģ!6Am9cqJ5w2*ܠ4Q)sKN뷈%[hlu#ʾkbUW:+NG():VBM=P;,j-$8=d]|;eWԯqN;w35]^Y0!1"2AQ #0@aq3BR?t'APx}WWkm~Ҭ+8tԪ3 ]̣fGu {\-: +!%aʍ?]܆_uFd y渣`5CǙ驃Yh2xL3۵M陎i׺DiMʲRGƶb銼u5Xs3'dZt[i=]R!& 媖֝C>:Zc Ve?U\ vnғOdm&N'wlGGϨ: `̮piiɲ7B,ǥ8WeAx4:3FF7m^6#_t%vZ}U1r;Vg3W][CXtٸʬp'mjhGHui]aQfES12Åi&ƅf.fE= zhzXR_@V'ߘ}B6u[D܇c-Gs7eXvk}s>F4:\(P7׉t>ȔZ1[#umb&,3 eS}Ͷl->9T >K4XQ>뉨^%MB) 7mfЍ>j8vq8u  LuT} LZۨ1,M&^YB"Vi}\;_İ h_Cacq7h<[1 ?U٩Ʉ 'RF?VUG2쀠sUl~!LV6"d(C0,"[i6] "{]{=WY51Nᬾj3#L[4 JcwyiHiȝS?!n5y-Sc7ȃ/Ta*f:v=z~ޡ]_̿Yp8([*U7[W-lԘ#uc WZn?SA39u|2hEb@O+4:Nb˰.˧pe-ɲ'yܥ["Yne_'LF3)agn%wRл±B21"^_K4pH0΀;k{>M_qFvsԿ~ o3"ە3zG.I:i +Z$s鬻_.Ϻ߮%[nS,{꭮1-Uϑ3i%"5x*hωgSH_e,;{V |/ LױO)K^toO;!"1A2Qaq#B3Rr 0@SbP?~Iq w:KFM|+ՕYcIlшŇ׍EC|҈3V76b#{궩B0VtTK[Λ̍5 1osb q:Ar]=Yb11V$PaƬ M$xݹL. d2* li`ʥs(p8669WIeN%xAe,/D7kC?QbK<6wqi^K^5F?L:܅yqzTj4/J]XyFX;%OXĮY:; "RrfIc_ʆ&}3^0Hԏ*tk:_Q|NLhOg*([Usl- B9W/;MWcyCx8L_6Gtsay"N Auܕ{ԌpןƲ0@Sc\nEn8;kNױc0 vGS~Ϯ67\{hG484$XG;:ˋ{iu=ҽ4?ZvkGvĤzDc×ZA&ր4jl+9A"2TӬJ0s4?x>#&4,,tpEcoSje(;Qe 3=OӢe[j |B>sYn="St;@w8%po) ~\?y]BhLx<˘{s1qyU2fta9G/ ~6Hf{[Qn` bp-¦Ift`Ƿ̞ ԤwN^thZhYYrߝ)F0D):-RԲ씳a]&[LL 7tGS@Qigq懶 . # ,swhȾ6MVD;K[/JXP X rwUҼ0(19E'#axݣž)R1p*xG2+t[eIܓ)cflq.N3Fi*\1se*IoJ/,ZfS|F,81!}MR@nX)ĖkmC)ݹj#Ĩd͇26JrDb}J$%۝_*k6kI [Q4'L_!ZnU«a8ƚp'I #ֱVP/Xd׆aN}?_ҰI2.^UʼneEPr20+bE_ G${W]hG,>$cTЖ^1mh,{Β6Vg$[ΆDmGh&'~"Fϒl~ʷ/ϖ5԰qXɸxg[ Vav(#Kߟm3`~?jG9;<~ڛsgq(^ ֦Zk"L'"$##_ubavx\F®?\~[Ɖ8E(J8XSE$eiXJbp.*i l"﯅*ꭈIM&FnpgXsjb,>%e")kW-nR )G(&Ա-6R02.mqS:xc~>"$ol4Hʤô ʂ<[;n\ѩ%IԞ@pʌ}#0M`{G y(c avS[u I}UFd*˂u7{,OUK{sFY`BzJ. ^kQu8\qʉ*17hp{|lN/U!)1d{HWary,; GƂ4Yu#~W$<{. XďO?He|~P%;t{nM""ݴʰO,@>tBB2Fɧa];oDݦwCcŮOm$?ߛ_X H: P "c}_/F{tkQ] UB.,Pʗ5KBahso_F٦e}vPK0H'2BQ jOƠ+S{2N\o-e#O: h-~Uh`B쨤akKi3I{q66LN4s+$Q؂P?E*E:"Ymp}:Hrd'lCEiZ8R8Xd˗ #ٜ{6#m"Κ(L@;ˍ>9nLbVk=_#[h }[|ej<B^9ճ71as^+&υIa~W&kpm$P  7_6ph4[)4i|/ʄ jyTxh(8ʂ0uQ/aœ"o+s^f`ĸvf?Plӡ붣f`nM#v&]{*VeyžarV8yfI`;tA-ܗ_t |4}_* QG)Q#Ѽ(ɬwq4b^sm= 4xhVԶ]jL#wAc1?gF*!1AQaq 0@P?!eܔ ? 6U<0ҟT8I܉d q }{îGt{=`= VY0^NT~\@CD4_%o;> &Аe&0e`k38!>L'Lf5\FM2RDգ~OH/h)j:N)R!Du0"9!4 #HY8? <>ʧVkG jS?oAl-鐌c0`D]>1&ټzÁϔ2̿Av-IIJ^%`i.jar3?C =d&W*/DlO W6?leӼ! (0\XDNOr»rvjcddsPFD McsM[!P]edOF LM!/ X^-c5k_dJY=&n1aV=6ux#M0d0.  '5>gy>8'$ =e|SPrASR@58UU|m/sA: n޾#V MS d̯CB #Q OHǜ to?\o4C_ I$IY$I$I)>$I$@7qDI$ I$-;92VI"2/ Za!F#ڲ]>OUzeݗ,yxձH*T(1y ")}I$zˣUI$_KWI$2ȒI$ 1$I$I:1$I$I#$I$I$I$I$I)!1AQaq0@ ??ppE!:`?YjwgPtZHGНdG^(0DgQљŒ9ĥ~~p b1 va}` JE)*a}Ba`_ge81Mir-bK5&$m=:7DW:ϟϏ!B:'?bXv9ўxӎҊ9x`DZq˄%EąY 3 %%Ѯ}FG_~P' m\b^TCtW xy uXF10ܹ UҼ51Kb8[8<l։ %1@ Օ}̫&&" xCfWCYYx{X.'˫T=(*"`uk+Cm# `'7K)o.AJ\̰}`[\üԛԬnkm:#`Ȇ{gܿHGIw}>)҂,2<&9"\.9n%jrNCf-O6kAbk^`kC5G`(Ep7rJ aV"aVZI6R om"eK{:q]+ #_Z$WMTLj\ܹ4j\Y0ǚTk .lA(l~d{G&t{ywoLtҹQp1UO3dtu7%oNGZ5^`Aȗpć?pCh f\..8% `Ĝg l9s gǾGsx}` Y33TGϙrv-U0GNX% v(STW0FraL^Pm[,6az+VMGÿ}8-~fe5DPXغ_C3osY;(f"yȨ9:FmDUIƽeQ ƫGcW? }#Dx׾Yw')!1AQaq0@ ?Ϋk&Dn9ثGfpJN"U/ۘm5>a= z= %o2mv Gq@E Xȥ+D,u;VY.Zh/Y`(6^>Yr%G{|G:#Ao;\ ֒֊ɴH8᎔p7quu^>EZk'|^Ѝ{LiF^ nqx~:WǰӡMM++c,K87|Jp2k&,$6\q ƱjΨ?쥩ZLilwy17NѴ^eyīL7pK+&ю Z;Wu8깮"l`\Ke׶ج97sh̯N#mNDϓ F :@3]u*ΰ!MB Av˘`T_ ofF@qmȭV1 Abi_fFڴ{0qZXKfYu?2OַRް8LOu%̥e E/[KpRҵ>4Ih8*V * 6D 0˼(sS*n&]NfSܻpa FkKz@_>aG9%h9nٻZJϩ㵌JXOER;M}("Ѥ&,jb'\*]];zoRb4¢ jMqOo#fuc`Gyi `"kϘm(pì5+b:a[$pX+ս|Dɫ].inV|W %_ש1|FSLJb&7Ԁ\HAxLݧŞ@rm) #C\Q{ W[1Rd_∩iz::I!Ә޽n~u@:uN1E}ଁ"t2*oC*>qX1j7sS {0rr:Hߴ%}TM }bGw&!u 8>9'OЀLwC LU@aR_?K |~ӝ>\G1}Sn5[=ӹP*CPcف:k),p RkLzW ap 7R5jxzjG諯cfOz ?&!1AQaq0@ ?̕+fNP&j*K^>儸M*E ZLiq0v?( ڕR*H< o|ɻ/iHWj^-d=وXV; n+a"~Fg ɾUV@m qz2?WK=pPE!Nkv[|G+YA$GȬ84VZ(y7A uDQ=^]9D LTWL6AIh6 wIoAiLVjU@TF`*ꞈSAx0`5(ӡA@a&GZtG20&@"#o=khMM4yMj8mC,k1 x~1`"DoECkɚjи>ĉJ DyY6n|S'T$K ~Q(E4|o3Q$ KDQMҞVm dXVv$ӆNWX i .**DY4'` qmR2-#l0/PR*#+İ$4ڲ<"l 1(von/%w |~ !*yNyu$Oq-]1 |1TŢ;q EZ RLLN?I Lc^#eSB]QIHP6E'Qw7[!:@&KA-~QFtB7P 1 `I#^AMvf+X0(Pը:|24P[qӠQCDASca@Psk%' M GMC2ۃB4FQnc9*.ҍ5%J6+Mfnʐ ۞(.@tHA@& 0vۀ #Оw*A4;sCz'r1A*W{.DJ41[m 0+T  j#t1Ca  Y q„r:C".n$AP`!fݑV`{hŹ HPFxMq5z\a%{T=ؙ}ЪsN 1=dl.&t2L4U> J-؂ ~L`Pf = }>\.6";`'N&oM.k[ײʻ ,cP4_rwM%ntP˛ʅ*({;  :@Dԛ@>rES E\Mx+䦨!9w,W(əYTHOy5Pѫ'iIDD݀iXw`@\RVHǟНщz9 06fӿƻQh"Vi0h^]Y(Tn%{Ղn^"eOT[HtmԐ&6S\{& cn,i9z9WlܓRV\F_ x:;M&'TV\@xtY-R.0!@톱Thfv^.jD"~ PAEp_hLBYAJ"E7,*> ~s6?DBZ8ŵJIẀ a[(*)Kktx~[\쯉8Gfoʟ;ToU:, ,՘yitQn]'s 6_:CTFXĊąISfXѫ@l |=?+!'=׃_T%` v#3T^p1"@4 a d?~-M4>O5I6a<<_?$ ' PK ۈTres/PK ۈTi18n/PK ۈT̏,, i18n/zh.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/de.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/es.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/fr.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/id.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/ja.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,,i18n/ja-jph.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/ko.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/pl.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/uk.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,,i18n/zh-hant.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/nl.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/it.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/hr.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/ru.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/pt.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/fi.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/tr.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/tk.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈT̏,, i18n/en.json{ "vdr_grove_moteur": "vdr grove moteur", "extensionName": "vdr grove moteur", "extensionDescription": "", "BLOCK_1654872700954_PORT_0": "Port1", "BLOCK_1654872700954_PORT_1": "Port2", "BLOCK_1654872700954": "Mini I2C motor sur [port] vitesse [speed] ", "BLOCK_1654872701201_PORT_0": "port1", "BLOCK_1654872701201_PORT_1": "port2", "BLOCK_1654872701201_FREIN_0": "Arret", "BLOCK_1654872701201_FREIN_1": "Freiner", "BLOCK_1654872701201": "Mini I2C motor sur [port] [frein] ", "cate_ee80b27a": "Mini I2C motor", "BLOCK_1654880700150_PORT_0": "port1", "BLOCK_1654880700150_PORT_1": "port2", "BLOCK_1654880700150": "I2C motor driver [port] vitesse [vitesse] %", "BLOCK_1654880700383": "I2C motor driver stop [port] ", "cate_f5fb6cd1": "I2C motor" }PK ۈTH^nnindex.jsPK ۈTa^S4S4handlerProxy.jsPK ۈTLsrc/PK ۈT?ud=+W+W 6Lsrc/index.jsPK ۈT"v&&src/snippets.jsPK ۈTI~ޣsrc/generators.jsPK ۈT#*ddsrc/arduinosources.jsPK ۈTEsrc/facepanels.jsPK ۈT_[[ src/exthandler.jsPK ۈT`JGCCsrc/handlerProxy.jsPK ۈT Xsrc/cates/PK ۈTXsrc/cates/cate_ee80b27a/PK ۈTtQQ Ysrc/cates/cate_ee80b27a/index.jsPK ۈT]src/cates/cate_f5fb6cd1/PK ۈT}KK ]src/cates/cate_f5fb6cd1/index.jsPK ۈT+<&\`src/cates/index.jsPK ۈT}ff!masrc/cates/cate_ee80b27a/blocks.jsPK ۈTƂy!isrc/cates/cate_f5fb6cd1/blocks.jsPK ۈT ipsrc/langs/PK ۈTƟi<<psrc/langs/zh.jsPK ۈTƟi<<ssrc/langs/de.jsPK ۈTƟi<<cwsrc/langs/es.jsPK ۈTƟi<<zsrc/langs/fr.jsPK ۈTƟi<<5~src/langs/id.jsPK ۈTƟi<<src/langs/ja.jsPK ۈTƟi<<src/langs/ja-jph.jsPK ۈTƟi<<tsrc/langs/ko.jsPK ۈTƟi<<݋src/langs/pl.jsPK ۈTƟi<<Fsrc/langs/uk.jsPK ۈTƟi<<src/langs/zh-hant.jsPK ۈTƟi<<src/langs/nl.jsPK ۈTƟi<<src/langs/it.jsPK ۈTƟi<<src/langs/hr.jsPK ۈTƟi<<Xsrc/langs/ru.jsPK ۈTƟi<<src/langs/pt.jsPK ۈTƟi<<*src/langs/fi.jsPK ۈTƟi<<src/langs/tr.jsPK ۈTƟi<<src/langs/tk.jsPK ۈTƟi<<esrc/langs/en.jsPK ۈTiiδsrc/langs/index.jsPK ۈTM3ss gmanifest.jsonPK ۈT data.bak/PK ۈTOϬ`r`r,data.bak/ext.jsonPK ۈT"1data.bak/categroy.jsonPK ۈTy*  x4data.bak/block.jsonPK ۈT)L Ndata.bak/translate.jsonPK ۈT)L Ndata.bak/facepanel.jsonPK ۈT"Oimgs/PK ۈT<9)EOimgs/df6d9f30cdf14ac38c24c642088ebd28.jpgPK ۈTHres/PK ۈTji18n/PK ۈT̏,, i18n/zh.jsonPK ۈT̏,, i18n/de.jsonPK ۈT̏,, 9i18n/es.jsonPK ۈT̏,, i18n/fr.jsonPK ۈT̏,, i18n/id.jsonPK ۈT̏,, ;i18n/ja.jsonPK ۈT̏,,i18n/ja-jph.jsonPK ۈT̏,, i18n/ko.jsonPK ۈT̏,, Ai18n/pl.jsonPK ۈT̏,, i18n/uk.jsonPK ۈT̏,,i18n/zh-hant.jsonPK ۈT̏,, Hi18n/nl.jsonPK ۈT̏,, i18n/it.jsonPK ۈT̏,, i18n/hr.jsonPK ۈT̏,, J i18n/ru.jsonPK ۈT̏,, i18n/pt.jsonPK ۈT̏,, i18n/fi.jsonPK ۈT̏,, Li18n/tr.jsonPK ۈT̏,, i18n/tk.jsonPK ۈT̏,, i18n/en.jsonPKGG N