manchester.cpp 2.18 KB
/*
 * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
 *
 * Licensed under GNU General Public License 3.0 or later.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */

#include "manchester.hpp"

uint32_t manchesterEncode16(uint16_t data) {
  uint32_t result = 0xffffffff;
  for (uint8_t i = 0; i < 8; ++i) {
    result <<= 2;
    if (data & 0x80) {
      result |= 1;
    } else {
      result |= 2;
    }
    data <<= 1;
  }
  return result;
}

uint32_t manchesterEncode32(uint16_t data) {
  uint32_t result = 0xffffffff;
  for (uint8_t i = 0; i < 16; ++i) {
    result <<= 2;
    if (data & 0x8000) {
      result |= 1;
    } else {
      result |= 2;
    }
    data <<= 1;
  }
  return result;
}

uint32_t manchesterEncode16Inv(uint16_t data) {
  uint32_t result = 0xffffffff;
  for (uint8_t i = 0; i < 8; ++i) {
    result <<= 2;
    if (data & 0x01) {
      result |= 2;
    } else {
      result |= 1;
    }
    data >>= 1;
  }
  return result;
}

uint32_t manchesterEncode32Inv(uint16_t data) {
  uint32_t result = 0xffffffff;
  for (uint8_t i = 0; i < 16; ++i) {
    result <<= 2;
    if (data & 0x01) {
      result |= 2;
    } else {
      result |= 1;
    }
    data >>= 1;
  }
  return result;
}

uint16_t manchesterDecode32(uint32_t data) {
  uint16_t result = 0x00000000;
  for (uint8_t i = 0; i < 16; i++) {
    uint16_t x = data >> 30;
    switch (x) {
    case 1:
      result <<= 1;
      result |= 1;
      data <<= 2;
      break;

    case 2:
      result <<= 1;
      data <<= 2;
      break;

    default:
      return 0xffff;
    }
  }
  return result;
}

uint16_t manchesterDecode16(uint32_t data) {
  uint16_t result = 0x0000;
  for (uint8_t i = 0; i < 8; i++) {
    uint16_t x = (data & 0xffff) >> 14;
    switch (x) {
    case 1:
      result <<= 1;
      result |= 1;
      data <<= 2;
      break;

    case 2:
      result <<= 1;
      data <<= 2;
      break;

    default:
      return 0xffff;
    }
  }
  return result;
}