    001/**
    002 * Copyright (c) 2014 Digi International Inc.,
    003 * All rights not expressly granted are reserved.
    004 *
    005 * This Source Code Form is subject to the terms of the Mozilla Public
    006 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
    007 * You can obtain one at http://mozilla.org/MPL/2.0/.
    008 *
    009 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
    010 * =======================================================================
    011 */
    012package com.digi.xbee.api.packet;
    013
    014/**
    015 * This class stores, computes and verifies the checksum of the API packets.
    016 *
    017 * <p>To test data integrity, a checksum is calculated and verified on
    018 * non-escaped API data.</p>
    019 *
    020 * <p><b>To calculate</b></p>
    021 *
    022 * <p>Not including frame delimiters and length, add all bytes keeping only the
    023 * lowest 8 bits of the result and subtract the result from {@code 0xFF}.</p>
    024 *
    025 * <p><b>To verify</b></p>
    026 *
    027 * <p>Add all bytes (include checksum, but not the delimiter and length). If the
    028 * checksum is correct, the sum will equal {@code 0xFF}.</p>
    029 */
    030public class XBeeChecksum {
    031
    032        // Variables.
    033        private int value = 0;
    034
    035        /**
    036         * Adds the given byte to the checksum.
    037         *
    038         * @param value Byte to add.
    039         */
    040        public void add(int value) {
    041                this.value += value;
    042        }
    043
    044        /**
    045         * Adds the given data to the checksum.
    046         *
    047         * @param data Byte array to add.
    048         */
    049        public void add(byte[] data) {
    050                if (data == null)
    051                        return;
    052                for (int i = 0; i < data.length; i++)
    053                        add(data[i]);
    054        }
    055
    056        /**
    057         * Resets the checksum.
    058         */
    059        public void reset() {
    060                value = 0;
    061        }
    062
    063        /**
    064         * Generates the checksum byte for the API packet.
    065         *
    066         * @return Checksum byte.
    067         */
    068        public int generate() {
    069                value = value & 0xFF;
    070                return 0xFF - value;
    071        }
    072
    073        /**
    074         * Validates the checksum.
    075         *
    076         * @return {@code true} if checksum is valid, {@code false} otherwise.
    077         */
    078        public boolean validate() {
    079                value = value & 0xFF;
    080                return value == 0xFF;
    081        }
    082}