Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface Milkcocoa_EthernetIF mbed-rtos mbed
Revision 9:561182aac695, committed 2017-10-31
- Comitter:
- jksoft
- Date:
- Tue Oct 31 09:26:44 2017 +0000
- Parent:
- 8:25a9bc3ca875
- Commit message:
- ??
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ConfigFile/ConfigFile.cpp Tue Oct 31 09:26:44 2017 +0000
@@ -0,0 +1,415 @@
+/**
+ * Configuration file interface class (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+#include "ConfigFile.h"
+
+#define NEWLINE_UNIX "\n"
+#define NEWLINE_DOS "\r\n"
+#define NEWLINE_MAC "\r"
+
+/**
+ * Create a configuration file class.
+ */
+ConfigFile::ConfigFile() {
+ /*
+ * Allocation for a config_t list.
+ */
+ configlist = (config_t **)malloc(sizeof(config_t *) * MAXCONFIG);
+ for (int i = 0; i < MAXCONFIG; i++) {
+ configlist[i] = NULL;
+ }
+}
+
+/**
+ * Destroy a configuration file class.
+ */
+ConfigFile::~ConfigFile() {
+ /*
+ * Remove all storage and the contents.
+ */
+ for (int i = 0; i < MAXCONFIG; i++) {
+ config_t *cfg = configlist[i];
+ if (cfg != NULL) {
+ free(cfg->key);
+ free(cfg->value);
+ free(cfg);
+ }
+ configlist[i] = NULL;
+ }
+
+ /*
+ * Remove cnofig_t list.
+ */
+ free(configlist);
+ configlist = NULL;
+}
+
+/**
+ * Get a value for a key.
+ *
+ * @param key A target key name.
+ * @param value A pointer to a value storage.
+ * @param siz A size of a value storage.
+ * @return A value or NULL.
+ */
+bool ConfigFile::getValue(char *key, char *value, size_t siz) {
+ /*
+ * Null check.
+ */
+ if (key == NULL) {
+ return false;
+ }
+
+ /*
+ * Search a config_t object from the key.
+ */
+ config_t *p = search(key);
+ if (p == NULL) {
+ return false;
+ }
+
+ /*
+ * Check the storage size.
+ */
+ if (siz <= strlen(p->value)) {
+ return false;
+ }
+
+ /*
+ * Copy the value to the storage.
+ */
+ strcpy(value, p->value);
+ return true;
+}
+
+/**
+ * Set a set of a key and value.
+ *
+ * @param key A key.
+ * @param value A value.
+ *
+ * @return True if it succeed.
+ */
+bool ConfigFile::setValue(char *key, char *value) {
+ /*
+ * Null check.
+ */
+ if ((key == NULL) || (value == NULL)) {
+ return false;
+ }
+
+ /*
+ * Size check.
+ */
+ if ((MAXLEN_KEY < strlen(key)) || (MAXLEN_VALUE < strlen(value))) {
+ return false;
+ }
+
+ /*
+ * Search a config_t object from the key.
+ */
+ config_t *p = search(key);
+ if (p == NULL) {
+ /*
+ * Allocation a memory for a new key.
+ */
+ char *k = (char *)malloc(sizeof(char) * (strlen(key) + 1));
+ if (k == NULL) {
+ return false;
+ }
+ strcpy(k, key);
+
+ /*
+ * Allocation a memory for a new value.
+ */
+ char *v = (char *)malloc(sizeof(char) * (strlen(value) + 1));
+ if (v == NULL) {
+ free(k);
+ return false;
+ }
+ strcpy(v, value);
+
+ /*
+ * Allocation a memory for a new configuration.
+ */
+ config_t *cfg = (config_t *)malloc(sizeof(config_t) * 1);
+ if (cfg == NULL) {
+ free(k);
+ free(v);
+ return false;
+ }
+ cfg->key = k;
+ cfg->value = v;
+
+ /*
+ * Add the new configuration.
+ */
+ if (!add(cfg)) {
+ free(k);
+ free(v);
+ free(cfg);
+ return false;
+ }
+
+ return true;
+ } else {
+ /*
+ * The value is same.
+ */
+ if (strcmp(value, p->value) == 0) {
+ return true;
+ }
+
+ /*
+ * Free a memory for the value.
+ */
+ free(p->value);
+ p->value = NULL;
+
+ /*
+ * Allocation memory for the new value.
+ */
+ char *v = (char *)malloc(sizeof(char) * (strlen(value) + 1));
+ if (v == NULL) {
+ return false;
+ }
+
+ /*
+ * Store it.
+ */
+ strcpy(v, value);
+ p->value = v;
+
+ return true;
+ }
+}
+
+/**
+ * Remove a config.
+ *
+ * @param key A key.
+ *
+ * @return True if it succeed.
+ */
+bool ConfigFile::remove(char *key) {
+ if (key == NULL) {
+ return false;
+ }
+ for (int i = 0; i < MAXCONFIG; i++) {
+ config_t *cfg = configlist[i];
+ if (cfg != NULL) {
+ if (strcmp(cfg->key, key) == 0) {
+ free(cfg->key);
+ free(cfg->value);
+ free(cfg);
+ configlist[i] = NULL;
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * Remove all config.
+ *
+ * @return True if it succeed.
+ */
+bool ConfigFile::removeAll(void) {
+ for (int i = 0; i < MAXCONFIG; i++) {
+ config_t *p = configlist[i];
+ if (p != NULL) {
+ free(p->key);
+ free(p->value);
+ }
+ free(p);
+ configlist[i] = NULL;
+ }
+ return true;
+}
+
+/**
+ * Get a number of configuration sets.
+ *
+ * @return number of configuration sets.
+ */
+int ConfigFile::getCount() {
+ int cnt = 0;
+ for (int i = 0; i < MAXCONFIG; i++) {
+ config_t *p = configlist[i];
+ if (p != NULL) {
+ cnt++;
+ }
+ }
+ return cnt;
+}
+
+/**
+ * Get a key and a value.
+ *
+ * @param index Index number of this list.
+ * @param key A pointer to a buffer for key.
+ * @param keybufsiz A size of the key buffer.
+ * @param value A pointer to a buffer for value.
+ * @param valuebufsiz A size of the value buffer.
+ *
+ * @return true if it succeed.
+ */
+bool ConfigFile::getKeyAndValue(int index, char *key, size_t keybufsiz, char *value, size_t valuebufsiz) {
+ int cnt = 0;
+ for (int i = 0; i < MAXCONFIG; i++) {
+ config_t *p = configlist[i];
+ if (p != NULL) {
+ if (cnt == index) {
+ if ((strlen(p->key) < keybufsiz) && (strlen(p->value) < valuebufsiz)) {
+ strcpy(key, p->key);
+ strcpy(value, p->value);
+ return true;
+ }
+ return false;
+ }
+ cnt++;
+ }
+ }
+ return false;
+}
+
+/**
+ * Read from the target file.
+ *
+ * @param file A target file name.
+ */
+bool ConfigFile::read(char *file) {
+ /*
+ * Open the target file.
+ */
+ FILE *fp = fopen(file, "r");
+ if (fp == NULL) {
+ return false;
+ }
+
+ /*
+ * Remove all configuration.
+ */
+ removeAll();
+
+ /*
+ * Read from a file.
+ */
+ char buf[MAXLEN_KEY + 8 + MAXLEN_VALUE];
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ /*
+ * Ignore a comment.
+ */
+ if (buf[0] == '#') {
+ continue;
+ }
+
+ /*
+ * Trim a return.
+ */
+ const size_t len = strlen(buf);
+ for (int i = 0; i < len; i++) {
+ if ((buf[i] == '\r') || (buf[i] == '\n')) {
+ buf[i] = '\0';
+ }
+ }
+
+ /*
+ * Separate key and value.
+ */
+ char k[MAXLEN_KEY];
+ char v[MAXLEN_VALUE];
+ char *sp = strchr(buf, SEPARATOR);
+ if (sp != NULL) {
+ strcpy(v, sp + 1);
+ *sp = '\0';
+ strcpy(k, buf);
+ setValue(k, v);
+ }
+ }
+ fclose(fp);
+ return true;
+}
+
+/**
+ * Write from the target file.
+ *
+ * @param file A pointer to a file name.
+ * @param header A pointer to a header.
+ * @param ff File format.
+ */
+bool ConfigFile::write(char *file, char *header, FileFormat ff) {
+ /*
+ * Open the target file.
+ */
+ FILE *fp = fopen(file, "w");
+ if (fp == NULL) {
+ return false;
+ }
+
+ /*
+ * Set a type of new line.
+ */
+ char *newline = NEWLINE_UNIX;
+ switch (ff) {
+ case UNIX:
+ newline = NEWLINE_UNIX;
+ break;
+ case MAC:
+ newline = NEWLINE_MAC;
+ break;
+ case DOS:
+ newline = NEWLINE_DOS;
+ break;
+ default:
+ newline = NEWLINE_UNIX;
+ break;
+ }
+
+ /*
+ * Write the header.
+ */
+ if (header != NULL) {
+ fprintf(fp, "%s%s", header, newline);
+ }
+
+ /*
+ * Write the data.
+ */
+ for (int i = 0; i < MAXCONFIG; i++) {
+ config_t *cfg = configlist[i];
+ if (cfg != NULL) {
+ fprintf(fp, "%s=%s%s", cfg->key, cfg->value, newline);
+ }
+ }
+ fclose(fp);
+ return true;
+}
+
+ConfigFile::config_t *ConfigFile::search(char *key) {
+ if (key == NULL) {
+ return NULL;
+ }
+ for (int i = 0; i < MAXCONFIG; i++) {
+ if (configlist[i] != NULL) {
+ if (strcmp(configlist[i]->key, key) == 0) {
+ return configlist[i];
+ }
+ }
+ }
+ return NULL;
+}
+
+bool ConfigFile::add(config_t *cfg) {
+ for (int i = 0; i < MAXCONFIG; i++) {
+ if (configlist[i] == NULL) {
+ configlist[i] = cfg;
+ return true;
+ }
+ }
+ return false;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ConfigFile/ConfigFile.h Tue Oct 31 09:26:44 2017 +0000
@@ -0,0 +1,121 @@
+/**
+ * Configuration file interface class (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+#include "mbed.h"
+
+#ifndef _CONFIG_FILE_H_
+#define _CONFIG_FILE_H_
+
+/**
+ * Configuration File class.
+ */
+class ConfigFile {
+public:
+
+ /**
+ * Create a configuration file class.
+ */
+ ConfigFile();
+
+ /**
+ * Destroy a configuration file class.
+ */
+ ~ConfigFile();
+
+ /**
+ * Get a value for a key.
+ *
+ * @param key A target key name.
+ * @param value A pointer to a value storage.
+ * @param siz A size of a value storage.
+ * @return A value or NULL.
+ */
+ bool getValue(char *key, char *value, size_t siz);
+
+ /**
+ * Set a set of a key and value.
+ *
+ * @param key A key.
+ * @param value A value.
+ *
+ * @return True if it succeed.
+ */
+ bool setValue(char *key, char *value);
+
+ /**
+ * Remove a config.
+ *
+ * @param key A key.
+ *
+ * @return True if it succeed.
+ */
+ bool remove(char *key);
+
+ /**
+ * Remove all config.
+ *
+ * @return True if it succeed.
+ */
+ bool removeAll(void);
+
+ /**
+ * Get a number of configuration sets.
+ *
+ * @return number of configuration sets.
+ */
+ int getCount();
+
+ /**
+ * Get a key and a value.
+ *
+ * @param index Index number of this list.
+ * @param key A pointer to a buffer for key.
+ * @param keybufsiz A size of the key buffer.
+ * @param value A pointer to a buffer for value.
+ * @param valuebufsiz A size of the value buffer.
+ *
+ * @return true if it succeed.
+ */
+ bool getKeyAndValue(int index, char *key, size_t keybufsiz, char *value, size_t valuebufsiz);
+
+ /**
+ * Read from the target file.
+ *
+ * @param file A target file name.
+ */
+ bool read(char *file);
+
+ typedef enum {
+ UNIX,
+ MAC,
+ DOS
+ } FileFormat;
+
+ /**
+ * Write from the target file.
+ *
+ * @param file A pointer to a file name.
+ * @param header A pointer to a header.
+ * @param ff File format.
+ */
+ bool write(char *file, char *header = NULL, FileFormat ff = UNIX);
+
+private:
+ typedef struct {
+ char *key;
+ char *value;
+ } config_t;
+ config_t **configlist;
+ static const int MAXCONFIG = 64;
+ static const int MAXLEN_KEY = 64;
+ static const int MAXLEN_VALUE = 128;
+ static const char SEPARATOR = '=';
+
+ config_t *search(char *key);
+ bool add(config_t *cfg);
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LEDStrip.h Tue Oct 31 09:26:44 2017 +0000 @@ -0,0 +1,5 @@ + +void tape_write (int d); +void tapeInit (int speed, int n); +void tapeSet (int n, int dat); +void tapeSend ();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LEDStrip_WS2812.cpp Tue Oct 31 09:26:44 2017 +0000
@@ -0,0 +1,122 @@
+/*
+ * WS2812 tape led IC
+ *
+ * 0.35us 0.8us (+-150ns)
+ * 0: |^^^^^|__________|
+ *
+ * 0.7us 0.6us (+-150ns)
+ * 1: |^^^^^^^^^^|_____|
+ *
+ * >50us
+ * RESET: |________________|
+ */
+#include "mbed.h"
+#include "LEDStrip.h"
+
+SPI tape(p11, p12, p13);
+
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+ LPC_SSP_TypeDef *_ssp = LPC_SSP0;
+#elif defined(TARGET_LPC11U24)
+ LPC_SSPx_Type *_ssp = LPC_SSP1;
+#endif
+
+int num = 100;
+int *data;
+volatile int busy = 0, wakeup = 0;
+
+
+extern "C"
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+void SSP0_IRQHandler() {
+#elif defined(TARGET_LPC11U24)
+void SSP1_IRQHandler() {
+#endif
+ static int addr = 0, bit = 0x800000;
+repeat:
+ if (busy) {
+ // led data
+ while (_ssp->SR & (1<<1)) { // TNF
+ if (data[addr] & bit) {
+ // 1
+ _ssp->DR = 0x01f;
+ } else {
+ // 0
+ _ssp->DR = 0x07f;
+ }
+ bit = bit >> 1;
+ if (bit == 0) {
+ bit = 0x800000;
+ addr ++;
+ if (addr >= num) {
+ addr = 0;
+ busy = 0;
+ goto repeat;
+ }
+ }
+ }
+ } else {
+ // blank
+ while (_ssp->SR & (1<<1)) { // TNF
+ _ssp->DR = 0xfff;
+ if (addr < 50) {
+ addr ++;
+ } else {
+ addr = 0;
+ if (wakeup) {
+ busy = 1;
+ wakeup = 0;
+ goto repeat;
+ }
+ }
+ }
+ }
+}
+
+void tapeInit (int freq, int n) {
+
+ num = n;
+// data = new int(num);
+ data = (int*)malloc(sizeof(int) * num);
+ for (int i = 0; i < num; i ++) {
+ data[i] = 0;
+ }
+
+ tape.format(10, 1);
+ if (freq) {
+ tape.frequency(freq * 1000);
+ } else {
+ tape.frequency(8000000);
+ }
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
+ NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler);
+ NVIC_SetPriority(SSP0_IRQn, 0);
+ NVIC_EnableIRQ(SSP0_IRQn);
+#elif defined(TARGET_LPC11U24)
+ NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler);
+ NVIC_SetPriority(SSP1_IRQn, 0);
+ NVIC_EnableIRQ(SSP1_IRQn);
+#endif
+ _ssp->IMSC |= (1<<3); // TXIM
+}
+
+void tapeSet (int n, int dat) {
+ n+=2;
+ if (n >= 0 && n < num) {
+ // RGB -> GRB
+ data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff);
+ }
+}
+
+void tapeSend () {
+ if (busy) {
+ while (busy);
+ wait_us(50);
+ }
+ wakeup = 1;
+ while (wakeup);
+}
+
+int tapeGet (int n) {
+ return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff);
+}
--- a/Milkcocoa.lib Mon Jun 06 03:40:05 2016 +0000 +++ b/Milkcocoa.lib Tue Oct 31 09:26:44 2017 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/users/jksoft/code/Milkcocoa_EthernetIF/#7b9d1fed76fe +https://developer.mbed.org/users/jksoft/code/Milkcocoa_EthernetIF/#bf455cd5059f
--- a/main.cpp Mon Jun 06 03:40:05 2016 +0000
+++ b/main.cpp Tue Oct 31 09:26:44 2017 +0000
@@ -1,61 +1,618 @@
#include "mbed.h"
+#include "LEDStrip.h"
+#include "ConfigFile.h"
#include "MQTTEthernet.h"
#include "MQTTClient.h"
#include "Milkcocoa.h"
#include "MClient.h"
-// The default setting is for the Simple IoT Board(mbed LPC1114FN28)
-// Please change to fit the platform
-Serial pc(USBTX, USBRX);
-DigitalOut myled(LED1);
+#define LED_NUM 60
+#define LED_DATA_NUM 3
+#define PI 3.14159265359f
+#define MAX_COUNT 60
+#define STAR_LINE_MAX 60
+
+#if 0
+#define DBG(x) x
+#else
+#define DBG(x)
+#endif
/************************* Your Milkcocoa Setup *********************************/
-#define MILKCOCOA_APP_ID "...YOUR_MILKCOCOA_APP_ID..."
-#define MILKCOCOA_DATASTORE "mbed"
-
+#define MILKCOCOA_APP_ID "juicej2vchzis"
+#define MILKCOCOA_DATASTORE "halloween"
+
/************* Milkcocoa Setup (you don't need to change this!) ******************/
-
+
#define MILKCOCOA_SERVERPORT 1883
/************ Global State (you don't need to change this!) ******************/
-
+
const char MQTT_SERVER[] = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] = __TIME__ MILKCOCOA_APP_ID;
-
+
extern void onpush(MQTT::MessageData& md);
+Serial pc(USBTX, USBRX);
+LocalFileSystem local("local");
+Ticker flipper;
+ConfigFile cfg;
+DigitalIn SW1(p25);
+DigitalIn SW2(p26);
+DigitalOut stat_led1(LED1);
+DigitalOut stat_led2(LED2);
+DigitalOut stat_led3(LED3);
+DigitalOut stat_led4(LED4);
+
+
+
+void flip();
+
+bool completed = false;
+int t_timer = 0;
+int like_count = 0;
+int max_count = 0;
+int demo_count = 0;
+
+const unsigned char _RED[3] = { 0xFF, 0 , 0 };
+const unsigned char _GREEN[3] = { 0 , 0xFF, 0 };
+const unsigned char _BLUE[3] = { 0 , 0 , 0xFF };
+const unsigned char _YELLOW[3] = { 0xFF, 0xFF, 0 };
+const unsigned char _PURPLE[3] = { 0xFF, 0 , 0xFF };
+const unsigned char _AQUA[3] = { 0 , 0xFF, 0xFF };
+const unsigned char _WHITE[3] = { 0xFF, 0xFF, 0xFF };
+const unsigned char _GLAY[3] = { 0x80, 0x80, 0x80 };
+const unsigned char _DARK_GLAY[3] = { 0x2, 0x2, 0x2 };
+const unsigned char _OFF[3] = { 0, 0, 0 };
+
+unsigned char led_data[60][3];
+
+unsigned char base_led_data[60][3];
+
+unsigned char star_line[STAR_LINE_MAX] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10,11,12,13,14,15,16,17,18,19,
+ 20,21,22,23,24,25,26,27,28,29,
+ 30,31,32,33,34,35,36,37,38,39,
+ 40,41,42,43,44,45,46,47,48,49,
+ 50,51,52,53,54,55,56,57,58,59
+};
+
+unsigned char color_line[STAR_LINE_MAX][3] =
+{
+ { 0xFF, 0x00, 0x00 },{ 0xFF, 0x80, 0x00 },{ 0xFF, 0xFF, 0x00 },{ 0x80, 0xFF, 0x00 },
+ { 0x00, 0xFF, 0x00 },{ 0x00, 0xFF, 0x80 },{ 0x00, 0xFF, 0xFF },{ 0x00, 0x80, 0xFF },
+ { 0x00, 0x00, 0xFF },{ 0x80, 0x00, 0xFF },{ 0xFF, 0x00, 0xFF },{ 0xFF, 0x00, 0x80 },
+ { 0xFF, 0x00, 0x00 },{ 0xFF, 0x80, 0x00 },{ 0xFF, 0xFF, 0x00 },{ 0x80, 0xFF, 0x00 },
+ { 0x00, 0xFF, 0x00 },{ 0x00, 0xFF, 0x80 },{ 0x00, 0xFF, 0xFF },{ 0x00, 0x80, 0xFF },
+ { 0x00, 0x00, 0xFF },{ 0x80, 0x00, 0xFF },{ 0xFF, 0x00, 0xFF },{ 0xFF, 0x00, 0x80 },
+ { 0xFF, 0x00, 0x00 },{ 0xFF, 0x80, 0x00 },{ 0xFF, 0xFF, 0x00 },{ 0x80, 0xFF, 0x00 },
+ { 0x00, 0xFF, 0x00 },{ 0x00, 0xFF, 0x80 },{ 0x00, 0xFF, 0xFF },{ 0x00, 0x80, 0xFF },
+ { 0x00, 0x00, 0xFF },{ 0x80, 0x00, 0xFF },{ 0xFF, 0x00, 0xFF },{ 0xFF, 0x00, 0x80 },
+ { 0xFF, 0x00, 0x00 },{ 0xFF, 0x80, 0x00 },{ 0xFF, 0xFF, 0x00 },{ 0x80, 0xFF, 0x00 },
+ { 0x00, 0xFF, 0x00 },{ 0x00, 0xFF, 0x80 },{ 0x00, 0xFF, 0xFF },{ 0x00, 0x80, 0xFF },
+ { 0x00, 0x00, 0xFF },{ 0x80, 0x00, 0xFF },{ 0xFF, 0x00, 0xFF },{ 0xFF, 0x00, 0x80 },
+ { 0xFF, 0x00, 0x00 },{ 0xFF, 0x80, 0x00 },{ 0xFF, 0xFF, 0x00 },{ 0x80, 0xFF, 0x00 },
+ { 0x00, 0xFF, 0x00 },{ 0x00, 0xFF, 0x80 },{ 0x00, 0xFF, 0xFF },{ 0x00, 0x80, 0xFF },
+ { 0x00, 0x00, 0xFF },{ 0x80, 0x00, 0xFF },{ 0xFF, 0x00, 0xFF },{ 0xFF, 0x00, 0x80 }
+
+};
+
+extern void send_led();
+
+int DownLight(unsigned char *dat,int value)
+{
+ for(int i=0;i<LED_DATA_NUM;i++)
+ {
+ if( dat[i] > value )
+ {
+ dat[i] = dat[i] - value;
+ }
+ }
+ return(0);
+}
+
+int near(unsigned char *from_dat,const unsigned char *to_dat,int wide)
+{
+ int ret_code_l = 1;
+
+ for( int i=0;i<LED_DATA_NUM;i++)
+ {
+ if( from_dat[i] < to_dat[i] )
+ {
+ if( (from_dat[i]+wide) < to_dat[i] )
+ {
+ from_dat[i] = from_dat[i] + wide;
+ ret_code_l = 0;
+ }
+ else
+ {
+ from_dat[i] = to_dat[i];
+
+ }
+ }
+ else if( from_dat[i] > to_dat[i] )
+ {
+ if( (from_dat[i]-wide) > to_dat[i])
+ {
+ from_dat[i] -= wide;
+ ret_code_l = 0;
+ }
+ else
+ {
+ from_dat[i] = to_dat[i];
+ }
+ }
+ }
+
+ return(ret_code_l);
+}
+
+int flow_star(int from,int to,const unsigned char *dat,const unsigned char *base_dat,int speed)
+{
+ int i,j;
+
+ if( from < to )
+ {
+ for(i=from;i<to;i++)
+ {
+ memcpy( led_data[star_line[i]] , base_dat , 3 );
+ }
+
+ send_led();
+ wait_ms(speed);
+
+ for(i=from;i<to;i++)
+ {
+ for(j=from;j<to;j++)
+ {
+ if(j==i)
+ {
+ memcpy( led_data[star_line[j]] , dat , 3 );
+ }
+ else
+ {
+ near( led_data[star_line[j]] , base_dat , 5 );
+ }
+ }
+ send_led();
+ wait_ms(speed);
+
+ }
+
+ i = 0;
+ j = 1;
+ while(i!=(abs(from-to)))
+ {
+ i = 0;
+ for(j=from;j<to;j++)
+ {
+ i += near( led_data[star_line[j]] , base_dat , 10 );
+ }
+ send_led();
+ wait_ms(speed);
+ }
+ }
+ else
+ {
+ for(i=from;i>to;i--)
+ {
+ memcpy( led_data[star_line[i]] , base_dat , 3 );
+ }
+
+ send_led();
+ wait_ms(speed);
+
+ for(i=from;i>to;i--)
+ {
+ for(j=from;j>to;j--)
+ {
+ if(j==i)
+ {
+ memcpy( led_data[star_line[j]] , dat , 3 );
+ }
+ else
+ {
+ near( led_data[star_line[j]] , base_dat , 5 );
+ }
+ }
+ send_led();
+ wait_ms(speed);
+ }
+
+ i = 0;
+ j = 1;
+ while(i!=(abs(from-to)))
+ {
+ i = 0;
+ for(j=from;j>to;j--)
+ {
+ i += near( led_data[star_line[j]] , base_dat , 5 );
+ }
+ send_led();
+ wait_ms(speed);
+ }
+ }
+
+ return(0);
+}
+
+int flow_star(int from,int to,const unsigned char *dat,int speed)
+{
+ int i,j;
+
+ if( from < to )
+ {
+ for(i=from;i<to;i++)
+ {
+ memcpy( led_data[star_line[i]] , base_led_data[star_line[i]] , 3 );
+ }
+
+ send_led();
+ wait_ms(speed);
+
+ for(i=from;i<to;i++)
+ {
+ for(j=from;j<to;j++)
+ {
+ if(j==i)
+ {
+ memcpy( led_data[star_line[j]] , dat , 3 );
+ }
+ else
+ {
+ near( led_data[star_line[j]] , base_led_data[star_line[j]] , 5 );
+ }
+ }
+ send_led();
+ wait_ms(speed);
+
+ }
+
+ i = 0;
+ j = 1;
+ while(i!=(abs(from-to)))
+ {
+ i = 0;
+ for(j=from;j<to;j++)
+ {
+ i += near( led_data[star_line[j]] , base_led_data[star_line[j]] , 10 );
+ }
+ send_led();
+ wait_ms(speed);
+ }
+ }
+ else
+ {
+ for(i=from;i>to;i--)
+ {
+ memcpy( led_data[star_line[i]] , base_led_data[star_line[i]] , 3 );
+ }
+
+ send_led();
+ wait_ms(speed);
+
+ for(i=from;i>to;i--)
+ {
+ for(j=from;j>to;j--)
+ {
+ if(j==i)
+ {
+ memcpy( led_data[star_line[j]] , dat , 3 );
+ }
+ else
+ {
+ near( led_data[star_line[j]] , base_led_data[star_line[j]] , 5 );
+ }
+ }
+ send_led();
+ wait_ms(speed);
+ }
+
+ i = 0;
+ j = 1;
+#if 0
+ while(i!=(abs(from-to)))
+ {
+ i = 0;
+ for(j=from;j>to;j--)
+ {
+ i += near( led_data[star_line[j]] , base_led_data[star_line[j]] , 5 );
+ }
+ send_led();
+ wait_ms(speed);
+ }
+#endif
+ }
+
+ return(0);
+}
+
+void slow_light_all(const unsigned char *base_dat,int speed)
+{
+ int i,j;
+ while(i!=LED_NUM)
+ {
+ i = 0;
+ for(j=0;j<LED_NUM;j++)
+ {
+ i += near( led_data[j] , base_dat , 5 );
+ }
+ send_led();
+ wait_ms(speed);
+ }
+}
+
+void back_base(void)
+{
+ for(int i=0;i<LED_NUM;i++)
+ {
+ near( led_data[i] , base_led_data[i] , 5 );
+ send_led();
+ }
+}
+
+int glad(int i,unsigned char *dat)
+{
+ i = i % 0x2FE;
+
+ if( i < 0xFF )
+ {
+ dat[0] = 0xFF * cos(PI/(510.0f/(double)i));
+ dat[1] = 0xFF * sin(PI/(510.0f/(double)i));
+ dat[2] = 0;
+ }
+ else if((i >= 0xFF)&&( i < 0x1FE ))
+ {
+ i -= 0xFF;
+ dat[0] = 0;
+ dat[1] = 0xFF * cos(PI/(510.0f/(double)i));
+ dat[2] = 0xFF * sin(PI/(510.0f/(double)i));
+ }
+ else if((i >= 0x1FE )&&( i < 0x2FD ))
+ {
+ i -= 0x1FE;
+ dat[0] = 0xFF * sin(PI/(510.0f/(double)i));
+ dat[1] = 0;
+ dat[2] = 0xFF * cos(PI/(510.0f/(double)i));
+ }
+ return(0);
+
+}
+
+void idle_cycle(int like) {
+ static int old_like_count_i = 0;
+ static int cycle = 0;
+ static int gorl_flag = 0;
+ static int gol_count = 0;
+ int point = STAR_LINE_MAX - like; //STAR_LINE_MAX - (int)((float)like / ((float)max_count / (float)STAR_LINE_MAX));
+
+ cycle++;
+
+ if( old_like_count_i != like ) {
+
+ flipper.detach();
+
+ if( like < max_count ) {
+ for(int j=0;j<60;j++) {
+ memcpy( led_data[j] , base_led_data[j] , 3 );
+ }
+ printf("COUNT!! %d\r\n",point);
+ flow_star(0,point+1,_YELLOW,20);
+ flow_star(point,point+1,color_line[point],_WHITE,50);
+ flow_star(point,point+1,color_line[point],_WHITE,50);
+ flow_star(point,point+1,_WHITE,color_line[point],50);
+ memcpy(base_led_data[star_line[point]] , color_line[point] , 3 );
+ }
+ else if(gorl_flag == 0) {
+ gorl_flag = 1;
+ flow_star(0,STAR_LINE_MAX,_RED,10);
+ flow_star(0,STAR_LINE_MAX,_PURPLE,10);
+ flow_star(0,STAR_LINE_MAX,_BLUE,10);
+ flow_star(0,STAR_LINE_MAX,_AQUA,10);
+ flow_star(0,STAR_LINE_MAX,_RED,10);
+ flow_star(0,STAR_LINE_MAX,_GREEN,10);
+ flow_star(0,STAR_LINE_MAX,_YELLOW,_OFF,30);
+ }
+ else {
+ flow_star(0,STAR_LINE_MAX,_YELLOW,30);
+ }
+
+ flipper.attach(&flip, 2.0);
+ }
+ old_like_count_i = like;
+
+ if(gorl_flag == 1) {
+ for(int j=0;j<60;j++) {
+ glad(gol_count+(j*80),base_led_data[j]);
+ memcpy( led_data[j] , base_led_data[j] , 3 );
+ }
+ }
+ else {
+ for(int i=0;i<STAR_LINE_MAX;i++) {
+ if( i >= point ) {
+ memcpy(base_led_data[star_line[i]] , color_line[i] , 3 );
+ }
+ }
+ }
+
+ back_base();
+
+ gol_count += 30 ;
+ if( gol_count >= 0x2FD ) {
+ gol_count = 0;
+ }
+
+}
+
+void like_change(int like)
+{
+
+}
+
+void send_led()
+{
+ for(int i=0;i<LED_NUM;i++)
+ {
+ tapeSet(i,led_data[i][0] << 16 | led_data[i][1] << 8 | led_data[i][2]);
+ }
+ tapeSend();
+}
+
+
+void flip() {
+ // like_count += 1;
+ led_data[star_line[demo_count]][0] /= 2;
+ led_data[star_line[demo_count]][1] /= 2;
+ led_data[star_line[demo_count]][2] /= 2;
+
+ demo_count += 1;
+
+ if( demo_count >= STAR_LINE_MAX )
+ {
+ demo_count = 0;
+ }
+}
+
int main() {
-// void setup() {
- pc.baud(9600);
+ int old_like_count = 1;
+ char tag[64];
+ char tmp[5];
+ char tmp2[5];
+
+ SW1.mode(PullUp);
+ SW2.mode(PullUp);
+
+ if( SW1 == 0 ) { // DEMO MODE
+ tapeInit(0, LED_NUM+2);
+
+ while(1) {
+ flow_star(0,STAR_LINE_MAX,_RED ,_OFF,30);
+ wait(0.5);
+ flow_star(0,STAR_LINE_MAX,_PURPLE,_OFF,30);
+ wait(0.5);
+ flow_star(0,STAR_LINE_MAX,_BLUE ,_OFF,30);
+ wait(0.5);
+ flow_star(0,STAR_LINE_MAX,_AQUA ,_OFF,30);
+ wait(0.5);
+ flow_star(0,STAR_LINE_MAX,_GREEN ,_OFF,30);
+ wait(0.5);
+ flow_star(0,STAR_LINE_MAX,_YELLOW,_OFF,30);
+ wait(0.5);
+ }
+ }
+#if 0
+ cfg.read("/local/env.ini");
+
+ if (cfg.getValue("TAG", &tag[0], sizeof(tag))) {
+ printf("'%s'='%s'\n\r", "TAG", tag);
+ }
+ else
+ {
+ sprintf(tag,"ma9");
+ }
+ if (cfg.getValue("COUNT", &tmp[0], sizeof(tmp))) {
+ printf("'%s'='%s'\n\r", "COUNT", tmp);
+ like_count = atoi(tmp);
+ }
+ else
+ {
+ like_count = 0;
+ }
+ if (cfg.getValue("MAX", &tmp2[0], sizeof(tmp2))) {
+ printf("'%s'='%s'\n\r", "MAX", tmp2);
+ max_count = atoi(tmp2);
+ }
+ else
+ {
+ max_count = 0;
+ }
+#endif
+ like_count = 0;
+ max_count = 60;
+
+ printf("ini file read\r\n");
+ printf("HashTag:%s\r\n",tag);
+ printf("Now Count:%d\r\n",like_count);
+ printf("Max Count:%d\r\n",max_count);
+
+ stat_led1 = 1;
+
+ for(int i=0;i<LED_NUM;i++) {
+ memcpy( led_data[i] , _OFF , 3 );
+ memcpy( base_led_data[i] , _DARK_GLAY , 3 );
+ }
+
+ tapeInit(0, LED_NUM+2);
+
+ send_led();
+
+ slow_light_all(_DARK_GLAY , 50);
+
MQTTEthernet *ipstack = new MQTTEthernet();
MClient *client = new MClient(ipstack);
Milkcocoa *milkcocoa = new Milkcocoa(client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);
pc.printf("Milkcocoa mbed ver demo\n\r\n\r\n\r");
+
+
+ wait(2);
milkcocoa->connect();
- pc.printf("\n\rEther connected\n\r");
+ while(milkcocoa->getConnectStatus()!=1) {
+ pc.printf("\n\rEther connected error\n\r");
+ pc.printf("\n\rEther re connect\n\r");
+ ipstack->reconnect();
+ wait(2);
+ milkcocoa->connect();
+ }
+
+ stat_led2 = 1;
- pc.printf("%d\n\r",milkcocoa->on(MILKCOCOA_DATASTORE, "push", onpush));
+ int ret = milkcocoa->on(MILKCOCOA_DATASTORE, "push", onpush);
+ pc.printf("%d\n\r",ret);
+ while(ret != 1){
+ wait(1);
+ pc.printf("%d\n\r",ret);
+ ret = milkcocoa->on(MILKCOCOA_DATASTORE, "push", onpush);
+ }
+
+ stat_led3 = 1;
-// }
- while(1) {
-// void loop() {
- milkcocoa->loop();
+ while(1)
+ {
+ milkcocoa->loop();
+
+ if(like_count != old_like_count)
+ {
+ printf("%04d\r\n",like_count);
+ sprintf(&tmp[0],"%d",like_count);
+ //cfg.setValue("COUNT", tmp);
+ if(cfg.write("/local/env.ini"))
+ {
+ printf("SET COUNT\r\n");
+ }
+ else
+ {
+ printf("SET ERR\r\n");
+ }
+ old_like_count = like_count;
+ }
+
+ idle_cycle(like_count);
- DataElement elem = DataElement();
- elem.setValue("v", 1);
-
- milkcocoa->push(MILKCOCOA_DATASTORE, elem);
- wait(7.0);
+ stat_led4 = !stat_led4;
+
}
}
void onpush(MQTT::MessageData& md)
{
MQTT::Message &message = md.message;
- DataElement de = DataElement((char*)message.payload);
- pc.printf("onpush\n\r");
- pc.printf("%d\n\r",de.getInt("v"));
-}
\ No newline at end of file
+ DataElement de = DataElement((char*)message.payload);
+ printf("onpush\n\r");
+ like_count++;
+}
+
+