Library to manage Inovafitness SDS021 particles sensor

Dependents:   LoRaWAN-demo-72-bootcamp SDS021Test

Sds021.h

Committer:
abouillot
Date:
2017-01-30
Revision:
3:fd34f67797d9
Parent:
2:49822e10d111

File content as of revision 3:fd34f67797d9:

/*!
 * Sds021.cpp
 *
 * Control the inovafitness particles sensor SDS021
 *
 * Copyright (c) 2017 -  Alexandre Bouillot github.com/abouillot
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documnetation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to  whom the Software is
 * furished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
 
#ifndef __SDS021_H__
#define __SDS021_H__

#include "mbed.h"
#include "BufferedSerial.h"


class SDS021
{
public:
/* public structures and constants */
    typedef struct version {
        char year;
        char month;
        char day;
    } version_t;
    
public:

    SDS021(PinName tx, PinName rx) : _sds021(tx, rx), _PM2_5(0), _PM10(0), _mode(false), _state(true), _interval(0),  _id(0xffff) {
        _firmware.year = 0;
    }
    bool update();
    int getId() {
        return _id;
    };
    void setId(int new_id);
    bool getPassiveMode() {
        return _mode;
    };
    void setPassiveMode(bool passive);
    void readData();
    uint8_t getInterval() {
        return _interval;
    };
    void setInterval(uint8_t minutes);
    bool getAwake() {
        return _state;
    };
    void setAwake(bool working);
    version_t getVersion();

    float PM2_5() {
        return _PM2_5;
    };
    float PM10() {
        return _PM10;
    };
    bool mode() {
        return _mode;
    };
    bool state() {
        return _state;
    };
    char interval() {
        return _interval;
    };
    version_t firmware() {
        return _firmware;
    };
    int id() {
        return _id;
    };

private:
/* constants and structures types */
    static const int kOutputLength = 19;
    static const int kInputLength = 10;

    static const char head = 0xaa;
    static const char tail = 0xab;

// commands
    enum command_t {
        commandCmd = 0xB4,
        dataCmd = 0xC0,
        replyCmd = 0xC5
    };

// actions
    enum action_t {
        modeAct = 0x2,
        queryAct = 0x4,
        idAct = 0x5,
        stateAct = 0x6,
        versionAct = 0x7,
        intervalAct = 0x8
    };

private:
/* lacal variables */
    char outMessage[kOutputLength];
    char inMessage[kInputLength];

    char* prepareMessage(SDS021::action_t action, bool set = 0, int address = 0xFFFF, int value = 0);
    char calcCheckSum(char* buffer, int start_idx, int stop_idx);
    bool checkSum(char* buffer, int start_idx = 2, int stop_idx = 8);
    void writeMessage(char* buffer);

    BufferedSerial _sds021;
    float _PM2_5;
    float _PM10;
    bool _mode;
    bool _state;
    char _interval;
    version_t _firmware;
    int _id;
};

#endif  // __SDS021_H__