NuMaker Brick I2C slave devices

main.cpp

Committer:
shliu1
Date:
2017-10-02
Revision:
7:5b6936f0c99c
Parent:
2:48c6a70d121c
Child:
8:b60e846cae6a

File content as of revision 7:5b6936f0c99c:

/* mbed Microcontroller Library
 * Copyright (c) 2016 ARM Limited
 *
 * 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.
 */

#include "mbed.h"
#include "nubrick.h"
 
#if defined(TARGET_NUMAKER_PFM_NUC472)
I2C i2c(D14, D15);

#elif defined(TARGET_NUMAKER_PFM_M453)
I2C i2c(D14, D15);

#elif defined(TARGET_NUMAKER_PFM_M487)
I2C i2c(D14, D15);   // in M487 D14 is SDA, D15 is SCL
#endif

/** Connect to one NuBrick slave via NuBrick master object
 */
#define NUBRICK_CONNECT(MASTER, NAME)                                   \
    do {                                                                \
        printf("\r\n\r\n");                                             \
        if (! MASTER.connect()) {                                       \
            printf("Connect to NuBrick:\t\t"NAME" failed\r\n\r\n");     \
            return;                                                     \
        }                                                               \
        else {                                                          \
            printf("Connect to NuBrick:\t\t"NAME" OK\r\n\r\n");         \
            MASTER.print_device_desc();                                 \
        }                                                               \
    } while (0);

/** Define NuBrick master objects to communicate with NuBrick slave devices
 */
NuBrickMasterBuzzer master_buzzer(i2c, true);
NuBrickMasterLED master_led(i2c, true);
NuBrickMasterAHRS master_ahrs(i2c, true);
NuBrickMasterSonar master_sonar(i2c, true);
NuBrickMasterTemp master_temp(i2c, true);
NuBrickMasterGas master_gas(i2c, true);
NuBrickMasterIR master_ir(i2c, true);
NuBrickMasterKeys master_keys(i2c, true);

/** Test NuBrick slave devices
 */
void test_nubrick_buzzer(void);
void test_nubrick_led(void);
void test_nubrick_ahrs(void);
void test_nubrick_sonar(void);
void test_nubrick_temp(void);
void test_nubrick_gas(void);
void test_nubrick_ir(void);
void test_nubrick_keys(void);

int main() {
    
    // Test all supported NuBrick slave devices
    test_nubrick_buzzer();
    test_nubrick_led();
    test_nubrick_ahrs();
    test_nubrick_sonar();
    test_nubrick_temp();
    test_nubrick_gas();
    test_nubrick_ir();
    test_nubrick_keys();

    return 0;
}

void test_nubrick_buzzer(void) {
    
    NUBRICK_CONNECT(master_buzzer, "Buzzer");

    // Configure the Buzzer
    master_buzzer.pull_feature_report();
    master_buzzer["feature.sleep_period"].set_value(100);
    master_buzzer["feature.volume"].set_value(60);          // Volume in %
    master_buzzer["feature.tone"].set_value(196);           // Tone in Hz
    master_buzzer["feature.song"].set_value(0);             // 0 (mono), 1 (Bee)
    master_buzzer["feature.period"].set_value(200);         // Period in ms
    master_buzzer["feature.duty"].set_value(30);            // Duty in %
    master_buzzer["feature.latency"].set_value(3);          // Alarm for time secs
    master_buzzer.push_feature_report();
    
    // The NuBrick I2C device may not respond in time. Add delay here.
    wait_ms(50);
    
    // Start sounding the buzzer
    master_buzzer["output.start_flag"].set_value(1);
    master_buzzer["output.stop_flag"].set_value(0);
    master_buzzer.push_output_report();
}

void test_nubrick_led(void) {
    
    NUBRICK_CONNECT(master_led, "LED");
     
    // Configure the LED
    master_led.pull_feature_report();
    master_led["feature.sleep_period"].set_value(100);
    master_led["feature.brightness"].set_value(30);         // Brightness in %
    master_led["feature.color"].set_value(0xF0);            // 0x0F: full blue, 0xF0: full green, 0x0F00: full red
    master_led["feature.blink"].set_value(0);               // Blink method: 0: blink to setting, 1: blink to the song Bee
    master_led["feature.period"].set_value(500);            // Blink period in ms
    master_led["feature.duty"].set_value(30);               // Blink duty in %
    master_led["feature.latency"].set_value(1);             // Blink for time in secs
    master_led.push_feature_report();
    
    // The NuBrick I2C device may not respond in time. Add delay here.
    wait_ms(50);
    
    // Start blinking the LED
    master_led["output.start_flag"].set_value(1);
    master_led["output.stop_flag"].set_value(0);
    master_led.push_output_report();
}

void test_nubrick_ahrs(void) {
    
    NUBRICK_CONNECT(master_ahrs, "AHRS");
    
    master_ahrs.pull_feature_report();    
    // Prescaled vibration alarm threshold
    printf("Prescaled vibration alarm threshold\t\t%d\r\n", master_ahrs["feature.pre_vibration_AT"].get_value());
    
    master_ahrs.pull_input_report();
    // Detected vibration
    printf("Detected vibration\t\t\t\t%d\r\n", master_ahrs["input.vibration"].get_value());
}

void test_nubrick_sonar(void) {
    
    NUBRICK_CONNECT(master_sonar, "Sonar");
    
    master_sonar.pull_feature_report();
    // Distance alarm threshold in cm
    printf("Distance alarm threshold\t\t%d\r\n", master_sonar["feature.distance_AT"].get_value());
    
    master_sonar.pull_input_report();
    // Detected distance in cm
    printf("Detected distance\t\t\t%d\r\n", master_sonar["input.distance"].get_value());
}

void test_nubrick_temp(void) {
    
    NUBRICK_CONNECT(master_temp, "Temperature & Humidity");
    
    master_temp.pull_feature_report();
    // Temp. alarm threshold in Celsius
    printf("Temp. alarm threshold\t\t%d\r\n", master_temp["feature.temp_AT"].get_value());
    // Hum. alarm threshold in %
    printf("Hum. alarm threshold\t\t%d\r\n", master_temp["feature.hum_AT"].get_value());
    
    master_temp.pull_input_report();
    // Detected temp in Celsius
    printf("Detected temp.\t\t\t%d\r\n", master_temp["input.temp"].get_value());
    // Detected hum. in %
    printf("Detected hum.\t\t\t%d\r\n", master_temp["input.hum"].get_value());
}

void test_nubrick_gas(void) {
    
    NUBRICK_CONNECT(master_gas, "Gas");
    
    master_gas.pull_feature_report();
    // Gas alarm threshold in %.
    printf("Gas alarm threshold\t\t%d\r\n", master_gas["feature.gas_AT"].get_value());
    
    master_gas.pull_input_report();
    // Detected gas in %. 80% above for normal.
    printf("Gas\t\t\t\t%d\r\n", master_gas["input.gas"].get_value());
}

void test_nubrick_ir(void) {
    
    NUBRICK_CONNECT(master_ir, "IR");
    
    master_ir.pull_feature_report();
    printf("Number of learned data\t\t%d\r\n", master_ir["feature.num_learned_data"].get_value());
    printf("Using data type\t\t\t%d\r\n", master_ir["feature.using_data_type"].get_value());
    printf("Index of original data to send\t%d\r\n", master_ir["feature.index_orig_data_to_send"].get_value());
    printf("Index of learned data to send\t%d\r\n", master_ir["feature.index_learned_data_to_send"].get_value());
    
    master_ir.pull_input_report();
    printf("Has received data flag\t\t%d\r\n", master_ir["input.received_data_flag"].get_value());
}

void test_nubrick_keys(void) {
    
    NUBRICK_CONNECT(master_keys, "Key");
    
    // Detect 8 keys
    master_keys.pull_input_report();
    uint16_t key_state = master_keys["input.key_state"].get_value();
    unsigned i = 0;
    for (i = 0; i < 8; i ++) {
        if (key_state & (1 << i)) {
            printf("KEY%d PRESSED\r\n", i + 1);
        }
        else {
           printf("KEY%d RELEASED\r\n", i + 1);
        }
    }
}