Working through bugs in mitchell code

This commit is contained in:
Matt McWilliams 2026-02-13 16:53:31 -05:00
parent 814187530c
commit cd9aa91d52
4 changed files with 185 additions and 27 deletions

30
app/package-lock.json generated
View File

@ -6,7 +6,7 @@
"packages": {
"": {
"name": "mcopy-app",
"version": "1.8.150",
"version": "1.8.164",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@ -81,7 +81,10 @@
"version": "1.0.0",
"license": "ISC"
},
"lib/capper": {},
"lib/capper": {
"version": "1.0.0",
"license": "ISC"
},
"lib/capture": {
"version": "1.0.0",
"license": "ISC"
@ -143,7 +146,10 @@
"version": "1.0.0",
"license": "ISC"
},
"lib/processing": {},
"lib/processing": {
"version": "1.0.0",
"license": "ISC"
},
"lib/proj": {
"version": "1.0.0",
"license": "ISC"
@ -400,6 +406,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz",
"integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/core": "^0.16.13"
@ -436,6 +443,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz",
"integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -448,6 +456,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz",
"integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -472,6 +481,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz",
"integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13",
@ -515,6 +525,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz",
"integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -638,6 +649,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz",
"integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -650,6 +662,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz",
"integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -665,6 +678,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz",
"integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -3119,6 +3133,7 @@
"resolved": "https://registry.npmjs.org/electron/-/electron-19.1.9.tgz",
"integrity": "sha512-XT5LkTzIHB+ZtD3dTmNnKjVBWrDWReCKt9G1uAFLz6uJMEVcIUiYO+fph5pLXETiBw/QZBx8egduMEfIccLx+g==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"@electron/get": "^1.14.1",
"@types/node": "^16.11.26",
@ -11605,6 +11620,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz",
"integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/core": "^0.16.13"
@ -11635,6 +11651,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz",
"integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -11644,6 +11661,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz",
"integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -11662,6 +11680,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz",
"integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13",
@ -11690,6 +11709,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz",
"integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -11781,6 +11801,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz",
"integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -11790,6 +11811,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz",
"integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -11799,6 +11821,7 @@
"version": "0.16.13",
"resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz",
"integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==",
"peer": true,
"requires": {
"@babel/runtime": "^7.7.2",
"@jimp/utils": "^0.16.13"
@ -13692,6 +13715,7 @@
"version": "19.1.9",
"resolved": "https://registry.npmjs.org/electron/-/electron-19.1.9.tgz",
"integrity": "sha512-XT5LkTzIHB+ZtD3dTmNnKjVBWrDWReCKt9G1uAFLz6uJMEVcIUiYO+fph5pLXETiBw/QZBx8egduMEfIccLx+g==",
"peer": true,
"requires": {
"@electron/get": "^1.14.1",
"@types/node": "^16.11.26",

View File

@ -1,7 +1,7 @@
#include "EndstopCameraShield.h"
#include "McopySerial.h"
const bool DEBUG = false;
const bool DEBUG = true;
//const uint8_t enableButtonPin = 9; //enable feature
const uint8_t directionSwitchPin = 10;
@ -38,6 +38,8 @@ void setup () {
mc.begin(mc.CAMERA_IDENTIFIER);
mc.debug(DEBUG);
cam.setup();
delay(5000);
if (cam.isOpened()) {
mc.log("Camera is OPENED");
@ -47,8 +49,10 @@ void setup () {
mc.log("Camera is in UNKNOWN state");
}
delay(5000);
if (cam.isOpened()) {
cam.toClose();
//cam.toClose();
}
}
@ -121,14 +125,19 @@ void camera () {
half = exposureAvg / 2; //assume a 180 shutter
pause = timedExposureTarget - half;
if (pause < exposureAvg) {
cam.frame();
//cam.frame();
cam.toOpen();
delay(1);
cam.toClose();
} else {
cam.toOpen();
delay(pause);
cam.toClose();
}
} else{
cam.frame();
cam.toOpen();
delay(1);
cam.toClose();
}
ms = millis() - start;

View File

@ -2,6 +2,11 @@
#include "McopySerial.h"
const bool DEBUG = false;
//const uint8_t enableButtonPin = 9; //enable feature
//const uint8_t directionSwitchPin = 10;
//const uint8_t cameraButtonPin = 11;
//const uint8_t openCloseSwitchPin = 12;
const uint8_t LEDPin = 13;
const uint32_t usPulse = 300;
@ -9,9 +14,13 @@ const uint8_t microsteps = 2;
volatile char cmdChar = 'z';
volatile long now;
volatile long exposureAvg = 250; //pre-fill
volatile long exposureAvg = 500;
volatile String exposureString;
volatile long exposureTarget = -1;
const long timedExposureCutoff = 500;
volatile String timedExposureString;
volatile long timedExposureTarget = -1;
volatile long timedExposureAvg = -1;
volatile bool direction = true;
@ -19,21 +28,24 @@ EndstopCameraShield cam(usPulse, microsteps);
McopySerial mc;
void setup () {
//pinMode(directionSwitchPin, INPUT_PULLUP);
//pinMode(openCloseSwitchPin, INPUT_PULLUP);
//pinMode(cameraButtonPin, INPUT_PULLUP);
mc.begin(mc.CAMERA_IDENTIFIER);
mc.debug(DEBUG);
cam.setup();
if (cam.isOpened()) {
mc.log("Camera is OPENED, closing...");
cam.toClose();
mc.log("Camera is CLOSED");
mc.log("Camera is OPENED");
} else if (cam.isClosed()) {
mc.log("Camera is CLOSED");
} else {
mc.log("Camera is in UNKNOWN state, closing...");
cam.toClose();
mc.log("Camera is CLOSED");
mc.log("Camera is in UNKNOWN state");
}
if (cam.isOpened()) {
cam.toClose();
}
//cam.test();
}
void loop () {
@ -41,6 +53,7 @@ void loop () {
cmdChar = mc.loop();
cmd(cmdChar);
cam.loop();
//buttons();
}
void cmd (char val) {
@ -62,14 +75,19 @@ void cmd (char val) {
}
void exposure () {
exposureString = mc.getString();
timedExposureString = mc.getString();
parseExposureString();
exposureAvg = exposureTarget;
exposureAvg = timedExposureTarget;
mc.confirm(mc.CAMERA_EXPOSURE);
}
void parseExposureString () {
exposureTarget = exposureString.toInt();
timedExposureTarget = timedExposureString.toInt();
timedExposureAvg = timedExposureTarget + 0;
if (timedExposureTarget < timedExposureCutoff) {
timedExposureTarget = -1;
timedExposureAvg = -1;
}
}
void camera_direction (boolean state) {
@ -90,9 +108,14 @@ void camera () {
long pause;
long ms;
if (exposureTarget > -1) {
if (cam.isOpened()) {
cam.toClose();
start = millis();
}
if (timedExposureTarget > -1) {
half = exposureAvg / 2; //assume a 180 shutter
pause = exposureTarget - half;
pause = timedExposureTarget - half;
if (pause < exposureAvg) {
cam.frame();
} else {
@ -103,10 +126,15 @@ void camera () {
} else{
cam.frame();
}
ms = millis() - start;
if (exposureTarget < 0) {
if (timedExposureTarget > -1) {
updateTimedAvg(ms, half);
} else {
updateAvg(ms);
}
mc.log("camera()");
mc.log(String(ms) + "ms");
mc.confirm(mc.CAMERA);
@ -135,8 +163,8 @@ void camera_close () {
void state () {
String stateString = String(mc.STATE);
stateString += String(mc.CAMERA_EXPOSURE);
if (exposureTarget > -1) {
stateString += String(exposureTarget);
if (timedExposureTarget > -1) {
stateString += String(timedExposureAvg);
} else {
stateString += String(exposureAvg);
}
@ -146,4 +174,75 @@ void state () {
void updateAvg (long value) {
exposureAvg = round((exposureAvg + value) / 2);
}
}
void updateTimedAvg (long value, long half) {
timedExposureAvg = round((timedExposureAvg + value - half) / 2);
}
/**
* Button/Switch logic
**/
/*
void buttons () {
int cameraButtonState = digitalRead(cameraButtonPin);
int directionSwitchState = digitalRead(directionSwitchPin);
int openCloseSwitchState = digitalRead(openCloseSwitchPin);
if (directionSwitchState == LOW && directionSwitch == false) {
directionSwitch = true;
} else if (directionSwitchState == HIGH && directionSwitch == true) {
directionSwitch = false;
}
if (openCloseSwitchState == LOW && openCloseSwitch == false) {
openCloseSwitch = true;
switch_open_close();
} else if (openCloseSwitchState == HIGH && openCloseSwitch == true) {
openCloseSwitch = false;
switch_open_close();
}
if (cameraButtonState == LOW) {
button_camera();
}
}
void button_camera () {
long start = millis();
long ms;
if (direction != directionSwitch) {
cam.setDirection(directionSwitch);
}
if (cam.isOpened()) {
cam.toClose();
start = millis();
}
cam.frame();
ms = millis() - start;
updateAvg(ms);
mc.log("button_camera()");
if (direction != directionSwitch) {
cam.setDirection(direction);
}
}
void switch_open_close () {
if (direction != directionSwitch) {
cam.setDirection(directionSwitch);
}
if (openCloseSwitch && !cam.isClosed()) {
cam.toClose();
} else if (!openCloseSwitch && !cam.isOpened()) {
cam.toOpen();
}
if (direction != directionSwitch) {
cam.setDirection(direction);
}
}
*/

30
package-lock.json generated
View File

@ -58,7 +58,10 @@
"version": "1.0.0",
"license": "ISC"
},
"app/lib/capper": {},
"app/lib/capper": {
"version": "1.0.0",
"license": "ISC"
},
"app/lib/cfg": {},
"app/lib/cmd": {
"version": "1.0.0",
@ -117,7 +120,10 @@
"version": "1.0.0",
"license": "ISC"
},
"app/lib/processing": {},
"app/lib/processing": {
"version": "1.0.0",
"license": "ISC"
},
"app/lib/proj": {
"version": "1.0.0",
"license": "ISC"
@ -204,6 +210,7 @@
"resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.12.tgz",
"integrity": "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/core": "^0.22.12"
}
@ -240,6 +247,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz",
"integrity": "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/utils": "^0.22.12"
},
@ -252,6 +260,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz",
"integrity": "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/utils": "^0.22.12"
},
@ -276,6 +285,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.12.tgz",
"integrity": "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/utils": "^0.22.12",
"tinycolor2": "^1.6.0"
@ -319,6 +329,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz",
"integrity": "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/utils": "^0.22.12"
},
@ -442,6 +453,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz",
"integrity": "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/utils": "^0.22.12"
},
@ -454,6 +466,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz",
"integrity": "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/utils": "^0.22.12"
},
@ -469,6 +482,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz",
"integrity": "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw==",
"dev": true,
"peer": true,
"dependencies": {
"@jimp/utils": "^0.22.12"
},
@ -680,6 +694,7 @@
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
"dev": true,
"peer": true,
"dependencies": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
@ -1766,6 +1781,7 @@
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
"dev": true,
"peer": true,
"dependencies": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
@ -2774,6 +2790,7 @@
"resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.12.tgz",
"integrity": "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q==",
"dev": true,
"peer": true,
"requires": {
"@jimp/core": "^0.22.12"
}
@ -2804,6 +2821,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz",
"integrity": "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ==",
"dev": true,
"peer": true,
"requires": {
"@jimp/utils": "^0.22.12"
}
@ -2813,6 +2831,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz",
"integrity": "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw==",
"dev": true,
"peer": true,
"requires": {
"@jimp/utils": "^0.22.12"
}
@ -2831,6 +2850,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.12.tgz",
"integrity": "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA==",
"dev": true,
"peer": true,
"requires": {
"@jimp/utils": "^0.22.12",
"tinycolor2": "^1.6.0"
@ -2859,6 +2879,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz",
"integrity": "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw==",
"dev": true,
"peer": true,
"requires": {
"@jimp/utils": "^0.22.12"
}
@ -2950,6 +2971,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz",
"integrity": "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg==",
"dev": true,
"peer": true,
"requires": {
"@jimp/utils": "^0.22.12"
}
@ -2959,6 +2981,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz",
"integrity": "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA==",
"dev": true,
"peer": true,
"requires": {
"@jimp/utils": "^0.22.12"
}
@ -2968,6 +2991,7 @@
"resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz",
"integrity": "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw==",
"dev": true,
"peer": true,
"requires": {
"@jimp/utils": "^0.22.12"
}
@ -3152,6 +3176,7 @@
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
"dev": true,
"peer": true,
"requires": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
@ -4058,6 +4083,7 @@
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
"dev": true,
"peer": true,
"requires": {
"argparse": "^2.0.1",
"entities": "~2.1.0",