Light Show library for organic, calm, light display.

Dependencies:   BLE_API mbed nRF51822

Fork of mbed_blinky by Mbed

main.cpp

Committer:
nargetdev
Date:
2015-10-30
Revision:
18:7c05ef6a639c
Parent:
17:76c74851442f
Child:
19:fabe9521b0a1

File content as of revision 18:7c05ef6a639c:

#include "mbed.h" 
#include "BLE.h"
#include "UARTService.h"
#include <string>

#define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
                               * it will have an impact on code-size and power consumption. */

#if NEED_CONSOLE_OUTPUT
//#define DEBUG(...) { printf(__VA_ARGS__); }
#define DEBUG(STR) { if (uartServicePtr) uartServicePtr->write(STR, strlen(STR)); }
#else
#define DEBUG(...) /* nothing */
#endif /* #if NEED_CONSOLE_OUTPUT */

//#define NRFDK
#define MKIT

#define calibrationTime 2

#define HPI 1.571
#define PI 3.1416
#define HYSTERESIS_QUANTITY  PI/4

#define RWAIT 0
#define GWAIT 0
#define BWAIT 0

UARTService *uartServicePtr;

unsigned long seed = 113;

 typedef unsigned char byte;
 typedef unsigned int uint;
 
#ifdef NRFDK
InterruptIn motion(p20);
PwmOut red(p21);
PwmOut green(p22);
PwmOut blue(p23);
#endif

#ifdef MKIT
PwmOut red(p18);
PwmOut green(p19);
PwmOut blue(p20);
InterruptIn motion(p1);
#endif


Serial pc(USBTX, USBRX); // tx, rx


BLEDevice  ble;

void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
    DEBUG("Disconnected!\n\r");
    DEBUG("Restarting the advertising process\n\r");
    ble.startAdvertising();
}



unsigned int hash(unsigned int x) {
    x = ((x >> 16) ^ x) * 0x45d9f3b;
    x = ((x >> 16) ^ x) * 0x45d9f3b;
    x = ((x >> 16) ^ x);
    seed*=2;
    seed+=17;
    return x%100;
}

void identify(unsigned int m){
    unsigned int hashable;
    float write_me;
    
    hashable = hash(m + seed);
    write_me = hashable/100.0;
    red.write(hashable >= 50);
    char* STR;
    sprintf(STR, "r, g, b: %f\t", write_me);
    DEBUG(STR);

    hashable = hash(m + seed);
    write_me = hashable/100.0;
    green.write(hashable >= 50);
    pc.printf("%f\t", write_me);
    
    hashable = hash(m + seed);
    write_me = hashable/100.0;
    blue.write(hashable >= 50);
    pc.printf("%f\n", write_me);
}
 
 void calibrate(){

  //give the sensor some time to calibrate
  pc.printf("calibrating sensor\n");
    for(int i = 0; i < calibrationTime; i++){
      pc.printf(".");
      identify(calibrationTime);
      wait(.5);
      }
    DEBUG(" done\n");
    DEBUG("SENSOR ACTIVE\n");
    wait(0.05);
}

void show(){
  float in, rout, bout, gout;
  bool tit = true;

  unsigned int rgb = 0x0;
    pc.printf("showing...\n");
    
    float hysteresis = 0;

  for (in = -HPI; in < hysteresis || rgb != 0x7; in = in + 0.00628)
  {
#ifdef MKIT
    bool i = motion;
#else
    bool i = !motion;
#endif
    if (i){
        hysteresis = in + HYSTERESIS_QUANTITY;
        pc.printf("hyst ||");
    }
    tit = !tit;
    if (!(rgb & 0x1))
        rout = sin(in + 2.88*(in + HPI))     + 1.0;
    else
        rout = 0.0f;
    if (!(rgb & 0x2))
        gout = sin(in + 2.61*(in+HPI) )    + 1.0;
    else
        gout = 0.0f;
    if (!(rgb & 0x4))
        bout = sin(in + 3.92*(in+HPI) )   + 1.0;
    else
        bout = 0.0f;
        
    pc.printf("%f\t%f\t%f\n",rout,gout, bout);


    red.write(rout/2.0);
    green.write(gout/2.0);
    blue.write(bout/2.0);
    
    if (in > hysteresis){
        if (rout < 0.01)
            rgb |= 0x1;
        if (gout < 0.01)
            rgb |= 0x2;
        if (bout < 0.01)
            rgb |= 0x4;
    }
    wait(0.0001f);
  }
  pc.printf("\n%X\n", rgb);
}

void channel_check(){
    
    red.write(1.0f);
    wait(.5);
    red.write(0.0f);
    
    green.write(1.0f);
    wait(.5);
    green.write(0.0f);
    
    blue.write(1.0f);
    wait(.5);
    blue.write(0.0f);
}

int main() {
    red.period(0.01f);
    green.period(0.01f);
    blue.period(0.01f);
//
//    ble.init();
//    ble.onDisconnection(disconnectionCallback);
//    
//    uartServicePtr = new UARTService(ble);
//
//    /* setup advertising */
//    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
//    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
//    ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
//                                     (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
//    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
//                                     (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
//
//    ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
//    ble.startAdvertising();
//    
    


    while(1){
#ifdef MKIT
        motion.rise(&show);
#endif
#ifdef NRFDK
        motion.fall(&show);
#endif
//        red.write(0.0f);
//        green.write(0.0f);
//        blue.write(0.0f);
        ble.waitForEvent();
    }
}