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.
Diff: main.cpp
- Revision:
- 2:adfdb6828250
- Parent:
- 1:badc825f9c7e
- Child:
- 3:ee5be57a4110
--- a/main.cpp Sat Jun 27 22:02:07 2015 +0000 +++ b/main.cpp Thu Jul 09 22:24:28 2015 +0000 @@ -1,4 +1,10 @@ #include "mbed.h" +#include "rtos.h" + +const int deviceOffset = 0; + + +#define MaxReceiveBufferSize 100 void setPNumLeftAndRight(); @@ -21,64 +27,103 @@ char num8[] = {110,145,145,145,145,145,110,0}; char num9[] = {114,137,137,137,137,137,126,0}; char col[] = {0, 0, 0, 36, 0, 0, 0, 0}; -char space[] = {0, 0, 0, 0, 0, 0, 0, 0}; +char space[] = {0, 0, 0, 0, 0, 0, 0, 0}; char *nums[] = {num0, num1, num2, num3, num4, num5, num6, num7, num8, num9}; -//BusOut common(dp15,dp25,dp13,dp17, dp1,dp11, dp2); // anode -//BusOut row( dp18, dp4, dp6,dp14,dp10,dp16,dp26,dp28); // casode BusOut common( dp9, dp2, dp11, dp1, dp17, dp13, dp25, dp15); // anode BusOut row( dp28, dp26, dp16, dp10, dp14, dp6, dp4, dp18); // casode I2CSlave slave(dp5, dp27); +Ticker secondRate; Ticker frameRate; Ticker dynamicRate; -char displayBuffer[100]; +int iDisplayBuffer = 0; int nDisplayBuffer; -int iDisplayBuffer = 0; + +char displayBuffer[MaxReceiveBufferSize]; char *pNumLeft; // 出力中の数字ビットパターン、左側 char *pNumRight; // 出力中の数字ビットパターン、右側 int iShift = 0; // 0 - 7 ... 現在何ビットずれているか -void setPNumLeftAndRight() { - char left = displayBuffer[iDisplayBuffer]; - if (left == ' ') { - pNumLeft = space; - } else if (left == ':') { - pNumLeft = col; +char * getBitPatternWithPosition(int inPos) +{ + char *result = space; + + int pos = (iDisplayBuffer + deviceOffset + inPos) % nDisplayBuffer; + char c = displayBuffer[pos]; + if (c == ' ') { + result = space; + } else if (c == ':') { + result = col; } else { - pNumLeft = nums[left - '0']; + result = nums[c - '0']; } - char right = (iDisplayBuffer+1 >= nDisplayBuffer) ? displayBuffer[0] : displayBuffer[iDisplayBuffer+1]; - if (right == ' ') { - pNumRight = space; - } else if (right == ':') { - pNumRight = col; - } else { - pNumRight = nums[right - '0']; + + return result; +} + + +void setPNumLeftAndRight() +{ + pNumLeft = getBitPatternWithPosition(0); + pNumRight = getBitPatternWithPosition(1); +} + + +int second = 0; +int minute = 0; +int hour = 0; + +// if -1 the display is shift automatically +int autoShiftWindow = -1; + +void secondVector() +{ + second++; + if (second >= 60) { + second = 0; + minute ++; + if (minute >= 60) { + minute = 0; + hour++; + if (hour >= 24) { + hour = 0; + } + } + } + + if (autoShiftWindow != -1) { + autoShiftWindow++; } } -void count() { +void shiftVector() +{ disableTicker(); - - iShift++; - if (iShift >= 8) { - iShift = 0; - - iDisplayBuffer++; - if (iDisplayBuffer >= nDisplayBuffer) { - iDisplayBuffer = 0; + + if (autoShiftWindow == -1) { + iShift++; + if (iShift >= 8) { + iShift = 0; + + iDisplayBuffer++; + if (iDisplayBuffer >= nDisplayBuffer) { + iDisplayBuffer = 0; + } + setPNumLeftAndRight(); } - setPNumLeftAndRight(); + } else { + if (autoShiftWindow >= 60) { + autoShiftWindow = 0; + } } - enableTicker(); } @@ -87,13 +132,12 @@ int pYoko = 1; -void dynamicDriver() { +void dynamicVector() +{ int i = iYoko + iShift; - + common = 0x00; -// char rowData = (i < 8) ? iShift : iShift*16; -// char rowData = (i < 8) ? num0[iShift] : num1[iShift]; - char rowData = (i < 8) ? pNumLeft[i] : pNumRight[i % 8]; + char rowData = (i < 8) ? pNumLeft[i] : pNumRight[i % 8]; row = (~rowData) & 0x00ff; common = (pYoko) & 0x00ff; iYoko++; @@ -104,73 +148,95 @@ } } -void disableTicker() { + +void disableTicker() +{ + secondRate.detach(); frameRate.detach(); dynamicRate.detach(); } -void enableTicker() { - frameRate.attach(count, 0.05); - dynamicRate.attach(dynamicDriver, 0.0001); +void enableTicker() +{ + secondRate.attach(secondVector, 1.0000); + frameRate.attach(shiftVector, 0.0500); + dynamicRate.attach(dynamicVector, 0.0001); } +static char buf[MaxReceiveBufferSize]; -int main() { - int deviceOffset = 4; +int main() +{ slave.address(0x10 + deviceOffset); - + strcpy(displayBuffer, " :3: "); displayBuffer[2] = deviceOffset + '0'; nDisplayBuffer = strlen(displayBuffer); - + iDisplayBuffer = 0; iShift = 0; setPNumLeftAndRight(); - + enableTicker(); - - char buf[100]; - char *msg = "ok"; - - while(1) { + +// char buf[100]; +// char *msg = "ok"; + + while(1) { int status = slave.receive(); + int charPos, shiftPos; switch (status) { - case I2CSlave::ReadAddressed: - slave.write(msg, strlen(msg) + 1); // Includes null char - break; - - case I2CSlave::WriteGeneral: +// case I2CSlave::ReadAddressed: +// slave.write(msg, strlen(msg) + 1); // Includes null char +// break; + +// case I2CSlave::WriteGeneral: +// disableTicker(); +// if (slave.read(buf, 2)) { +// autoShiftWindow = 0; // stop automatic shift +// +// charPos = buf[0] - '0'; +// shiftPos = buf[1] - '0'; +// +// if (charPos >= 0 && charPos < nDisplayBuffer) { +// iDisplayBuffer = charPos; +// } +// if (shiftPos >= 0 && shiftPos < 8) { +// iShift = shiftPos; +// } +// } +// enableTicker(); +// break; + + case I2CSlave::WriteAddressed: disableTicker(); - if (slave.read(buf, 2)) { - int charPos = buf[0] - '0' + deviceOffset; - int shiftPos = buf[1] - '1'; - - if (charPos >= 0 && charPos < nDisplayBuffer) { - iDisplayBuffer = charPos; - } - if (shiftPos >= 0 && shiftPos < 8) { - iShift = shiftPos; + if (slave.read(buf, MaxReceiveBufferSize)) { + if (buf[0] == 'x') { + autoShiftWindow = 0; // stop automatic shift + charPos = buf[1] - '0'; + shiftPos = buf[2] - '0'; + + if (charPos >= 0 && charPos < MaxReceiveBufferSize) { + iDisplayBuffer = charPos; + } + if (shiftPos >= 0 && shiftPos < 8) { + iShift = shiftPos; + } + } else { + strncpy(displayBuffer, buf, MaxReceiveBufferSize); + displayBuffer[MaxReceiveBufferSize-1] = 0; + nDisplayBuffer = strlen(displayBuffer); + if (iDisplayBuffer >= nDisplayBuffer) iDisplayBuffer = 0; + setPNumLeftAndRight(); } } enableTicker(); break; - - case I2CSlave::WriteAddressed: - disableTicker(); - if (slave.read(buf, 10)) { - strcpy(displayBuffer, buf); - nDisplayBuffer = strlen(displayBuffer); - iDisplayBuffer = 0; - iShift = 0; - setPNumLeftAndRight(); - slave.stop(); - } - enableTicker(); + + default: break; - - default: break; - } - - } + } + for (int i = 0; i < MaxReceiveBufferSize; i++) buf[i] = 0; + } }