diff --git a/src/core/operations/ManchesterDecode.mjs b/src/core/operations/ManchesterDecode.mjs
new file mode 100644
index 00000000..d71bfd53
--- /dev/null
+++ b/src/core/operations/ManchesterDecode.mjs
@@ -0,0 +1,68 @@
+/**
+ * @author mt3571 [mt3571@protonmail.com]
+ * @copyright Crown Copyright 2020
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+
+/**
+ * Manchester decoding operation
+ */
+class ManchesterDecode extends Operation {
+
+ /**
+ * ManchesterDecode constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "Manchester Decode";
+ this.module = "Encodings";
+ this.description = "Decodes data that has been encoded using the Manchester Encoding (also known as phase encoding). A 01
is converted to 1
and a 10
is converted to 0
.
As every bit is encoded into two bits when using this encoding, inputs must be a multiple of 2 long.";
+ this.infoURL = "https://en.wikipedia.org/wiki/Manchester_code";
+ this.inputType = "string";
+ this.outputType = "string";
+ this.args = [];
+ this.checks = [
+ {
+ pattern: "(01|10)*",
+ flags: "",
+ args: []
+ }
+ ];
+ }
+
+ /**
+ * @param {string} input
+ * @param {Object[]} args
+ * @returns {string}
+ */
+ run(input, args) {
+ const decoding = [];
+
+ if (input.length % 2 != 0){
+ throw new OperationError(`Length of an input should be a multiple of 2, the input is ${input.length} long.`);
+ }
+
+ for (let i = 0; i < input.length; i +=2){
+ const bit1 = input[i];
+ const bit2 = input[i+1];
+
+ if (bit1 == 1 && bit2 == 0){
+ decoding.push(0);
+ } else if (bit1 == 0 && bit2 == 1){
+ decoding.push(1);
+ } else {
+ throw new OperationError(`Invalid input.`);
+ }
+
+ }
+ const output = decoding.join("");
+ return output;
+ }
+
+}
+
+export default ManchesterDecode;
diff --git a/src/core/operations/ManchesterEncode.mjs b/src/core/operations/ManchesterEncode.mjs
new file mode 100644
index 00000000..765694f9
--- /dev/null
+++ b/src/core/operations/ManchesterEncode.mjs
@@ -0,0 +1,58 @@
+/**
+ * @author mt3571 [mt3571@protonmail.com]
+ * @copyright Crown Copyright 2020
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import OperationError from "../errors/OperationError.mjs";
+
+/**
+ * Manchester encoding operation
+ */
+class ManchesterEncode extends Operation {
+
+ /**
+ * ManchesterEncode constructor
+ */
+ constructor() {
+ super();
+
+ this.name = "Manchester Encode";
+ this.module = "Encodings";
+ this.description = "Performs the Manchester encoding on the data (also known as phase encoding). A 1
is converted to 01
and a 0
is converted to 10
. ";
+ this.infoURL = "https://en.wikipedia.org/wiki/Manchester_code";
+ this.inputType = "string";
+ this.outputType = "string";
+ this.args = [];
+ }
+
+ /**
+ * @param {string} input
+ * @param {Object[]} args
+ * @returns {string}
+ */
+ run(input, args) {
+ const encoding = [];
+
+ for (let i = 0; i < input.length; i ++){
+ const bit = input[i];
+
+ if (bit == 0){
+ encoding.push(1);
+ encoding.push(0);
+ } else if (bit == 1){
+ encoding.push(0);
+ encoding.push(1);
+ } else {
+ throw new OperationError(`Invalid input character ${bit}. Input should be in binary.`);
+ }
+
+ }
+ const output = encoding.join("");
+ return output;
+ }
+
+}
+
+export default ManchesterEncode;