From eeef64caa2e206e4613b0f3618246f80faee0e49 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 1 Mar 2022 18:09:36 +0100 Subject: [PATCH 01/15] Add launch config to debug linter --- .vscode/launch.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..7c40fc2b1b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,19 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-node", + "request": "launch", + "name": "Debug Linter", + "skipFiles": [ + "/**" + ], + "program": "validate.js", + "args": ["-p", "../../content"], + "cwd": "${workspaceFolder}/scripts/validation/" + } + ] +} \ No newline at end of file From c4cb61042c3294cef6d98ba55c1b4d38adf8e622 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 1 Mar 2022 18:10:05 +0100 Subject: [PATCH 02/15] Allow to find unreferenced assets --- scripts/validation/domain/article.js | 62 ++++++++++++++++++------ scripts/validation/validations/images.js | 4 +- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/scripts/validation/domain/article.js b/scripts/validation/domain/article.js index 25fc734520..ac9ce601b1 100644 --- a/scripts/validation/domain/article.js +++ b/scripts/validation/domain/article.js @@ -17,6 +17,7 @@ export class Article { this._markdown = null; this._metaData = null; this._codeBlockData = null; + this._referencedAssetsPaths = null; } get path(){ @@ -175,36 +176,69 @@ export class Article { return data.length == 0 ? null : data; } + /** + * Returns a list of all asset file paths that are not referenced in an article + */ + get unreferencedAssetsPaths(){ + const referencedAssetNames = this.referencedAssetsPaths.map(assetPath => path.basename(assetPath)); + return this.assets.filter((filePath) => { return !referencedAssetNames.includes(path.basename(filePath)); }); + } + + /** + * Returns an array of all images and video files referenced + * in the article including its meta data. + */ get referencedAssetsPaths(){ + if(this._referencedAssetsPaths) return this._referencedAssetsPaths; const images = this.html.querySelectorAll("img"); const imagePaths = images.map(image => image.attributes.src); + + const pathRegex = new RegExp(`^(?!http).*(${this.assetsFolder})\/.*(?:\..{1,4})$`); + const filteredFilePaths = this.links.filter((link) => link.match(pathRegex)); + const videos = this.html.querySelectorAll("video source"); const videoPaths = videos.map(video => video.attributes.src); - return imagePaths.concat(videoPaths); + + const allPaths = imagePaths.concat(videoPaths).concat(filteredFilePaths); + let coverImagePath = this.metadata?.coverImage; + if(coverImagePath) allPaths.push(coverImagePath); + this._referencedAssetsPaths = allPaths; + return this._referencedAssetsPaths; } - get linkPaths(){ + /** + * Returns all hyperlinks in the document + */ + get links(){ let links = this.html.querySelectorAll("a"); return links.map(link => link.attributes.href); } + + get assetsFolder(){ + if(this._assetFolder) return this._assetFolder; + const validDirectories = ["assets", "images"]; + + if (existsSync(`${this.path}/${validDirectories[0]}/`)){ + this._assetFolder = validDirectories[0]; + return this._assetFolder; + } + if (existsSync(`${this.path}/${validDirectories[1]}/`)){ + console.log("😬 WARNING: Using deprecated 'images' directory to store assets. Location:", path); + this._assetFolder = validDirectories[1]; + return this._assetFolder; + } + console.log(`😬 WARNING: No standard assets directory (${validDirectories.join(" | ")}) found in: ${this.path}`); + return null; + } + /** * Returns the assets path if it's one of the standard ones 'assets' or 'images', null otherwise. */ get assetsPath(){ if(this._assetsPath) return this._assetsPath; - const validDirectories = ["assets", "images"]; - let path = `${this.path}/${validDirectories[0]}/`; - - if (!existsSync(path)) { - path = `${this.path}/${validDirectories[1]}/`; - if(!existsSync(path)){ - console.log(`😬 WARNING: No standard assets directory (${validDirectories.join(" | ")}) found in: ${this.path}`); - return null; - } - console.log("😬 WARNING: Using deprecated 'images' directory to store assets. Location:", path); - } - this._assetsPath = path; + if(!this.assetsFolder) return null; + this._assetsPath = `${this.path}/${this.assetsFolder}/`; return this._assetsPath; } diff --git a/scripts/validation/validations/images.js b/scripts/validation/validations/images.js index e9d605048a..12e290cd9e 100644 --- a/scripts/validation/validations/images.js +++ b/scripts/validation/validations/images.js @@ -50,13 +50,13 @@ function validateReferencedImages(article){ let errorsOccurred = []; let imageNames = article.referencedAssetsPaths.map(imagePath => basename(imagePath)); let assetNames = article.assets.map(asset => basename(asset)); - let linkNames = article.linkPaths.map(link => basename(link)); + let linkNames = article.links.map(link => basename(link)); let coverImagePath = article.metadata?.coverImage; let coverImageName = coverImagePath ? basename(coverImagePath) : null; assetNames.forEach(asset => { if(coverImageName == asset) return; - if(!imageNames.includes(asset) && !linkNames.includes(asset)){ + if(!imageNames.includes(asset) && !linkNames.includes(asset)){ const errorMessage = `Asset '${asset}' is not used.`; errorsOccurred.push(new ValidationIssue(errorMessage, article.contentFilePath)); } From 9eee916139f7420b0c4380a1ba5c73fcc10d3cec Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 1 Mar 2022 18:10:21 +0100 Subject: [PATCH 03/15] Add quick fix for deleting unreferenced files --- scripts/validation/fix-issues.js | 6 +++++- scripts/validation/fixes/images.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 scripts/validation/fixes/images.js diff --git a/scripts/validation/fix-issues.js b/scripts/validation/fix-issues.js index 460d30b36a..12007260a2 100644 --- a/scripts/validation/fix-issues.js +++ b/scripts/validation/fix-issues.js @@ -1,7 +1,7 @@ import { fixMissingTitleCase } from './fixes/headings.js' import { ConfigManager } from './logic/config-manager.js'; import { ArticleManager } from './logic/article-manager.js'; -import commandLineArgs from 'command-line-args'; +import { fixUnusedAssets } from './fixes/images.js'; const configManager = new ConfigManager(); configManager.addConfigFile("generic", "./config/config-generic.yml"); @@ -22,4 +22,8 @@ for(let article of allArticles){ if(fixMissingTitleCase(article)){ console.log(`✅ Fixed missing Title Case headings in '${article.contentFilePath}'.`); } + + if(fixUnusedAssets(article)){ + console.log(`✅ Fixed unused assets in '${article.contentFilePath}'.`); + } } diff --git a/scripts/validation/fixes/images.js b/scripts/validation/fixes/images.js new file mode 100644 index 0000000000..0f9e9367cd --- /dev/null +++ b/scripts/validation/fixes/images.js @@ -0,0 +1,19 @@ +import fs from 'fs'; + +function fixUnusedAssets(article){ + const assets = article.unreferencedAssetsPaths; + if(assets.length == 0) return false; + + for(let filePath of assets){ + try { + console.log(`🔧 Deleting unused asset ${filePath}`); + fs.unlinkSync(filePath) + } catch (error) { + console.error(`❌ Couldn't delete unused asset ${filePath}`); + return false; + } + } + return true; +} + +export { fixUnusedAssets }; \ No newline at end of file From 53c57079da15a1a76b18364b4b6742c030d5428d Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 1 Mar 2022 18:12:55 +0100 Subject: [PATCH 04/15] Fix incorrectly used variable --- scripts/validation/domain/article.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/validation/domain/article.js b/scripts/validation/domain/article.js index ac9ce601b1..b95100a275 100644 --- a/scripts/validation/domain/article.js +++ b/scripts/validation/domain/article.js @@ -224,7 +224,7 @@ export class Article { return this._assetFolder; } if (existsSync(`${this.path}/${validDirectories[1]}/`)){ - console.log("😬 WARNING: Using deprecated 'images' directory to store assets. Location:", path); + console.log("😬 WARNING: Using deprecated 'images' directory to store assets. Location:", this.path); this._assetFolder = validDirectories[1]; return this._assetFolder; } From 99e8c3711b5348ef1f1cbfe1ac7ad7e47d9a38f1 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 1 Mar 2022 18:17:09 +0100 Subject: [PATCH 05/15] Fix incorrectly referenced images --- .../portenta-breakout/tutorials/getting-started/content.md | 1 - .../05.nicla/boards/nicla-sense-me/tutorials/cli-tool/content.md | 1 - 2 files changed, 2 deletions(-) diff --git a/content/hardware/04.pro/carriers/portenta-breakout/tutorials/getting-started/content.md b/content/hardware/04.pro/carriers/portenta-breakout/tutorials/getting-started/content.md index edf32b675d..d28d79c888 100644 --- a/content/hardware/04.pro/carriers/portenta-breakout/tutorials/getting-started/content.md +++ b/content/hardware/04.pro/carriers/portenta-breakout/tutorials/getting-started/content.md @@ -1,6 +1,5 @@ --- title: Getting Started With the Arduino Portenta Breakout -coverImage: assets/ec_ard_gs_cover.svg difficulty: easy tags: [Getting Started, Setup, PWM, Analog, I2C] description: This tutorial will give you an overview of the core features of the breakout, setup the development environment and introduce the APIs required to program the board. diff --git a/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/cli-tool/content.md b/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/cli-tool/content.md index 1c11e6e783..d1206f3e9a 100644 --- a/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/cli-tool/content.md +++ b/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/cli-tool/content.md @@ -1,6 +1,5 @@ --- title: Sensors Readings on a Local Webserver -coverImage: assets/por_ard_usbh_cover.svg difficulty: intermediate tags: [Bluetooth®, WEBAPP, CLI, Installation] description: This tutorial teaches you how to set up the Nicla Sense ME and your computer to use the already built tool to get data and configure the board using a CLI app. From b895c6d6bdb1b2daed759dd26626588c22d62627 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 1 Mar 2022 18:24:01 +0100 Subject: [PATCH 06/15] Rename module file --- scripts/validation/fix-issues.js | 2 +- scripts/validation/fixes/{images.js => assets.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename scripts/validation/fixes/{images.js => assets.js} (100%) diff --git a/scripts/validation/fix-issues.js b/scripts/validation/fix-issues.js index 12007260a2..87dec26797 100644 --- a/scripts/validation/fix-issues.js +++ b/scripts/validation/fix-issues.js @@ -1,7 +1,7 @@ import { fixMissingTitleCase } from './fixes/headings.js' import { ConfigManager } from './logic/config-manager.js'; import { ArticleManager } from './logic/article-manager.js'; -import { fixUnusedAssets } from './fixes/images.js'; +import { fixUnusedAssets } from './fixes/assets.js'; const configManager = new ConfigManager(); configManager.addConfigFile("generic", "./config/config-generic.yml"); diff --git a/scripts/validation/fixes/images.js b/scripts/validation/fixes/assets.js similarity index 100% rename from scripts/validation/fixes/images.js rename to scripts/validation/fixes/assets.js From 6f0d3865bb41a08c66b2dd155d3fc65444c1e100 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 2 Mar 2022 11:38:24 +0100 Subject: [PATCH 07/15] Rename asset related files --- scripts/validation/validate.js | 4 ++-- scripts/validation/validations/{images.js => assets.js} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename scripts/validation/validations/{images.js => assets.js} (98%) diff --git a/scripts/validation/validate.js b/scripts/validation/validate.js index 0c8abda670..a37e77d420 100644 --- a/scripts/validation/validate.js +++ b/scripts/validation/validate.js @@ -4,7 +4,7 @@ import { ArticleManager } from './logic/article-manager.js'; import { validateDuplicatedOpeningHeading, validateHeadingsNesting, validateMaxLength, validateNumberedHeadings, validateOpeningHeadingLevel, validateSpacing, validateTitleCase } from './validations/headings.js' import { validateMetaData } from './validations/metadata.js'; import { validateRules } from './validations/rules.js'; -import { validateImageDescriptions, validateImagePaths, validateReferencedImages, validateSVGFiles } from './validations/images.js'; +import { validateImageDescriptions, validateImagePaths, validateReferencedAssets, validateSVGFiles } from './validations/assets.js'; import { validateSyntaxSpecifiers } from './validations/code-blocks.js'; import { validateNestedLists } from './validations/lists.js'; import { validateBrokenLinks } from './validations/links.js'; @@ -57,7 +57,7 @@ if(configManager.options.checkBrokenLinks){ }; // Verify that all files in the assets folder are referenced -validator.addValidation(allArticles, validateReferencedImages); +validator.addValidation(allArticles, validateReferencedAssets); // Verify that the images exist and don't have an absolute path validator.addValidation(allArticles, validateImagePaths); diff --git a/scripts/validation/validations/images.js b/scripts/validation/validations/assets.js similarity index 98% rename from scripts/validation/validations/images.js rename to scripts/validation/validations/assets.js index 12e290cd9e..25f50739dc 100644 --- a/scripts/validation/validations/images.js +++ b/scripts/validation/validations/assets.js @@ -46,7 +46,7 @@ function validateImagePaths(article){ return errorsOccurred; } -function validateReferencedImages(article){ +function validateReferencedAssets(article){ let errorsOccurred = []; let imageNames = article.referencedAssetsPaths.map(imagePath => basename(imagePath)); let assetNames = article.assets.map(asset => basename(asset)); @@ -83,4 +83,4 @@ function validateSVGFiles(article){ return errorsOccurred; } -export { validateImageDescriptions, validateImagePaths, validateReferencedImages, validateSVGFiles } \ No newline at end of file +export { validateImageDescriptions, validateImagePaths, validateReferencedAssets, validateSVGFiles } \ No newline at end of file From e1fbd4fb877a432fab06a6cb55f78e1ea11b872c Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 2 Mar 2022 12:18:59 +0100 Subject: [PATCH 08/15] Add fuzzy determination of assets folder --- scripts/validation/domain/article.js | 33 +++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/scripts/validation/domain/article.js b/scripts/validation/domain/article.js index b95100a275..d1ecb7cb87 100644 --- a/scripts/validation/domain/article.js +++ b/scripts/validation/domain/article.js @@ -190,8 +190,7 @@ export class Article { */ get referencedAssetsPaths(){ if(this._referencedAssetsPaths) return this._referencedAssetsPaths; - const images = this.html.querySelectorAll("img"); - const imagePaths = images.map(image => image.attributes.src); + const imagePaths = this.referencedImages; const pathRegex = new RegExp(`^(?!http).*(${this.assetsFolder})\/.*(?:\..{1,4})$`); const filteredFilePaths = this.links.filter((link) => link.match(pathRegex)); @@ -210,11 +209,14 @@ export class Article { * Returns all hyperlinks in the document */ get links(){ - let links = this.html.querySelectorAll("a"); - return links.map(link => link.attributes.href); + let linkElements = this.html.querySelectorAll("a"); + return linkElements.map(element => element.attributes.href); } + /** + * Determines the assets folder used by an article + */ get assetsFolder(){ if(this._assetFolder) return this._assetFolder; const validDirectories = ["assets", "images"]; @@ -227,11 +229,30 @@ export class Article { console.log("😬 WARNING: Using deprecated 'images' directory to store assets. Location:", this.path); this._assetFolder = validDirectories[1]; return this._assetFolder; - } - console.log(`😬 WARNING: No standard assets directory (${validDirectories.join(" | ")}) found in: ${this.path}`); + } + + console.log(`😬 WARNING: No standard assets directory (${validDirectories.join(" | ")}) found in: ${this.path}`); + + // Try to figure out assets path from the referenced images + const usedAssetPaths = this.referencedImages.map((assetPath) => { + const directory = path.dirname(assetPath) + if(!directory) return null; + return directory.split("/")[0]; + }) + + const uniqueAssetPaths = usedAssetPaths.filter((element, index) => { return usedAssetPaths.indexOf(element) == index; }); + if(uniqueAssetPaths.length == 1) return uniqueAssetPaths[0]; return null; } + /** + * Returns a list of referenced images in the article + */ + get referencedImages(){ + const images = this.html.querySelectorAll("img"); + return images.map(image => image.attributes.src); + } + /** * Returns the assets path if it's one of the standard ones 'assets' or 'images', null otherwise. */ From 3f3369fd1b7af9eb172e7d675658f4d3f3f1eb05 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 2 Mar 2022 14:45:54 +0100 Subject: [PATCH 09/15] Add quick fix for italic formatting --- scripts/validation/domain/article.js | 31 +++++++++++++++++++++++++++- scripts/validation/fix-issues.js | 8 ++++++- scripts/validation/fixes/styling.js | 24 +++++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 scripts/validation/fixes/styling.js diff --git a/scripts/validation/domain/article.js b/scripts/validation/domain/article.js index d1ecb7cb87..279dc7d709 100644 --- a/scripts/validation/domain/article.js +++ b/scripts/validation/domain/article.js @@ -18,6 +18,7 @@ export class Article { this._metaData = null; this._codeBlockData = null; this._referencedAssetsPaths = null; + this._emphasizedTextData = null; } get path(){ @@ -52,8 +53,8 @@ export class Article { } set rawData(data){ - this._rawData = data; this.clearData(); + this._rawData = data; } get rawData(){ @@ -147,6 +148,34 @@ export class Article { return this._codeBlockData; } + get emphasizedTextData(){ + if(this._emphasizedTextData) return this._emphasizedTextData; + + let data = new Array(); + const italicRegex1 = new RegExp(/(?<=\s)\*(?[^* ].*?)\*(?!\*)/, "g"); + const italicRegex2 = new RegExp(/(?<=\s)_(?[^_].*?)_(?!_)/, "g"); + const boldRegex1 = new RegExp(/(?<=\s)\*\*(?[^* ].*?)\*\*(?!\*)/, "g"); + const boldRegex2 = new RegExp(/(?<=\s)__(?[^_].*?)__(?!_)/, "g"); + const regexes = [ + {regex : italicRegex1, type : "italic" }, + {regex : italicRegex2, type : "italic" }, + {regex : boldRegex1, type : "bold" }, + {regex : boldRegex2, type : "bold" } + ]; + + for(let regexData of regexes){ + const matches = [...this.rawData.matchAll(regexData.regex)]; + + for(let match of matches){ + if(this.isInsideCodeBlock(match.index)) continue; + data.push({text : match.groups.text, type: regexData.type, beginIndex: match.index, endIndex: match.index + match[0].length }) + } + } + + this._emphasizedTextData = data; + return this._emphasizedTextData; + } + /** * Returns an array containing headings data objects in the format: * { content: 'Conclusion', level: 2, location: 89 } diff --git a/scripts/validation/fix-issues.js b/scripts/validation/fix-issues.js index 87dec26797..25225e926f 100644 --- a/scripts/validation/fix-issues.js +++ b/scripts/validation/fix-issues.js @@ -2,6 +2,7 @@ import { fixMissingTitleCase } from './fixes/headings.js' import { ConfigManager } from './logic/config-manager.js'; import { ArticleManager } from './logic/article-manager.js'; import { fixUnusedAssets } from './fixes/assets.js'; +import { replaceItalicEmphasisWithBoldEmphasis } from './fixes/styling.js'; const configManager = new ConfigManager(); configManager.addConfigFile("generic", "./config/config-generic.yml"); @@ -26,4 +27,9 @@ for(let article of allArticles){ if(fixUnusedAssets(article)){ console.log(`✅ Fixed unused assets in '${article.contentFilePath}'.`); } -} + + if(replaceItalicEmphasisWithBoldEmphasis(article)){ + console.log(`✅ Fixed italic styling in '${article.contentFilePath}'.`); + } + +} \ No newline at end of file diff --git a/scripts/validation/fixes/styling.js b/scripts/validation/fixes/styling.js new file mode 100644 index 0000000000..f8a562915c --- /dev/null +++ b/scripts/validation/fixes/styling.js @@ -0,0 +1,24 @@ +function replaceRange(indexFrom, indexTo, haystack, replacement) { + let start = haystack.substring(0, indexFrom); + let end = haystack.substring(indexTo); + return start + replacement + end; +}; + +function replaceItalicEmphasisWithBoldEmphasis(article){ + let contentBackup = article.rawData; + + while(article.emphasizedTextData.some((element) => element.type == "italic")){ + for(let data of article.emphasizedTextData){ + if(data.type == "italic"){ + let newData = replaceRange(data.beginIndex, data.endIndex, article.rawData, `**${data.text}**`) + console.log(`🔧 Replacing italic styling of '${data.text}' in ${article.contentFilePath}`); + article.rawData = newData; + break; + } + } + } + const hasChanged = article.rawData != contentBackup; + return hasChanged && article.writeContentToFile(); +} + +export { replaceItalicEmphasisWithBoldEmphasis } \ No newline at end of file From 2b3bb62b80b3fa0e684a5fdddbe40c9a33ff2069 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 2 Mar 2022 14:54:43 +0100 Subject: [PATCH 10/15] Add launch config for quickfix --- .vscode/launch.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7c40fc2b1b..d5b6e52e71 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,6 +14,17 @@ "program": "validate.js", "args": ["-p", "../../content"], "cwd": "${workspaceFolder}/scripts/validation/" + }, + { + "type": "pwa-node", + "request": "launch", + "name": "Debug Quickfix", + "skipFiles": [ + "/**" + ], + "program": "fix-issues.js", + "args": ["-p", "../../content"], + "cwd": "${workspaceFolder}/scripts/validation/" } ] } \ No newline at end of file From 7a0c00dca838ded82b2667390dbb9edbc32b0f96 Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Thu, 3 Mar 2022 15:27:27 +0100 Subject: [PATCH 11/15] Detect italic formatting more reliably --- scripts/validation/domain/article.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/validation/domain/article.js b/scripts/validation/domain/article.js index 279dc7d709..32331591d9 100644 --- a/scripts/validation/domain/article.js +++ b/scripts/validation/domain/article.js @@ -152,10 +152,10 @@ export class Article { if(this._emphasizedTextData) return this._emphasizedTextData; let data = new Array(); - const italicRegex1 = new RegExp(/(?<=\s)\*(?[^* ].*?)\*(?!\*)/, "g"); - const italicRegex2 = new RegExp(/(?<=\s)_(?[^_].*?)_(?!_)/, "g"); - const boldRegex1 = new RegExp(/(?<=\s)\*\*(?[^* ].*?)\*\*(?!\*)/, "g"); - const boldRegex2 = new RegExp(/(?<=\s)__(?[^_].*?)__(?!_)/, "g"); + const italicRegex1 = new RegExp(/(?[^* ].*?)\*(?!\*)/, "g"); + const italicRegex2 = new RegExp(/(?[^_].*?)_(?!_)/, "g"); + const boldRegex1 = new RegExp(/(?[^* ].*?)\*\*(?!\*)/, "g"); + const boldRegex2 = new RegExp(/(?[^_].*?)__(?!_)/, "g"); const regexes = [ {regex : italicRegex1, type : "italic" }, {regex : italicRegex2, type : "italic" }, From 2dc0587c7fb7f4c16d7c7eee474e520a1da7f3bb Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Thu, 3 Mar 2022 16:03:17 +0100 Subject: [PATCH 12/15] Further improved regex reliability --- scripts/validation/domain/article.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/validation/domain/article.js b/scripts/validation/domain/article.js index 32331591d9..50bab954e0 100644 --- a/scripts/validation/domain/article.js +++ b/scripts/validation/domain/article.js @@ -152,10 +152,10 @@ export class Article { if(this._emphasizedTextData) return this._emphasizedTextData; let data = new Array(); - const italicRegex1 = new RegExp(/(?[^* ].*?)\*(?!\*)/, "g"); - const italicRegex2 = new RegExp(/(?[^_].*?)_(?!_)/, "g"); - const boldRegex1 = new RegExp(/(?[^* ].*?)\*\*(?!\*)/, "g"); - const boldRegex2 = new RegExp(/(?[^_].*?)__(?!_)/, "g"); + const italicRegex1 = new RegExp(/(?<=\W)(?[^\*]+?)\*(?!\*)/, "g"); + const italicRegex2 = new RegExp(/(?<=\W)(?[^_]+?)_(?!_)/, "g"); + const boldRegex1 = new RegExp(/(?<=\W)(?[^\*\*]+?)\*\*(?!\*)/, "g"); + const boldRegex2 = new RegExp(/(?<=\W)(?[^__]+?)__(?!_)/, "g"); const regexes = [ {regex : italicRegex1, type : "italic" }, {regex : italicRegex2, type : "italic" }, From 4323371ddf63bfe5806310b6059fb83ea641980c Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 15 Mar 2022 18:26:46 +0100 Subject: [PATCH 13/15] Add better regex for emphasis detection --- scripts/validation/domain/article.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/validation/domain/article.js b/scripts/validation/domain/article.js index 50bab954e0..1b79b9e3e7 100644 --- a/scripts/validation/domain/article.js +++ b/scripts/validation/domain/article.js @@ -152,10 +152,11 @@ export class Article { if(this._emphasizedTextData) return this._emphasizedTextData; let data = new Array(); - const italicRegex1 = new RegExp(/(?<=\W)(?[^\*]+?)\*(?!\*)/, "g"); - const italicRegex2 = new RegExp(/(?<=\W)(?[^_]+?)_(?!_)/, "g"); - const boldRegex1 = new RegExp(/(?<=\W)(?[^\*\*]+?)\*\*(?!\*)/, "g"); - const boldRegex2 = new RegExp(/(?<=\W)(?[^__]+?)__(?!_)/, "g"); + const italicRegex1 = new RegExp(/\B\*(?[^\n\*]+?)\*(?!\*)\B/, "g"); + const italicRegex2 = new RegExp(/\b_(?[^\n_\*]+?)_(?!_)\b/, "g"); + const boldRegex1 = new RegExp(/\B\*\*(?[^\n]+?)\*\*(?!\*)\B/, "g"); + const boldRegex2 = new RegExp(/\b__(?[^\n_]+?)__(?!_)\b/, "g"); + const regexes = [ {regex : italicRegex1, type : "italic" }, {regex : italicRegex2, type : "italic" }, From 992ad9bd3ba195fb279daca310e8cdbcee435b3a Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 15 Mar 2022 18:31:16 +0100 Subject: [PATCH 14/15] Check if path is a folder --- scripts/lib/file-helper.cjs | 2 +- scripts/validation/validations/assets.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/lib/file-helper.cjs b/scripts/lib/file-helper.cjs index 0480e00462..8a8f2c0d96 100644 --- a/scripts/lib/file-helper.cjs +++ b/scripts/lib/file-helper.cjs @@ -160,4 +160,4 @@ function getColumnFromIndex(index, haystack){ return column; } -module.exports = { findAllFiles, findAllFolders, getFilesWithExtension, getSubdirectories, createDirectoryIfNecessary, getLineNumberFromIndex, getColumnFromIndex}; +module.exports = { isFile, isDirectory, findAllFiles, findAllFolders, getFilesWithExtension, getSubdirectories, createDirectoryIfNecessary, getLineNumberFromIndex, getColumnFromIndex}; diff --git a/scripts/validation/validations/assets.js b/scripts/validation/validations/assets.js index 25f50739dc..5b63c17ced 100644 --- a/scripts/validation/validations/assets.js +++ b/scripts/validation/validations/assets.js @@ -1,5 +1,5 @@ import { ValidationIssue } from '../domain/validation-issue.js'; -import { getLineNumberFromIndex, getColumnFromIndex} from '../../lib/file-helper.cjs'; +import { getLineNumberFromIndex, getColumnFromIndex, isFile} from '../../lib/file-helper.cjs'; import { readFileSync, existsSync } from 'fs'; import { basename } from 'path'; import _ from 'node-html-parser'; @@ -34,7 +34,7 @@ function validateImagePaths(article){ const lineNumber = getLineNumberFromIndex(index, content); const column = getColumnFromIndex(index, content); errorsOccurred.push(new ValidationIssue(errorMessage, article.contentFilePath, ValidationIssue.Type.ERROR, lineNumber, column)); - } else if(!imagePath.startsWith("http") && !existsSync(`${article.path}/${imagePath}`)){ + } else if(!imagePath.startsWith("http") && (!existsSync(`${article.path}/${imagePath}`) || !isFile(`${article.path}/${imagePath}`))){ const errorMessage = "Image doesn't exist: " + imagePath; const content = article.rawData; const index = content.indexOf(imagePath); From e63427950b8a97690b35258aa7cf8f7d5bee1a1b Mon Sep 17 00:00:00 2001 From: Josefine Hansson Date: Thu, 17 Mar 2022 18:10:59 +0100 Subject: [PATCH 15/15] added fixes italics --- .../tutorials/AnalogToMidi/AnalogToMidi.md | 6 ++-- .../tutorials/WiFi101OTA/WiFi101OTA.md | 2 +- .../wifi-101-library-examples.md | 6 ++-- ...ing-an-arduino-nb-1500-to-azure-iot-hub.md | 2 +- .../tutorials/VidorDrawLogo/VidorDrawLogo.md | 2 +- .../VidorEnableCam/VidorEnableCam.md | 2 +- .../tutorials/VidorEncoder/VidorEncoder.md | 2 +- .../VidorQrRecognition/VidorQrRecognition.md | 4 +-- .../using-an-atmel-ice-with-the-ide-v2.md | 4 +-- ...n-arduino-mkr-wifi-1010-to-aws-iot-core.md | 6 ++-- .../mkr-iot-carrier-01-technical-reference.md | 4 +-- .../yun-rev2/tutorials/Bridge/Bridge.md | 4 +-- .../ConsoleAsciiTable/ConsoleAsciiTable.md | 2 +- .../tutorials/ConsolePixel/ConsolePixel.md | 2 +- .../tutorials/ConsoleRead/ConsoleRead.md | 2 +- .../FileWriteScript/FileWriteScript.md | 2 +- .../tutorials/HttpClient/HttpClient.md | 2 +- .../HttpClientConsole/HttpClientConsole.md | 2 +- .../yun-rev2/tutorials/LinuxCLI/LinuxCLI.md | 2 +- .../MailboxReadMessage/MailboxReadMessage.md | 2 +- .../yun-rev2/tutorials/Process/Process.md | 2 +- .../RemoteDueBlink/RemoteDueBlink.md | 2 +- .../tutorials/ShellCommands/ShellCommands.md | 2 +- .../TemperatureWebPanel.md | 2 +- .../yun-rev2/tutorials/TimeCheck/TimeCheck.md | 2 +- .../tutorials/WiFiStatus/WiFiStatus.md | 2 +- .../tutorials/YunDatalogger/YunDatalogger.md | 2 +- .../YunFirstConfig/YunFirstConfig.md | 12 +++---- .../YunPackageManager/YunPackageManager.md | 2 +- .../YunSerialTerminal/YunSerialTerminal.md | 2 +- .../tutorials/YunSysRestore/YunSysRestore.md | 2 +- .../tutorials/YunSysupgrade/YunSysupgrade.md | 4 +-- .../YunUBootReflash/YunUBootReflash.md | 2 +- .../ArduinoZeroEDBG/ArduinoZeroEDBG.md | 6 ++-- .../AdvancedChatServer/AdvancedChatServer.md | 2 +- .../BarometricPressureWebServer.md | 2 +- .../tutorials/ChatServer/ChatServer.md | 2 +- .../tutorials/Datalogger/Datalogger.md | 2 +- .../DhcpAddressPrinter/DhcpAddressPrinter.md | 2 +- .../tutorials/DnsWebClient/DnsWebClient.md | 2 +- .../tutorials/TelnetClient/TelnetClient.md | 2 +- .../UDPSendReceiveString.md | 2 +- .../tutorials/UdpNtpClient/UdpNtpClient.md | 2 +- .../tutorials/WebClient/WebClient.md | 2 +- .../WebClientRepeating/WebClientRepeating.md | 2 +- .../tutorials/WebServer/WebServer.md | 2 +- .../ble-device-to-device.md | 2 +- .../get-started-with-machine-learning.md | 4 +-- .../rp2040-python-api/rp2040-python-api.md | 2 +- .../portenta-h7/datasheets/datasheet.md | 2 +- .../edge-control/datasheets/rev1/datasheet.md | 2 +- .../edge-control/datasheets/rev2/datasheet.md | 2 +- .../datasheet/datasheet.md | 36 +++++++++---------- .../datasheet/datasheet.md | 2 +- .../datasheet/datasheet.md | 2 +- .../getting-started/getting-started.md | 4 +-- 56 files changed, 93 insertions(+), 93 deletions(-) diff --git a/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/AnalogToMidi/AnalogToMidi.md b/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/AnalogToMidi/AnalogToMidi.md index 6a0f74299f..a070a52540 100644 --- a/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/AnalogToMidi/AnalogToMidi.md +++ b/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/AnalogToMidi/AnalogToMidi.md @@ -56,13 +56,13 @@ Defines the correspondence between notes and MIDI note values. Part of MIDIUSB ### Functions In Sketch -*searchForNote(float frequency)* +**searchForNote(float frequency)** Search for the nearest frequency that is in the vector of frequencies noteFrequency[ ] -*noteOn(byte channel, byte pitch, byte velocity)* +**noteOn(byte channel, byte pitch, byte velocity)** Sends out to MIDI the event to turn on the note of the specified pitch on the specified MIDI Channel -*void noteOff(byte channel, byte pitch, byte velocity)* +**void noteOff(byte channel, byte pitch, byte velocity)** Sends out to MIDI the event to turn off the note of the specified pitch on the specified MIDI Channel ## Code diff --git a/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/WiFi101OTA/WiFi101OTA.md b/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/WiFi101OTA/WiFi101OTA.md index cf40ab19f1..4de8934965 100644 --- a/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/WiFi101OTA/WiFi101OTA.md +++ b/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/WiFi101OTA/WiFi101OTA.md @@ -202,4 +202,4 @@ void printWifiStatus() { -*Last revision 2017/03/24 by AG* \ No newline at end of file +**Last revision 2017/03/24 by AG** \ No newline at end of file diff --git a/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/wifi-101-library-examples/wifi-101-library-examples.md b/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/wifi-101-library-examples/wifi-101-library-examples.md index ca400f58f3..6e7c741d46 100644 --- a/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/wifi-101-library-examples/wifi-101-library-examples.md +++ b/content/hardware/01.mkr/01.boards/mkr-1000-wifi/tutorials/wifi-101-library-examples/wifi-101-library-examples.md @@ -156,7 +156,7 @@ void loop() { The 19.6.1 firmware is only available for model B of the WINC1500, this is used in the MKR1000 board. Unfortunately, the WiFi101 shield uses model A, which Atmel has stopped supporting, so there is no 19.6.1 firmware release for it, 19.4.4 will be the latest firmware version that is compatible. -To simplify the process, we have prepared a specific sketch - this *FirmwareUpdater* - that you must load on the host board (either the one with the shield plugged in, or the MKR1000 itself) and an easy to use plug-in available in Arduino Software (IDE) 1.6.10 onwards. +To simplify the process, we have prepared a specific sketch - this **FirmwareUpdater** - that you must load on the host board (either the one with the shield plugged in, or the MKR1000 itself) and an easy to use plug-in available in Arduino Software (IDE) 1.6.10 onwards. The `FirmwareUpdater.ino` sketch is available in **Examples > WiFi101** @@ -180,7 +180,7 @@ To update the firmware you should choose the right typer of board. You can find ![Find the model.](assets/MKR1000_RevA_B_20copy.png) -Choose in the dropdown list the model corresponding to your unit and proceed clicking on the *Update Firmware button*. A bar at the bottom will show you the progress of the procedure that includes erasing, writing and verifying of the firmware. At the end you get a clear notice of the successful operation. +Choose in the dropdown list the model corresponding to your unit and proceed clicking on the **Update Firmware button**. A bar at the bottom will show you the progress of the procedure that includes erasing, writing and verifying of the firmware. At the end you get a clear notice of the successful operation. ![Firmware has been updated.](assets/firmware_uploaded_101.png) @@ -189,7 +189,7 @@ Choose in the dropdown list the model corresponding to your unit and proceed cli With the same procedure, you may load root certificates on the WiFi module to access securely specific websites. Your board must be running the **FirmwareUpdater** sketch to work .The root certificates are issued by a limited number of certification authorities, but it is difficult to know which site is using which authority. To ease your life, we allow you to specify directly the URL to which you need to connect securely, leaving to us the task to download the root certificate. The list you are building is not saved from one session to the next one. It might happen that a few websites share the same root certificate. You don't have to worry about this as we take care of it. The space available on your WiFi module to store the certificates is limited to around 10 certificates that, being issued by a limited number of authorities, should be more than enough for the average projects. -The procedure starts connecting your board (either the one with the shield plugged in, or the MKR1000 itself) to your computer and selecting it from the Tools menu of the Arduino Software (IDE). Load the FirmwareUpdater on the board and launch the *WiFi 101 Firmware Updater* from Tools and go to the third section of the interface. +The procedure starts connecting your board (either the one with the shield plugged in, or the MKR1000 itself) to your computer and selecting it from the Tools menu of the Arduino Software (IDE). Load the FirmwareUpdater on the board and launch the **WiFi 101 Firmware Updater** from Tools and go to the third section of the interface. ![Adding SSL root certificates.](assets/certificates_upload_101.png) diff --git a/content/hardware/01.mkr/01.boards/mkr-nb-1500/tutorials/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub.md b/content/hardware/01.mkr/01.boards/mkr-nb-1500/tutorials/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub.md index cb54598a18..189a8e3e09 100644 --- a/content/hardware/01.mkr/01.boards/mkr-nb-1500/tutorials/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub.md +++ b/content/hardware/01.mkr/01.boards/mkr-nb-1500/tutorials/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub.md @@ -155,7 +155,7 @@ In the Azure IoT Hub portal, click the device id row in the IoT Devices table fo ![Click "Message to device"](assets/screen_shot_2019-02-06_at_12_06_14_pm_554ggffxiP.png) -You can now enter a message body to send to the device, in the screenshot below "*Hello there :)*" was entered. Click the "Send Message" button in the toolbar to send the message. +You can now enter a message body to send to the device, in the screenshot below "**Hello there :)**" was entered. Click the "Send Message" button in the toolbar to send the message. ![Send your message!](assets/screen_shot_2019-02-06_at_12_07_18_pm_jZHRAyebN2.png) diff --git a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorDrawLogo/VidorDrawLogo.md b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorDrawLogo/VidorDrawLogo.md index cb282f7726..e53121a309 100644 --- a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorDrawLogo/VidorDrawLogo.md +++ b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorDrawLogo/VidorDrawLogo.md @@ -126,4 +126,4 @@ void loop() ``` -*Last revision 2018/07/22 by SM* +**Last revision 2018/07/22 by SM** diff --git a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEnableCam/VidorEnableCam.md b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEnableCam/VidorEnableCam.md index 38bc0d9cc3..3b9f7496ff 100644 --- a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEnableCam/VidorEnableCam.md +++ b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEnableCam/VidorEnableCam.md @@ -107,4 +107,4 @@ void loop() ``` -*Last revision 2018/07/22 by SM* +**Last revision 2018/07/22 by SM** diff --git a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEncoder/VidorEncoder.md b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEncoder/VidorEncoder.md index c85847d117..1eb7ff9c9d 100644 --- a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEncoder/VidorEncoder.md +++ b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorEncoder/VidorEncoder.md @@ -155,4 +155,4 @@ void loop() { ``` -*Last revision 2018/07/22 by SM* +**Last revision 2018/07/22 by SM** diff --git a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorQrRecognition/VidorQrRecognition.md b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorQrRecognition/VidorQrRecognition.md index 72cf54070a..0294d1a5a5 100644 --- a/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorQrRecognition/VidorQrRecognition.md +++ b/content/hardware/01.mkr/01.boards/mkr-vidor-4000/tutorials/VidorQrRecognition/VidorQrRecognition.md @@ -29,7 +29,7 @@ Include the VidorCamera library, which is part of VidorGraphics. `#include "VidorGraphics.h"` `#include "VidorCamera.h"` -You have a number of functions available to manage the recognition of a QR Code. VidorQR is part of the VidorCam library; the functions are accessible with *cam.qrrec*. +You have a number of functions available to manage the recognition of a QR Code. VidorQR is part of the VidorCam library; the functions are accessible with **cam.qrrec**. - `void begin()` - start recognition algorithm @@ -150,4 +150,4 @@ void loop() { } ``` -*Last revision 2018/07/22 by SM* +**Last revision 2018/07/22 by SM** diff --git a/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/atmel-ice/using-an-atmel-ice-with-the-ide-v2.md b/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/atmel-ice/using-an-atmel-ice-with-the-ide-v2.md index b52572c2b7..230fcf94d4 100644 --- a/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/atmel-ice/using-an-atmel-ice-with-the-ide-v2.md +++ b/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/atmel-ice/using-an-atmel-ice-with-the-ide-v2.md @@ -99,9 +99,9 @@ If the SWD interfaces of the debugger and the board are connected properly, a ** ## Using the Debugger Tool -Now that we have our hardware set up, we can learn how to use the IDE 2.0 Debugger Tool main functionalities through the [_Debugging with the Arduino IDE 2.0 tutorial_](https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-debugger). This tutorial goes through some key features of the Debugger Tool, and includes pointers to get started. +Now that we have our hardware set up, we can learn how to use the IDE 2.0 Debugger Tool main functionalities through the [**Debugging with the Arduino IDE 2.0 tutorial**](https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-debugger). This tutorial goes through some key features of the Debugger Tool, and includes pointers to get started. -As explained in the [_Debugging with the Arduino IDE 2.0 tutorial_](https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-debugger), before we can use the Debugger Tool of the Arduino IDE 2.0, we need to upload a sketch to our MKR WiFi 1010 board, making sure it is optimized for debugging. Let's try a simple program that blinks the onboard LED of our MKR WiFi 1010 board and changes the value of several variables while running. +As explained in the [**Debugging with the Arduino IDE 2.0 tutorial**](https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-debugger), before we can use the Debugger Tool of the Arduino IDE 2.0, we need to upload a sketch to our MKR WiFi 1010 board, making sure it is optimized for debugging. Let's try a simple program that blinks the onboard LED of our MKR WiFi 1010 board and changes the value of several variables while running. ### 1. Setting Up diff --git a/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core.md b/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core.md index 447ec9a724..4e29691c29 100644 --- a/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core.md +++ b/content/hardware/01.mkr/01.boards/mkr-wifi-1010/tutorials/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core.md @@ -24,7 +24,7 @@ source: "https://create.arduino.cc/projecthub/Arduino_Genuino/securely-connectin [AWS IoT Core](https://aws.amazon.com/iot-core/) is a managed cloud service that lets connected devices easily and securely interact with cloud applications and other devices. AWS IoT Core can support billions of devices and trillions of messages, and can process and route those messages to AWS endpoints and to other devices reliably and securely. -Devices can connect to AWS IoT Core using the following protocols: HTTP, WebSockets and MQTT. This tutorial will walk you through how to connect an [Arduino MKR WiFi 1010](https://store.arduino.cc/usa/arduino-mkr-wifi-1010) (or MKR1000) board securely to AWS IoT Core using the MQTT protocol. [MQTT](http://mqtt.org/) (*Message Queuing Telemetry Transport*) is an extremely lightweight M2M (machine-to-machine) connectivity protocol which provides a messaging subscription and publish transport. +Devices can connect to AWS IoT Core using the following protocols: HTTP, WebSockets and MQTT. This tutorial will walk you through how to connect an [Arduino MKR WiFi 1010](https://store.arduino.cc/usa/arduino-mkr-wifi-1010) (or MKR1000) board securely to AWS IoT Core using the MQTT protocol. [MQTT](http://mqtt.org/) (**Message Queuing Telemetry Transport**) is an extremely lightweight M2M (machine-to-machine) connectivity protocol which provides a messaging subscription and publish transport. When connecting to AWS IoT Core using MQTT, devices are required to use X.509 certificates with TLS for authentication, as AWS IoT Core does not support authentication via username and password like many other MQTT broker services provide support for. More information on X.509 certificate support on AWS IoT can be found [here](https://docs.aws.amazon.com/iot/latest/developerguide/x509-certs.html). @@ -114,7 +114,7 @@ Now that we have a CSR to identify the board, we need to login into the AWS cons ![Create a policy.](assets/screen_shot_2019-01-14_at_3_25_34_pm_C67jg7LTXy.png) -13) Click "Create a policy." We'll be creating a very open policy for testing, **later on we suggest you create a stricter policy**. We'll call this policy "AllowEverything," fill in "iot:*" for the Action and "*" for the Resource ARN, then check the "Allow" box, then click "Create." +13) Click "Create a policy." We'll be creating a very open policy for testing, **later on we suggest you create a stricter policy***. We'll call this policy "AllowEverything," fill in "iot:\*" for the Action and "\*" for the Resource ARN, then check the "Allow" box, then click "Create." ![Click create.](assets/screen_shot_2019-01-14_at_3_26_58_pm_bkfMovt51e.png) @@ -175,7 +175,7 @@ Now that your board has successfully connected to AWS IoT, we can use the AWS co Every five seconds the board sends a hello message with the current millis() value. -Now let's send a message to the board. In the Publish section, change the topic to **arduino/incoming** and click the "Publish to topic" button*.* +Now let's send a message to the board. In the Publish section, change the topic to **arduino/incoming** and click the "Publish to topic" button. ![Click Publish to topic.](assets/screen_shot_2019-01-14_at_5_53_47_pm_LKDzWUW8VV.png) diff --git a/content/hardware/01.mkr/03.carriers/mkr-iot-carrier/tutorials/mkr-iot-carrier-01-technical-reference/mkr-iot-carrier-01-technical-reference.md b/content/hardware/01.mkr/03.carriers/mkr-iot-carrier/tutorials/mkr-iot-carrier-01-technical-reference/mkr-iot-carrier-01-technical-reference.md index a0e8fa8c30..0793417fce 100644 --- a/content/hardware/01.mkr/03.carriers/mkr-iot-carrier/tutorials/mkr-iot-carrier-01-technical-reference/mkr-iot-carrier-01-technical-reference.md +++ b/content/hardware/01.mkr/03.carriers/mkr-iot-carrier/tutorials/mkr-iot-carrier-01-technical-reference/mkr-iot-carrier-01-technical-reference.md @@ -106,7 +106,7 @@ The `carrier.begin();` command is essential to initializing the carrier and must ![The HTS221 Humidity Sensor on the MKR IoT Carrier](assets/mkrIotCarrier-sensor-temp&humi.png) -The **HTS221 Humidity Sensor** is mounted on the top side of the carrier under the display, marked with a drop icon. The sensor uses capacitive sensing with a **humidity sensing range** of _0-100%_ and **accuracy** of _± 3.5% rH (20 to +80% rH)_, and a **temperature sensing range** of _-40 to 120° C_, with an **accuracy** of _± 0.5 °C,15 to +40 °C_. The sensor uses a low power consumption (2μA at 1 Hz sampling rate) and connects to the mounted Arduino MKR board through a I2C interface. +The **HTS221 Humidity Sensor** is mounted on the top side of the carrier under the display, marked with a drop icon. The sensor uses capacitive sensing with a **humidity sensing range** of **0-100%** and **accuracy** of **± 3.5% rH (20 to +80% rH)**, and a **temperature sensing range** of **-40 to 120° C**, with an **accuracy** of **± 0.5 °C,15 to +40 °C**. The sensor uses a low power consumption (2μA at 1 Hz sampling rate) and connects to the mounted Arduino MKR board through a I2C interface. ### Code @@ -135,7 +135,7 @@ Returns relative humidity (rH) in percentage. ![The LPS22HBTR Pressure Sensor on the MKR IoT Carrier](assets/mkrIotCarrier-sensor-pressure.png) -The **LPS22HBTR Pressure Sensor** is mounted on the top side of the carrier under the display, marked with a meter icon. The sensor measures **absolute pressure range** of _260 to 1260 hPa (0.25 to 1.24 atm)_ and connects to the mounted Arduino MKR board through a I2C interface. +The **LPS22HBTR Pressure Sensor** is mounted on the top side of the carrier under the display, marked with a meter icon. The sensor measures **absolute pressure range** of **260 to 1260 hPa (0.25 to 1.24 atm)** and connects to the mounted Arduino MKR board through a I2C interface. ### Code diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/Bridge/Bridge.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/Bridge/Bridge.md index fa1a650b08..c992ba6407 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/Bridge/Bridge.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/Bridge/Bridge.md @@ -128,7 +128,7 @@ void process(YunClient client) { } ``` -Create a function to deal with *digital* commands. Accept the client as the argument. Create some local variables to hold the pin and value of the command. +Create a function to deal with **digital** commands. Accept the client as the argument. Create some local variables to hold the pin and value of the command. ```arduino void digitalCommand(YunClient client) { @@ -162,7 +162,7 @@ Print the value to the client and update the datastore key with the current pin By wrapping the value to the client in `F()`, you'll be printing form the flash memory. This helps conserve space in SRAM, which is useful when dealing with long strings like URLs. -The key will be the pin, and type. For example *D2* will be saved for for digital pin 2. The value will be whatever value the pin is currently set to, or was read from the pin. +The key will be the pin, and type. For example **D2** will be saved for for digital pin 2. The value will be whatever value the pin is currently set to, or was read from the pin. ```arduino client.print(F("Pin D")); diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleAsciiTable/ConsoleAsciiTable.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleAsciiTable/ConsoleAsciiTable.md index 8e43cb5b98..ec670b6535 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleAsciiTable/ConsoleAsciiTable.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleAsciiTable/ConsoleAsciiTable.md @@ -236,4 +236,4 @@ void loop() { } ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsolePixel/ConsolePixel.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsolePixel/ConsolePixel.md index ec882684a0..d43360bf3f 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsolePixel/ConsolePixel.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsolePixel/ConsolePixel.md @@ -187,4 +187,4 @@ void loop() { } ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleRead/ConsoleRead.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleRead/ConsoleRead.md index 1a2a48be3d..d220e83954 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleRead/ConsoleRead.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/ConsoleRead/ConsoleRead.md @@ -190,4 +190,4 @@ void loop() { ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/FileWriteScript/FileWriteScript.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/FileWriteScript/FileWriteScript.md index 145cd2e3cf..c125ac3aa8 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/FileWriteScript/FileWriteScript.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/FileWriteScript/FileWriteScript.md @@ -252,4 +252,4 @@ void runScript() { } ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClient/HttpClient.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClient/HttpClient.md index bb64ae20c8..89fb160cc7 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClient/HttpClient.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClient/HttpClient.md @@ -80,4 +80,4 @@ The complete sketch is below : -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClientConsole/HttpClientConsole.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClientConsole/HttpClientConsole.md index dbc124032b..3d31ae670a 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClientConsole/HttpClientConsole.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/HttpClientConsole/HttpClientConsole.md @@ -159,4 +159,4 @@ void loop() { ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/LinuxCLI/LinuxCLI.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/LinuxCLI/LinuxCLI.md index 16962cf59c..e6bd0bcc1f 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/LinuxCLI/LinuxCLI.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/LinuxCLI/LinuxCLI.md @@ -43,7 +43,7 @@ This document has additional information about [using the CLI and OpenWRT](http: SSH is shorthand for Secure Shell, a terminal protocol for securely connecting between two computers. You'll use SSH to connect between your computer and the Yún. -To connect via SSH, you need the IP address of the Yún, the administrator password, and you'll need to have the Arduino and the computer you're using on the same network. To find the Yun's IP address, make sure you're on the same wireless network, and open the Arduino software. Check the *Ports* list, the Yún should be listed with its address. +To connect via SSH, you need the IP address of the Yún, the administrator password, and you'll need to have the Arduino and the computer you're using on the same network. To find the Yun's IP address, make sure you're on the same wireless network, and open the Arduino software. Check the **Ports** list, the Yún should be listed with its address. To connect to your Yún via SSH, open your terminal application, type the following, substituting the IP address for that of your Yún : diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/MailboxReadMessage/MailboxReadMessage.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/MailboxReadMessage/MailboxReadMessage.md index 82d0c4bb20..2901c3f5c5 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/MailboxReadMessage/MailboxReadMessage.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/MailboxReadMessage/MailboxReadMessage.md @@ -203,4 +203,4 @@ void loop() { } ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/Process/Process.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/Process/Process.md index 7a156d09d0..80080d439d 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/Process/Process.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/Process/Process.md @@ -222,4 +222,4 @@ void runCpuInfo() { ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/RemoteDueBlink/RemoteDueBlink.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/RemoteDueBlink/RemoteDueBlink.md index 7569b54f82..73bb7030dc 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/RemoteDueBlink/RemoteDueBlink.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/RemoteDueBlink/RemoteDueBlink.md @@ -82,4 +82,4 @@ void loop() { ``` -*Last revision 2016/05/25 by SM* \ No newline at end of file +**Last revision 2016/05/25 by SM** \ No newline at end of file diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/ShellCommands/ShellCommands.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/ShellCommands/ShellCommands.md index 57eb6f449d..92046fe2d6 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/ShellCommands/ShellCommands.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/ShellCommands/ShellCommands.md @@ -180,4 +180,4 @@ void loop() { ``` -*Last revision 2016/05/25 by SM* \ No newline at end of file +**Last revision 2016/05/25 by SM** \ No newline at end of file diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/TemperatureWebPanel/TemperatureWebPanel.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/TemperatureWebPanel/TemperatureWebPanel.md index efde644f3b..2a9082f598 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/TemperatureWebPanel/TemperatureWebPanel.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/TemperatureWebPanel/TemperatureWebPanel.md @@ -407,4 +407,4 @@ void loop() { } ``` -*Last revision 2016/05/25 by SM* \ No newline at end of file +**Last revision 2016/05/25 by SM** \ No newline at end of file diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/TimeCheck/TimeCheck.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/TimeCheck/TimeCheck.md index eff91cebd9..cf5b8c5bdd 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/TimeCheck/TimeCheck.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/TimeCheck/TimeCheck.md @@ -277,4 +277,4 @@ void loop() { ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/WiFiStatus/WiFiStatus.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/WiFiStatus/WiFiStatus.md index 78c029fafc..28217858c3 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/WiFiStatus/WiFiStatus.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/WiFiStatus/WiFiStatus.md @@ -154,4 +154,4 @@ void loop() { ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunDatalogger/YunDatalogger.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunDatalogger/YunDatalogger.md index 32b4822780..f0fe9363fb 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunDatalogger/YunDatalogger.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunDatalogger/YunDatalogger.md @@ -306,4 +306,4 @@ String getTimeStamp() { } ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunFirstConfig/YunFirstConfig.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunFirstConfig/YunFirstConfig.md index df1c24ad9c..b47b8486eb 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunFirstConfig/YunFirstConfig.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunFirstConfig/YunFirstConfig.md @@ -32,17 +32,17 @@ image developed using [Fritzing](http://www.fritzing.org). For more circuit exam ### Libraries -*Process.h* is used to launch processes on the Linux processor, and other things like shell scripts. Here we use it to get the list of APs and to perform other actions that let us know the WiFi parameters. +**Process.h** is used to launch processes on the Linux processor, and other things like shell scripts. Here we use it to get the list of APs and to perform other actions that let us know the WiFi parameters. ### Functions -*String getUserInput(String out, bool obfuscated)* - manages the input from the user through the Serial Monitor, printing back in the window. The boolean variable "obfuscated" is used to print out "*" when a password is entered. +**String getUserInput(String out, bool obfuscated)*** - manages the input from the user through the Serial Monitor, printing back in the window. The boolean variable "obfuscated" is used to print out "**" when a password is entered. -*void wifiConfig(String yunName, String yunPsw, String wifissid, String wifipsw, String wifiAPname, String countryCode, String encryption)* - uses Process to execute a series of commands and scripts, under linux, that set the WiFi and network parameters as chosen by the user. +**void wifiConfig(String yunName, String yunPsw, String wifissid, String wifipsw, String wifiAPname, String countryCode, String encryption)** - uses Process to execute a series of commands and scripts, under linux, that set the WiFi and network parameters as chosen by the user. -*void startSerialTerminal()* - simply initialize the two serial ports needed to perform the actions required by the sketch. +**void startSerialTerminal()** - simply initialize the two serial ports needed to perform the actions required by the sketch. -*void loopSerialTerminal()* - creates the connection between the two serial ports, one talking with the PC using USB, the other talking to the linux processor. It has a command mode that can be invoked typing '~' that shuts down Bridge and allows to set a different communication speed with the Atheros chip. +**void loopSerialTerminal()** - creates the connection between the two serial ports, one talking with the PC using USB, the other talking to the linux processor. It has a command mode that can be invoked typing '~' that shuts down Bridge and allows to set a different communication speed with the Atheros chip. ## Usage @@ -656,4 +656,4 @@ void loopSerialTerminal() { } ``` -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunPackageManager/YunPackageManager.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunPackageManager/YunPackageManager.md index 130d3fcbc6..18ebe7a0a8 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunPackageManager/YunPackageManager.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunPackageManager/YunPackageManager.md @@ -9,7 +9,7 @@ The package management system, also called "package manager", is a very importan On the OpenWrt-Yun Linux system the package manager tool is called "opkg". Usually operations on a package can be done through the command line with a few arguments. -The package manager needs an updated database to display packages available for your system. Running the *opkg* update command updates the list of available packages. Due to the small flash memory available on the Yún, the database with the list of the package is only saved inside RAM. This means that you need to run the *opkg* update command every time you want to install a program after freeing the RAM or after a reboot. +The package manager needs an updated database to display packages available for your system. Running the **opkg** update command updates the list of available packages. Due to the small flash memory available on the Yún, the database with the list of the package is only saved inside RAM. This means that you need to run the **opkg** update command every time you want to install a program after freeing the RAM or after a reboot. ![Downloading the packages.](assets/YunOpkgFortune.png) diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSerialTerminal/YunSerialTerminal.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSerialTerminal/YunSerialTerminal.md index 28ac69fe21..9cff716c74 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSerialTerminal/YunSerialTerminal.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSerialTerminal/YunSerialTerminal.md @@ -138,4 +138,4 @@ Below is the complete code: -*Last revision 2016/05/25 by SM* +**Last revision 2016/05/25 by SM** diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysRestore/YunSysRestore.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysRestore/YunSysRestore.md index 4628245719..ece762f945 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysRestore/YunSysRestore.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysRestore/YunSysRestore.md @@ -38,6 +38,6 @@ Then when the console ( `ar7240>` ) returns, type: Following the command, your Yún should start booting the 1.6.2 image. Once OpenWRT (Chaos Calmer) finishes booting and you have gained access to the console (`root@arduino#:`) you can follow the procedure to do a sysupgrade as described in the tutorial [upgrade OpenWrt image on the Yún](https://www.arduino.cc/en/Tutorial/YunSysupgrade) to restore the [1.5.3 image](https://downloads.arduino.cc/openwrtyun/1/YunSysupgradeImage_v1.5.3.zip). -*Remember that you must use the files of the 1.5.3 image and NOT the 1.6.2 ones.* +**Remember that you must use the files of the 1.5.3 image and NOT the 1.6.2 ones.** At the end of the process your Yún will reboot and have 1.5.3 version of OpenWrt-Yun. \ No newline at end of file diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysupgrade/YunSysupgrade.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysupgrade/YunSysupgrade.md index 06ca5d203f..176e1925db 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysupgrade/YunSysupgrade.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunSysupgrade/YunSysupgrade.md @@ -28,7 +28,7 @@ Make sure the Yún and your computer are on the same network, and open a browser Once logged in, on the first page with the network information, scroll to the bottom, where you should see a notification informing you that a file containing an upgrade image has been found. -If you want to proceed resetting the Yún, click the red *RESET* button at the very bottom of the page. +If you want to proceed resetting the Yún, click the red **RESET** button at the very bottom of the page. ![Click on "reset".](assets/YunSysupgrade_1.png) @@ -82,4 +82,4 @@ As with the web panel method, the process will take a few minutes, and the WLAN -*Last revision 2018/05/29 by SM* \ No newline at end of file +**Last revision 2018/05/29 by SM** \ No newline at end of file diff --git a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunUBootReflash/YunUBootReflash.md b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunUBootReflash/YunUBootReflash.md index 4af9111ba1..38e990c37c 100644 --- a/content/hardware/02.hero/boards/yun-rev2/tutorials/YunUBootReflash/YunUBootReflash.md +++ b/content/hardware/02.hero/boards/yun-rev2/tutorials/YunUBootReflash/YunUBootReflash.md @@ -45,7 +45,7 @@ sudo launchctl start com.apple.tftpd Move the unpacked base images files into the folder /private/tftpboot/ -You can access hidden directories like */private/* by using the *Go To Folder* option in the *Go* menu of the taskbar. In this instance, click on 'Go To Folder'' and enter `/private/tftpboot/` to open the directory in the Finder. +You can access hidden directories like **/private/** by using the **Go To Folder** option in the **Go** menu of the taskbar. In this instance, click on 'Go To Folder'' and enter `/private/tftpboot/` to open the directory in the Finder. ### Setup a TFTP Server on GNU/Linux (Ubuntu) diff --git a/content/hardware/02.hero/boards/zero/tutorials/ArduinoZeroEDBG/ArduinoZeroEDBG.md b/content/hardware/02.hero/boards/zero/tutorials/ArduinoZeroEDBG/ArduinoZeroEDBG.md index db2417a85a..11afc66a5d 100644 --- a/content/hardware/02.hero/boards/zero/tutorials/ArduinoZeroEDBG/ArduinoZeroEDBG.md +++ b/content/hardware/02.hero/boards/zero/tutorials/ArduinoZeroEDBG/ArduinoZeroEDBG.md @@ -68,7 +68,7 @@ and, if all has gone as it should, in the log console you will see "OK". **13.** Go to "Memories" -**14.** Select the file to write (typically Bootloader*board_Vxxx.hex) that you will find in your Arduino Software (IDE) installation, under the \_hardware/arduino/samd/...* path found in your _Documents/Arduino/sketchbook_' folder. You need to install the SAMD core from board manager if you haven't done it yet. If your Arduino installation has been made ["portable"](/en/Guide/PortableIDE), the firmware will be in the _portable/packages/arduino_ path. folder, as seen in our screen capture below. +**14.** Select the file to write (typically Bootloader\_board\_Vxxx.hex) that you will find in your Arduino Software (IDE) installation, under the \_hardware/arduino/samd/...* path found in your '**Documents/Arduino/sketchbook**' folder. You need to install the SAMD core from board manager if you haven't done it yet. If your Arduino installation has been made ["portable"](/en/Guide/PortableIDE), the firmware will be in the **portable/packages/arduino** path. folder, as seen in our screen capture below. **15.** Click "Program" and again, in the log console you will see "OK". @@ -116,11 +116,11 @@ Choose SAMD21G18A, as shown in the next picture, and press 'finish' : ![Atmel Studio.](assets/Studio_OpenMicro_15.jpg) -There is a chance that Atmel Studio 6.2 doesn't find the sketch and the Remap Object Files to Disk Files pops up with a _Missing: 1_ error. Scroll the list of files until you find the line with a red X icon on the left, then click on the three dots on the right of the line. +There is a chance that Atmel Studio 6.2 doesn't find the sketch and the Remap Object Files to Disk Files pops up with a **Missing: 1** error. Scroll the list of files until you find the line with a red X icon on the left, then click on the three dots on the right of the line. ![Atmel Studio.](assets/Studio_Remap_15a.jpg) -The window that pops up allows you to browse to your sketchbook where you need to select your _blinkEDBG.ino_ sketch file. When you click on _Open_ you go back to the Remap Object Files where the red X is now a green check mark. Click on _Finish_. +The window that pops up allows you to browse to your sketchbook where you need to select your **blinkEDBG.ino** sketch file. When you click on **Open** you go back to the Remap Object Files where the red X is now a green check mark. Click on **Finish**. ![Atmel Studio.](assets/Studio_Remap_15b.jpg) diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/AdvancedChatServer/AdvancedChatServer.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/AdvancedChatServer/AdvancedChatServer.md index 0b75953106..2d4e7e7a71 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/AdvancedChatServer/AdvancedChatServer.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/AdvancedChatServer/AdvancedChatServer.md @@ -230,4 +230,4 @@ void loop() { ``` -*Last revision 2018/08/23 by SM* +**Last revision 2018/08/23 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/BarometricPressureWebServer/BarometricPressureWebServer.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/BarometricPressureWebServer/BarometricPressureWebServer.md index d4595976b6..192e18085b 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/BarometricPressureWebServer/BarometricPressureWebServer.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/BarometricPressureWebServer/BarometricPressureWebServer.md @@ -426,4 +426,4 @@ unsigned int readRegister(byte registerName, int numBytes) { } ``` -*Last revision 2018/09/07 by SM* \ No newline at end of file +**Last revision 2018/09/07 by SM** \ No newline at end of file diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/ChatServer/ChatServer.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/ChatServer/ChatServer.md index bb4ff99c0d..511ba2b5f2 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/ChatServer/ChatServer.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/ChatServer/ChatServer.md @@ -186,4 +186,4 @@ void loop() { } ``` -*Last revision 2018/08/23 by SM* +**Last revision 2018/08/23 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/Datalogger/Datalogger.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/Datalogger/Datalogger.md index 0850a8829b..de51e2a4b8 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/Datalogger/Datalogger.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/Datalogger/Datalogger.md @@ -165,4 +165,4 @@ void loop() { ``` -*Last revision 2015/08/17 by SM* \ No newline at end of file +**Last revision 2015/08/17 by SM** \ No newline at end of file diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DhcpAddressPrinter/DhcpAddressPrinter.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DhcpAddressPrinter/DhcpAddressPrinter.md index 851e252f79..b9f1e626e1 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DhcpAddressPrinter/DhcpAddressPrinter.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DhcpAddressPrinter/DhcpAddressPrinter.md @@ -186,4 +186,4 @@ void loop() { } ``` -*Last revision 2018/09/07 by SM* +**Last revision 2018/09/07 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DnsWebClient/DnsWebClient.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DnsWebClient/DnsWebClient.md index ea81b57b34..ac6b7482a8 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DnsWebClient/DnsWebClient.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/DnsWebClient/DnsWebClient.md @@ -11,7 +11,7 @@ tags: [Ethernet] This example connects to a named server using an Ethernet shield. The sketch illustrates how to connect using DHCP and DNS. When calling Ethernet.begin(mac), the Etehrnet library attempts to obtain an IP address using DHCP. Using DHCP significantly adds to the sketch size; be sure there is enough space to run the program. -DNS lookup happens when client.connect(*servername*,port) is called. *servername* is a URL string, like `"www.arduino.cc"`. +DNS lookup happens when client.connect(**servername**,port) is called. **servername** is a URL string, like `"www.arduino.cc"`. ## Hardware Required diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/TelnetClient/TelnetClient.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/TelnetClient/TelnetClient.md index f126665d1f..4cd1aa88e4 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/TelnetClient/TelnetClient.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/TelnetClient/TelnetClient.md @@ -36,4 +36,4 @@ Image developed using [Fritzing](http://www.fritzing.org). For more circuit exam -*Last revision 2018/09/07 by SM* +**Last revision 2018/09/07 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UDPSendReceiveString/UDPSendReceiveString.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UDPSendReceiveString/UDPSendReceiveString.md index a4eabcb38c..7dbda0eaa7 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UDPSendReceiveString/UDPSendReceiveString.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UDPSendReceiveString/UDPSendReceiveString.md @@ -40,4 +40,4 @@ Image developed using [Fritzing](http://www.fritzing.org). For more circuit exam Copy the Processing sketch from the code sample above. When you type any letter in the Processing sketch window, it will send a string to the Arduino via UDP. -*Last revision 2018/09/07 by SM* +**Last revision 2018/09/07 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UdpNtpClient/UdpNtpClient.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UdpNtpClient/UdpNtpClient.md index c5e7217e68..d438ecb3aa 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UdpNtpClient/UdpNtpClient.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/UdpNtpClient/UdpNtpClient.md @@ -35,4 +35,4 @@ Image developed using [Fritzing](http://www.fritzing.org). For more circuit exam -*Last revision 2018/09/07 by SM* +**Last revision 2018/09/07 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClient/WebClient.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClient/WebClient.md index fe4fb122c2..81e074ae2f 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClient/WebClient.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClient/WebClient.md @@ -34,4 +34,4 @@ Image developed using [Fritzing](http://www.fritzing.org). For more circuit exam -*Last revision 2018/09/07 by SM* +**Last revision 2018/09/07 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClientRepeating/WebClientRepeating.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClientRepeating/WebClientRepeating.md index 141863b20d..8b16621b96 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClientRepeating/WebClientRepeating.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebClientRepeating/WebClientRepeating.md @@ -238,4 +238,4 @@ void httpRequest() { ``` -*Last revision 2018/09/07 by SM* +**Last revision 2018/09/07 by SM** diff --git a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebServer/WebServer.md b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebServer/WebServer.md index 534c4bbb52..d154be7685 100644 --- a/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebServer/WebServer.md +++ b/content/hardware/02.hero/shields/ethernet-shield-rev2/tutorials/WebServer/WebServer.md @@ -47,4 +47,4 @@ digitalWrite(4, HIGH); -*Last revision 2018/09/07 by SM* +**Last revision 2018/09/07 by SM** diff --git a/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/ble-device-to-device/ble-device-to-device.md b/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/ble-device-to-device/ble-device-to-device.md index cc495deadf..3b085b4059 100644 --- a/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/ble-device-to-device/ble-device-to-device.md +++ b/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/ble-device-to-device/ble-device-to-device.md @@ -31,7 +31,7 @@ In this tutorial, we will learn how to exchange information between two Arduino The Bluetooth® standard was originally conceived by Dr. Jaarp Haartsen at Ericsson in 1994, more than 20 years ago. It was named after a [renowned Viking and king](https://en.wikipedia.org/wiki/Harald_Bluetooth) who united Denmark and Norway in the 10th century, King Harald Gormsson. Dr. Haartsen was appointed to develop a short-range wireless connection standard that could replace the [RS-232](https://en.wikipedia.org/wiki/RS-232) standard, a wired telecommunications standard that was conceived in the 60s and that is still used nowadays. -Bluetooth® uses what is known as **short-link radio technology**. It operates at the **unlicensed** but **regulated**, 2.4 to 2.485GHz band and it uses radios to communicate and establish connections between two or more devices. Bluetooth® is based on the [**frequency-hopping spread spectrum**](https://en.wikipedia.org/wiki/Frequency-hopping_spread_spectrum) method, this method was first described in the 1940s by the actress [Hedy Lamarr](https://en.wikipedia.org/wiki/Hedy_Lamarr) and the composer [George Antheil](https://en.wikipedia.org/wiki/George_Antheil). Lamarr and Antheil wished to create a way to prevent torpedoes guided by radio to be jammed. Bluetooth® is, in essence, a short-range wireless network called a [*piconet*](https://en.wikipedia.org/wiki/Piconet). +Bluetooth® uses what is known as **short-link radio technology**. It operates at the **unlicensed** but **regulated**, 2.4 to 2.485GHz band and it uses radios to communicate and establish connections between two or more devices. Bluetooth® is based on the [**frequency-hopping spread spectrum**](https://en.wikipedia.org/wiki/Frequency-hopping_spread_spectrum) method, this method was first described in the 1940s by the actress [Hedy Lamarr](https://en.wikipedia.org/wiki/Hedy_Lamarr) and the composer [George Antheil](https://en.wikipedia.org/wiki/George_Antheil). Lamarr and Antheil wished to create a way to prevent torpedoes guided by radio to be jammed. Bluetooth® is, in essence, a short-range wireless network called a [piconet](https://en.wikipedia.org/wiki/Piconet). In 1994, besides Ericsson, companies like Intel, Nokia, IBM, and Toshiba also had the idea of a short-range wireless link between electronic devices. What these companies understood at that time was that to create a short-range wireless link that could be used across different electronic devices, a protocol had to be standardized so that it could be universally applied. In 1996, those companies formed the Bluetooth® Special Interest Group (SIG) and it was finally established in 1998. SIG started with just 5 members, by the end of its first year it reached 4,000 members and nowadays it has more than 30,000. diff --git a/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/get-started-with-machine-learning/get-started-with-machine-learning.md b/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/get-started-with-machine-learning/get-started-with-machine-learning.md index e96625ebcc..e88eec042b 100644 --- a/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/get-started-with-machine-learning/get-started-with-machine-learning.md +++ b/content/hardware/03.nano/boards/nano-33-ble-sense/tutorials/get-started-with-machine-learning/get-started-with-machine-learning.md @@ -150,7 +150,7 @@ With the sketch we are creating we will do the following: - Sample for one second at 119Hz, outputting CSV format data over USB - Loop back and monitor for the next gesture -*The sensors we choose to read from the board, the sample rate, the trigger threshold, and whether we stream data output as CSV, JSON, binary or some other format are all customizable in the sketch running on the Arduino. There is also scope to perform signal preprocessing and filtering on the device before the data is output to the log – this we can cover in another blog. For now, you can just upload the sketch and get sampling.* +**The sensors we choose to read from the board, the sample rate, the trigger threshold, and whether we stream data output as CSV, JSON, binary or some other format are all customizable in the sketch running on the Arduino. There is also scope to perform signal preprocessing and filtering on the device before the data is output to the log – this we can cover in another blog. For now, you can just upload the sketch and get sampling.** The complete sketch can be found below: @@ -256,7 +256,7 @@ With that done we can now visualize the data coming off the board. We’re not c ![Arduino IDE Serial Plotter will show a live graph of CSV data output from your board.](assets/plot-1.gif) -*When you’re done be sure to close the Serial Plotter window – this is important as the next step won’t work otherwise.* +**When you’re done be sure to close the Serial Plotter window – this is important as the next step won’t work otherwise.** ## Capturing Gesture Training Data To capture data as a CSV log to upload to TensorFlow, you can use **Arduino IDE > Tools > Serial Monitor** to view the data and export it to your desktop machine: diff --git a/content/hardware/03.nano/boards/nano-rp2040-connect/tutorials/rp2040-python-api/rp2040-python-api.md b/content/hardware/03.nano/boards/nano-rp2040-connect/tutorials/rp2040-python-api/rp2040-python-api.md index e9d64ac392..0cbeaf3f74 100644 --- a/content/hardware/03.nano/boards/nano-rp2040-connect/tutorials/rp2040-python-api/rp2040-python-api.md +++ b/content/hardware/03.nano/boards/nano-rp2040-connect/tutorials/rp2040-python-api/rp2040-python-api.md @@ -11,7 +11,7 @@ tags: ![The Nano RP2040 Connect](assets/hero.png) -The [Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect) board can be programmed using the popular **Python** programming language. The board is supported by upstream [MicroPython](https://github.com/micropython/micropython) and [OpenMV's fork of MicroPython](https://github.com/openmv/micropython), where *MicroPython* is an implementation of the Python language, designed to run on microcontrollers. +The [Nano RP2040 Connect](https://store.arduino.cc/nano-rp2040-connect) board can be programmed using the popular **Python** programming language. The board is supported by upstream [MicroPython](https://github.com/micropython/micropython) and [OpenMV's fork of MicroPython](https://github.com/openmv/micropython), where **MicroPython** is an implementation of the Python language, designed to run on microcontrollers. In this article, you will find a lot of sample scripts that will work directly with your Nano RP2040 Connect, such as general GPIO control, reading onboard sensors and Wi-Fi/BLE communication! diff --git a/content/hardware/04.pro/boards/portenta-h7/datasheets/datasheet.md b/content/hardware/04.pro/boards/portenta-h7/datasheets/datasheet.md index 1f65316bb7..ca0bd3be75 100644 --- a/content/hardware/04.pro/boards/portenta-h7/datasheets/datasheet.md +++ b/content/hardware/04.pro/boards/portenta-h7/datasheets/datasheet.md @@ -485,7 +485,7 @@ Laboratory equipment, Computer vision | GND | Cable Ground | TX1 +/- TX2 +/- | High speed data path (TX for USB, or RX for DP Alt Mode) | | VBUS | Cable bus power | RX1 +/- RX2 +/- | High speed data path (TX for USB, or RX for DP Alt Mode) | | D+/D- | USB 2.0 Interface | SBU1 SBU2 | For sideband use (Not used for USB) | -| CC1 CC2 | Plug configuration detection * One becomes VCONN for cable or adaptor power * CC is used for USB-PD communication | | | +| CC1 CC2 | Plug configuration detection \* One becomes VCONN for cable or adaptor power \* CC is used for USB-PD communication | | | ### High Density Connector diff --git a/content/hardware/04.pro/carriers/edge-control/datasheets/rev1/datasheet.md b/content/hardware/04.pro/carriers/edge-control/datasheets/rev1/datasheet.md index 43587c5e0d..09e8883672 100644 --- a/content/hardware/04.pro/carriers/edge-control/datasheets/rev1/datasheet.md +++ b/content/hardware/04.pro/carriers/edge-control/datasheets/rev1/datasheet.md @@ -95,7 +95,7 @@ The Arduino® Edge Control is your gateway to Agriculture 4.0. Get real-time ins ### Solution Overview ![Preview assembly](assets/edgeControlSolutionOverview.png) -*Example of a typical application for a solution including LCD Display and two Arduino® MKR 1300 boards.* +**Example of a typical application for a solution including LCD Display and two Arduino® MKR 1300 boards.** ## Ratings ### Absolute Maximum Ratings diff --git a/content/hardware/04.pro/carriers/edge-control/datasheets/rev2/datasheet.md b/content/hardware/04.pro/carriers/edge-control/datasheets/rev2/datasheet.md index 7225358b56..191eae96e2 100644 --- a/content/hardware/04.pro/carriers/edge-control/datasheets/rev2/datasheet.md +++ b/content/hardware/04.pro/carriers/edge-control/datasheets/rev2/datasheet.md @@ -140,7 +140,7 @@ The Arduino® Edge Control is your gateway to Agriculture 4.0. Get real-time ins ### Solution Overview ![Preview assembly](assets/edgeControlSolutionOverview.png) -*Example of a typical application for a solution including LCD Display and two Arduino® MKR 1300 boards.* +**Example of a typical application for a solution including LCD Display and two Arduino® MKR 1300 boards.** ## Ratings ### Absolute Maximum Ratings diff --git a/content/hardware/04.pro/carriers/portenta-machine-control/datasheet/datasheet.md b/content/hardware/04.pro/carriers/portenta-machine-control/datasheet/datasheet.md index 312b7e971a..3a32220144 100644 --- a/content/hardware/04.pro/carriers/portenta-machine-control/datasheet/datasheet.md +++ b/content/hardware/04.pro/carriers/portenta-machine-control/datasheet/datasheet.md @@ -40,7 +40,7 @@ Industry 4.0, system integrators Each channel is SW configurable to be: - 0-10V input - 4-20mA input - - NTC input with 3V voltage reference *REF3330AIRSER* + - NTC input with 3V voltage reference **REF3330AIRSER** - **4 analog output channels** - DC Voltage output SW configurable 0-10V @@ -54,20 +54,20 @@ Industry 4.0, system integrators - **3 temperature channels** Each channel is SW configurable to measure: - - Thermocouple K, non grounded, front-end *MAX31855KASA+T* - - Thermocouple J, non grounded, front-end *MAX31855KASA+T* with SW multiplication coefficient - - PT100, front end *MAX31865ATP+T* - - PT1000, front end *MAX31865ATP+T* + - Thermocouple K, non grounded, front-end **MAX31855KASA+T** + - Thermocouple J, non grounded, front-end **MAX31855KASA+T** with SW multiplication coefficient + - PT100, front end **MAX31865ATP+T** + - PT1000, front end **MAX31865ATP+T** - **2 encoder channels ABZ** - 0-24V input - **High speed CAN** - - *TJA1049T/3J* able to work at 12V/24V + - **TJA1049T/3J** able to work at 12V/24V - On board termination resistors - **RS232/RS422/RS485 software configurable** - - *SP335ECR1-L* with on board termination resistors + - **SP335ECR1-L** with on board termination resistors - RS485 configurable half duplex or full duplex - **I2C** @@ -152,15 +152,15 @@ The 24V IN pin is not galvanically isolated: the input voltage must be referred The supply voltage can be the same 24V which is powering the board. -- 8 high side switches (2x *TPS4H160AQPWPRQ1*), one for each channel Current limit -- Nominal value is 0.6A per channel. Due to internal *TPS4H160AQPWPRQ1* circuit tolerances the real value can be higher, up to 0.9A. +- 8 high side switches (2x **TPS4H160AQPWPRQ1**), one for each channel Current limit +- Nominal value is 0.6A per channel. Due to internal **TPS4H160AQPWPRQ1** circuit tolerances the real value can be higher, up to 0.9A. - The 12 channels behavior when the current limit is reached can be selected: - **Latch**: when the current limit is reached the channel is shut down and the co-respective channel enable pin must be toggled to activate it again. - **Retry**: when the current limit is reached the channel is shut down and re-connected after a short period of time. If the current limit is reached again the process repeats periodically. - Internal inductive loads kick-back protection plus external 60V, 2A Schottky diode *PMEG6020ER,115* + Internal inductive loads kick-back protection plus external 60V, 2A Schottky diode **PMEG6020ER,115** ### Digital Programmable @@ -170,22 +170,22 @@ The 24V IN pin is not galvanically isolated: the input voltage must be referred The supply voltage can be the same 24V which is powering the board. -- 12 high side switches (3x *TPS4H160AQPWPRQ1*), one for each channel +- 12 high side switches (3x **TPS4H160AQPWPRQ1**), one for each channel Current limit -- Nominal value is 0.6A per channel. Due to internal *TPS4H160AQPWPRQ1* circuit tolerances the real value can be higher, up to 0.9A. +- Nominal value is 0.6A per channel. Due to internal **TPS4H160AQPWPRQ1** circuit tolerances the real value can be higher, up to 0.9A. - The 12 channels behavior when the current limit is reached can be selected: **Latch**: when the current limit is reached the channel is shut down and the co-respective channel enable pin must be toggled to activate it again. **Retry**: when the current limit is reached the channel is shut down and re-connected after a short period of time. If the current limit is reached again the process repeats periodically. -Internal inductive loads kick-back protection plus external 60V, 2A Schottky diode *PMEG6020ER,115* +Internal inductive loads kick-back protection plus external 60V, 2A Schottky diode **PMEG6020ER,115** - 12 digital input channels, each is a 680kΩ and 100kΩ resistor divider: a 0-24V input is scaled down to 0-3V. The digital input channels are independent of the high side switches. - *The digital input channels can read the status of the high side switches if needed.* + **The digital input channels can read the status of the high side switches if needed.** ### Analog Input @@ -559,14 +559,14 @@ This device complies with part 15 of the FCC Rules. Operation is subject to the 3. This equipment should be installed and operated with minimum distance 20cm between the radiator & your body. -*English*: +**English**: User manuals for license-exempt radio apparatus shall contain the following or equivalent notice in a conspicuous location in the user manual or alternatively on the device or both. This device complies with Industry Canada license-exempt RSS standard(s). Operation is subject to the following two conditions: (1) this device may not cause interference (2) this device must accept any interference, including interference that may cause undesired operation of the device. -*French*: +**French**: Le présent appareil est conforme aux CNR d’Industrie Canada applicables aux appareils radio exempts de licence. L’exploitation est autorisée aux deux conditions suivantes : (1) l’ appareil nedoit pas produire de brouillage @@ -575,10 +575,10 @@ Le présent appareil est conforme aux CNR d’Industrie Canada applicables aux a **IC SAR Warning:** -*English*: +**English**: This equipment should be installed and operated with minimum distance 20 cm between the radiator and your body. -*French*: +**French**: Lors de l’ installation et de l’ exploitation de ce dispositif, la distance entre le radiateur et le corps est d ’au moins 20 cm. **Important:** The operating temperature of the EUT can’t exceed 85℃ and shouldn’t be lower than -40℃. diff --git a/content/hardware/04.pro/shields/portenta-cat-m1-nb-iot-gnss-shield/datasheet/datasheet.md b/content/hardware/04.pro/shields/portenta-cat-m1-nb-iot-gnss-shield/datasheet/datasheet.md index 8b03e78e0b..625e7a7bd9 100644 --- a/content/hardware/04.pro/shields/portenta-cat-m1-nb-iot-gnss-shield/datasheet/datasheet.md +++ b/content/hardware/04.pro/shields/portenta-cat-m1-nb-iot-gnss-shield/datasheet/datasheet.md @@ -73,7 +73,7 @@ Manage your MaaS (Mobility as a Service) solution across the city or between bor ### Assembly Overview ![Preview assembly](assets/thalesShieldSolutionOverview_60.png) -*Example of a typical assembly including an Arduino® Portenta H7 and Arduino® Portenta Cat. M1/NB IoT GNSS Shield.* +**Example of a typical assembly including an Arduino® Portenta H7 and Arduino® Portenta Cat. M1/NB IoT GNSS Shield.** ## Ratings ### Recommended Operating Conditions diff --git a/content/hardware/04.pro/shields/portenta-vision-shield/datasheet/datasheet.md b/content/hardware/04.pro/shields/portenta-vision-shield/datasheet/datasheet.md index eb65289dde..7b43d702e3 100644 --- a/content/hardware/04.pro/shields/portenta-vision-shield/datasheet/datasheet.md +++ b/content/hardware/04.pro/shields/portenta-vision-shield/datasheet/datasheet.md @@ -154,7 +154,7 @@ Once connected you will receive a message like the following: ![OpenMV connect window](assets/visionShield_openMV_connect.png) -Click on “OK” and the latest OpenMV firmware will be automatically loaded. To open the “Hello World” example, under the _File_ menu select _Examples _-> _Arduino _->_ Basics _and click on _helloworld.py_. +Click on “OK” and the latest OpenMV firmware will be automatically loaded. To open the “Hello World” example, under the **File** menu select **Examples **-> **Arduino **->_ Basics _and click on **helloworld.py**. ![OpenMV IDE loading "hello world!" example](assets/visionShield_openMV_IDE.png) diff --git a/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/getting-started/getting-started.md b/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/getting-started/getting-started.md index ff2c354fce..ba392ddeda 100644 --- a/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/getting-started/getting-started.md +++ b/content/hardware/05.nicla/boards/nicla-sense-me/tutorials/getting-started/getting-started.md @@ -179,7 +179,7 @@ This are the activities: * 4: "In vehicle activity ended" * 5: "Tilting activity ended" * 6: "In vehicle still ended" -* 7: *blank* +* 7: **blank** * 8: "Still activity started" * 9: "Walking activity started" * 10: "Running activity started" @@ -187,7 +187,7 @@ This are the activities: * 12: "IN vehicle activity started" * 13: "Tilting activity started" * 14: "In vehicle still started" -* 15: *blank* +* 15: **blank** **Syntax example** ```arduino