Lab exercise code for FAE Summit 09/2019.

neo_iso_drv.h

Committer:
lru
Date:
2019-09-18
Revision:
58:cf54c181a632

File content as of revision 58:cf54c181a632:

/*
 * Mbed OS device driver for Semtech TS13401 Neo-Iso SSR driver.
 *
 * Copyright (c) 2019 Future Electronics
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef NEO_ISO_DRV_H__
#define NEO_ISO_DRV_H__

#include "mbed.h"

namespace neoiso {

class NeoIso {
public:
    typedef enum {
        COMMAND_NO_OPERATION                            = 0,
        COMMAND_OFF_IMMEDIATE                           = 1,
        COMMAND_OFF_ZERO_CROSSING                       = 2,
        COMMAND_ON_IMMEDIATE                            = 3,
        COMMAND_ON_ZERO_CROSSING                        = 4,
        COMMAND_ON_IMMEDIATE_WITH_DITHERING             = 5,
        COMMAND_ON_ZERO_CROSSING_WITH_DITHERING         = 6,
        COMMAND_HEARTBEAT                               = 7,
        COMMAND_SET_POWER_TRANSFER_MODE                 = 8,
        COMMAND_CANCEL_POWER_TRANSFER_MODE              = 9,
        COMMAND_SET_INRUSH_MODE                         = 10,
        COMMAND_CANCEL_INRUSH_MODE                      = 11,
        COMMAND_START_A_LOAD_CURRENT_MEASURMENT         = 12,
        COMMAND_START_A_SYSTEM_VOLTAGE_MEASURMENT       = 13,
        COMMAND_START_A_SWITCH_TEMPERATURE_MEASURMENT   = 14,
        COMMAND_POOL_STATE                              = 15
    } command_t;

    typedef enum {
        PAGE_COMMAND        = 6,
        PAGE_CONFIGURATION  = 7
    } page_t;


public:
    NeoIso(PinName clk_pin, PinName data_pin, uint8_t address);

    ~NeoIso();

    int send_command(page_t page, command_t command);
    int get_status(uint8_t &status);

    int set_output(bool on);

    NeoIso& operator=(int value)
    {
        set_output(value != 0);
        return *this;
    }

    operator int()
    {
        return _on;
    }

protected:
    void _clear_buffer();
    void _buffer_put_bit(bool bit);
    int _send_buffer();

protected:
    static const size_t RESET_LENGTH = 3;
    static const size_t MAX_COMMAND_LENGTH = 34;

    typedef enum {
        BIT_RESET   = 0,
        BIT_ZERO    = 0xA000,
        BIT_ONE     = 0xAA00,
    } bit_value_t;

    mbed::SPI       _spi;
    uint8_t         _address;
    uint8_t         _on;
    uint32_t        _buffer_index;
    uint16_t        _tx_buffer[MAX_COMMAND_LENGTH];
    uint16_t        _rx_buffer[MAX_COMMAND_LENGTH];
};

}

#endif // NEO_ISO_DRV_H__