00001 /* 00002 * Copyright (c) 2005, Swedish Institute of Computer Science 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the Institute nor the names of its contributors 00014 * may be used to endorse or promote products derived from this software 00015 * without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 00018 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 00021 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00022 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00023 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00024 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00025 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00026 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00027 * SUCH DAMAGE. 00028 * 00029 * This file is part of the Contiki operating system. 00030 * 00031 * @(#)$Id: me.c,v 1.1 2006/06/17 22:41:18 adamdunkels Exp $ 00032 */ 00033 00034 /** \addtogroup me 00035 * @{ */ 00036 00037 /** 00038 * \file 00039 * Implementation of the table-driven Manchester encoding and decoding. 00040 * \author 00041 * Adam Dunkels <adam@sics.se> 00042 */ 00043 00044 #include "me_tabs.h" 00045 00046 /*---------------------------------------------------------------------------*/ 00047 /** 00048 * Manchester encode an 8-bit byte. 00049 * 00050 * This function Manchester encodes an 8-bit byte into a 16-bit 00051 * word. The function me_decode() does the inverse operation. 00052 * 00053 * \param c The byte to be encoded 00054 * 00055 * \retval The encoded word. 00056 */ 00057 /*---------------------------------------------------------------------------*/ 00058 unsigned short 00059 me_encode(unsigned char c) 00060 { 00061 return me_encode_tab[c]; 00062 } 00063 /*---------------------------------------------------------------------------*/ 00064 /** 00065 * Decode a Manchester encoded 16-bit word. 00066 * 00067 * This function decodes a Manchester encoded 16-bit word into a 8-bit 00068 * byte. The function does not check for parity errors in the encoded 00069 * byte. 00070 * 00071 * \param m The 16-bit Manchester encoded word 00072 * \return The decoded 8-bit byte 00073 */ 00074 /*---------------------------------------------------------------------------*/ 00075 unsigned char 00076 me_decode16(unsigned short m) 00077 { 00078 unsigned char m1, m2, c; 00079 00080 m1 = m >> 8; 00081 m2 = m & 0xff; 00082 00083 c = (me_decode_tab[m1] << 4) | 00084 me_decode_tab[m2]; 00085 return c; 00086 } 00087 /*---------------------------------------------------------------------------*/ 00088 /** 00089 * Decode a Manchester encoded 8-bit byte. 00090 * 00091 * This function decodes a Manchester encoded 8-bit byte into 4 00092 * decoded bits.. The function does not check for parity errors in the 00093 * encoded byte. 00094 * 00095 * \param m The 8-bit Manchester encoded byte 00096 * \return The decoded 4 bits 00097 */ 00098 /*---------------------------------------------------------------------------*/ 00099 unsigned char 00100 me_decode8(unsigned char m) 00101 { 00102 return me_decode_tab[m]; 00103 } 00104 /*---------------------------------------------------------------------------*/ 00105 /** 00106 * Check if an encoded byte is valid. 00107 */ 00108 /*---------------------------------------------------------------------------*/ 00109 unsigned char 00110 me_valid(unsigned char m) 00111 { 00112 return me_valid_tab[m]; 00113 } 00114 /*---------------------------------------------------------------------------*/ 00115 00116 /** @} */ 00117