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;