同時公開のFunctionGenerator-BLEと同時利用によりファンクション・ジェネレータを実現する。
FunctionGenerator-BLE
/users/ohneta/code/FunctionGenerator-BLE
what's this ? / 概要
あとで、もっとちゃんと書く(とおもう)
同時公開のFunctionGenerator-BLEと同時利用によりmbed LPC1768を使って、ファンクション・ジェネレータを実現する。
detail / 詳細
あとで、もっとちゃんと書く(とおもう)
FunctionGenerator-BLEはI2Cで所定のフォーマットに従ったデータをDACから出力する。
DACは連続するデータを出力し、任意の波形を出力する。
BLE command format / BLEコマンドフォーマット
あとで、ちゃんと書く(とおもう)
BLE App for iPhone
iOS用アプリソースコード App source codes for iOS
https://github.com/ohneta/FuncGenBLE
pictures / とりあえず写真など
外観
アプリ画面
出力波形
more pictures...
- https://twitter.com/ohneta_j/status/610439975549558784
- https://twitter.com/ohneta_j/status/610480383788871680
- https://twitter.com/ohneta_j/status/610733060594647040
main.cpp@0:cbf811b45305, 2015-06-16 (annotated)
- Committer:
- ohneta
- Date:
- Tue Jun 16 07:19:51 2015 +0000
- Revision:
- 0:cbf811b45305
1st release commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ohneta | 0:cbf811b45305 | 1 | #include "mbed.h" |
ohneta | 0:cbf811b45305 | 2 | #include <I2CSlave.h> |
ohneta | 0:cbf811b45305 | 3 | #include "FunctionGenCommands.h" |
ohneta | 0:cbf811b45305 | 4 | |
ohneta | 0:cbf811b45305 | 5 | |
ohneta | 0:cbf811b45305 | 6 | extern "C" void mbed_reset(); |
ohneta | 0:cbf811b45305 | 7 | |
ohneta | 0:cbf811b45305 | 8 | #define PI 3.141592 |
ohneta | 0:cbf811b45305 | 9 | |
ohneta | 0:cbf811b45305 | 10 | #define WAVE_MASTER_BUFFER_SIZE 360 |
ohneta | 0:cbf811b45305 | 11 | |
ohneta | 0:cbf811b45305 | 12 | #define WAVE_READ_BUFFER_SIZE (1024 * 8) |
ohneta | 0:cbf811b45305 | 13 | //#define WAVE_READ_BUFFER_SIZE_FORCE (1024 * 16 - 1) |
ohneta | 0:cbf811b45305 | 14 | |
ohneta | 0:cbf811b45305 | 15 | #define I2C_PACKET_LENGTH 36 |
ohneta | 0:cbf811b45305 | 16 | |
ohneta | 0:cbf811b45305 | 17 | #define ONE_CLOCK_TIME ((1.0 / 3.0) / (1000.0 * 1000.0)) |
ohneta | 0:cbf811b45305 | 18 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 19 | |
ohneta | 0:cbf811b45305 | 20 | void initMasterWaveBuffer(); |
ohneta | 0:cbf811b45305 | 21 | void masterToReadBufferByFreq(uint32_t paramFreq); |
ohneta | 0:cbf811b45305 | 22 | void clickedUpButton(); |
ohneta | 0:cbf811b45305 | 23 | void clickedDownButton(); |
ohneta | 0:cbf811b45305 | 24 | //void lookForYou(); |
ohneta | 0:cbf811b45305 | 25 | void doCommand(char *readBuffer, int length); |
ohneta | 0:cbf811b45305 | 26 | void commandPrint(FGPacket *fgPacket); |
ohneta | 0:cbf811b45305 | 27 | |
ohneta | 0:cbf811b45305 | 28 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 29 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 30 | //BusOut myleds(LED1, LED2, LED3, LED4); |
ohneta | 0:cbf811b45305 | 31 | //BusOut ladderDacBusOut(p21, p22, p23, p24, p25, p26, p5, p6, p7, p8); |
ohneta | 0:cbf811b45305 | 32 | |
ohneta | 0:cbf811b45305 | 33 | DigitalOut led1(LED1); // I2C I/O |
ohneta | 0:cbf811b45305 | 34 | DigitalOut led2(LED2); |
ohneta | 0:cbf811b45305 | 35 | DigitalOut led3(LED3); // ERROR |
ohneta | 0:cbf811b45305 | 36 | DigitalOut led4(LED4); // watch dog |
ohneta | 0:cbf811b45305 | 37 | |
ohneta | 0:cbf811b45305 | 38 | PortOut ladderDacPortOut(Port0, 0x00000001); |
ohneta | 0:cbf811b45305 | 39 | // P0_0のみ有効 = p9 |
ohneta | 0:cbf811b45305 | 40 | |
ohneta | 0:cbf811b45305 | 41 | AnalogOut aout(p18); |
ohneta | 0:cbf811b45305 | 42 | InterruptIn upButton(p11); |
ohneta | 0:cbf811b45305 | 43 | InterruptIn downButton(p12); |
ohneta | 0:cbf811b45305 | 44 | |
ohneta | 0:cbf811b45305 | 45 | //InterruptIn i2cStart(p13); |
ohneta | 0:cbf811b45305 | 46 | InterruptIn i2cStart(p29); |
ohneta | 0:cbf811b45305 | 47 | I2CSlave i2cSlave(p28, p27); |
ohneta | 0:cbf811b45305 | 48 | int gLookI2C = false; |
ohneta | 0:cbf811b45305 | 49 | |
ohneta | 0:cbf811b45305 | 50 | Serial pc(USBTX, USBRX); |
ohneta | 0:cbf811b45305 | 51 | |
ohneta | 0:cbf811b45305 | 52 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 53 | uint32_t gMasterFrequency = 366; |
ohneta | 0:cbf811b45305 | 54 | uint32_t gLastFrequency = 366; |
ohneta | 0:cbf811b45305 | 55 | |
ohneta | 0:cbf811b45305 | 56 | uint16_t gMasterBuffer[WAVE_MASTER_BUFFER_SIZE]; |
ohneta | 0:cbf811b45305 | 57 | //uint16_t gReadBuffer[WAVE_READ_BUFFER_SIZE]; |
ohneta | 0:cbf811b45305 | 58 | uint16_t gReadBuffer[WAVE_READ_BUFFER_SIZE] __attribute__((section("AHBSRAM0"))); |
ohneta | 0:cbf811b45305 | 59 | uint16_t gReadBuffer_tmp[WAVE_READ_BUFFER_SIZE] __attribute__((section("AHBSRAM1"))); |
ohneta | 0:cbf811b45305 | 60 | volatile int gReadBufferLength = 0; |
ohneta | 0:cbf811b45305 | 61 | |
ohneta | 0:cbf811b45305 | 62 | char gI2cReadBuffer[I2C_PACKET_LENGTH]; |
ohneta | 0:cbf811b45305 | 63 | |
ohneta | 0:cbf811b45305 | 64 | WaveformInfo gWaveformInfo; |
ohneta | 0:cbf811b45305 | 65 | |
ohneta | 0:cbf811b45305 | 66 | |
ohneta | 0:cbf811b45305 | 67 | |
ohneta | 0:cbf811b45305 | 68 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 69 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 70 | |
ohneta | 0:cbf811b45305 | 71 | void initMasterWaveBuffer() |
ohneta | 0:cbf811b45305 | 72 | { |
ohneta | 0:cbf811b45305 | 73 | // sin-wave |
ohneta | 0:cbf811b45305 | 74 | for (int i = 0; i < WAVE_MASTER_BUFFER_SIZE; i++) { |
ohneta | 0:cbf811b45305 | 75 | double rad = ((double)i / WAVE_MASTER_BUFFER_SIZE) * (PI * 2); // = 0...2*PI |
ohneta | 0:cbf811b45305 | 76 | double sinA = sin(rad); // answer: -1.0 〜 1.0 |
ohneta | 0:cbf811b45305 | 77 | gMasterBuffer[i] = (unsigned short)((sinA + 1.0) / 2.0 * 0xffff); |
ohneta | 0:cbf811b45305 | 78 | } |
ohneta | 0:cbf811b45305 | 79 | |
ohneta | 0:cbf811b45305 | 80 | gMasterFrequency = 1.0 / (ONE_CLOCK_TIME * WAVE_MASTER_BUFFER_SIZE); |
ohneta | 0:cbf811b45305 | 81 | } |
ohneta | 0:cbf811b45305 | 82 | |
ohneta | 0:cbf811b45305 | 83 | void masterToReadBufferByFreq(uint32_t paramFreq) |
ohneta | 0:cbf811b45305 | 84 | { |
ohneta | 0:cbf811b45305 | 85 | gMasterFrequency = paramFreq; |
ohneta | 0:cbf811b45305 | 86 | gLastFrequency = gMasterFrequency; |
ohneta | 0:cbf811b45305 | 87 | |
ohneta | 0:cbf811b45305 | 88 | gReadBufferLength = (1.0 / (paramFreq * ONE_CLOCK_TIME)); |
ohneta | 0:cbf811b45305 | 89 | // 2 <= gReadBufferLength <= WAVE_READ_BUFFER_SIZE |
ohneta | 0:cbf811b45305 | 90 | |
ohneta | 0:cbf811b45305 | 91 | double x = (double)WAVE_MASTER_BUFFER_SIZE / (double)gReadBufferLength; |
ohneta | 0:cbf811b45305 | 92 | //double x = (double)WAVE_READ_BUFFER_SIZE_FORCE / (double)gReadBufferLength; |
ohneta | 0:cbf811b45305 | 93 | |
ohneta | 0:cbf811b45305 | 94 | pc.printf("gReadBufferLength: %d\n", gReadBufferLength); |
ohneta | 0:cbf811b45305 | 95 | pc.printf("x: %f\n", x); |
ohneta | 0:cbf811b45305 | 96 | |
ohneta | 0:cbf811b45305 | 97 | for (int i = 0; i < gReadBufferLength; i++) { |
ohneta | 0:cbf811b45305 | 98 | int pt = (int)((double)i * x); |
ohneta | 0:cbf811b45305 | 99 | gReadBuffer[i] = gMasterBuffer[pt] & 0xffc0; |
ohneta | 0:cbf811b45305 | 100 | //gReadBuffer[i] = (i & 0x01) ? 0xffff : 0x0000; |
ohneta | 0:cbf811b45305 | 101 | } |
ohneta | 0:cbf811b45305 | 102 | } |
ohneta | 0:cbf811b45305 | 103 | |
ohneta | 0:cbf811b45305 | 104 | void clearReadBuffer() |
ohneta | 0:cbf811b45305 | 105 | { |
ohneta | 0:cbf811b45305 | 106 | for (int i = 0; i < WAVE_READ_BUFFER_SIZE; i++) { |
ohneta | 0:cbf811b45305 | 107 | //for (int i = 0; i < WAVE_READ_BUFFER_SIZE_FORCE; i++) { |
ohneta | 0:cbf811b45305 | 108 | gReadBuffer[i] = 0x0000; |
ohneta | 0:cbf811b45305 | 109 | } |
ohneta | 0:cbf811b45305 | 110 | } |
ohneta | 0:cbf811b45305 | 111 | |
ohneta | 0:cbf811b45305 | 112 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 113 | #if 0 |
ohneta | 0:cbf811b45305 | 114 | void clickedUpButton() |
ohneta | 0:cbf811b45305 | 115 | { |
ohneta | 0:cbf811b45305 | 116 | upButton.disable_irq(); |
ohneta | 0:cbf811b45305 | 117 | downButton.disable_irq(); |
ohneta | 0:cbf811b45305 | 118 | wait(0.01); |
ohneta | 0:cbf811b45305 | 119 | if (upButton == 1) { |
ohneta | 0:cbf811b45305 | 120 | gInterruptCount++; |
ohneta | 0:cbf811b45305 | 121 | if (gInterruptCount >= WAVE_READ_BUFFER_SIZE) { |
ohneta | 0:cbf811b45305 | 122 | gInterruptCount = WAVE_READ_BUFFER_SIZE - 1; |
ohneta | 0:cbf811b45305 | 123 | } |
ohneta | 0:cbf811b45305 | 124 | masterToReadBuffer(); |
ohneta | 0:cbf811b45305 | 125 | //myleds = gInterruptCount; |
ohneta | 0:cbf811b45305 | 126 | } |
ohneta | 0:cbf811b45305 | 127 | upButton.enable_irq(); |
ohneta | 0:cbf811b45305 | 128 | downButton.enable_irq(); |
ohneta | 0:cbf811b45305 | 129 | |
ohneta | 0:cbf811b45305 | 130 | //pc.printf("Interrupt Count: %d \n", gInterruptCount); |
ohneta | 0:cbf811b45305 | 131 | } |
ohneta | 0:cbf811b45305 | 132 | |
ohneta | 0:cbf811b45305 | 133 | void clickedDownButton() |
ohneta | 0:cbf811b45305 | 134 | { |
ohneta | 0:cbf811b45305 | 135 | upButton.disable_irq(); |
ohneta | 0:cbf811b45305 | 136 | downButton.disable_irq(); |
ohneta | 0:cbf811b45305 | 137 | wait(0.01); |
ohneta | 0:cbf811b45305 | 138 | if (downButton == 1) { |
ohneta | 0:cbf811b45305 | 139 | gInterruptCount--; |
ohneta | 0:cbf811b45305 | 140 | if (gInterruptCount < 0) { |
ohneta | 0:cbf811b45305 | 141 | gInterruptCount = 0; |
ohneta | 0:cbf811b45305 | 142 | } |
ohneta | 0:cbf811b45305 | 143 | masterToReadBuffer(); |
ohneta | 0:cbf811b45305 | 144 | //myleds = gInterruptCount; |
ohneta | 0:cbf811b45305 | 145 | } |
ohneta | 0:cbf811b45305 | 146 | upButton.enable_irq(); |
ohneta | 0:cbf811b45305 | 147 | downButton.enable_irq(); |
ohneta | 0:cbf811b45305 | 148 | |
ohneta | 0:cbf811b45305 | 149 | //pc.printf("Interrupt Count: %d \n", gInterruptCount); |
ohneta | 0:cbf811b45305 | 150 | } |
ohneta | 0:cbf811b45305 | 151 | #endif |
ohneta | 0:cbf811b45305 | 152 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 153 | /** |
ohneta | 0:cbf811b45305 | 154 | * |
ohneta | 0:cbf811b45305 | 155 | */ |
ohneta | 0:cbf811b45305 | 156 | void i2cSlaveAction() |
ohneta | 0:cbf811b45305 | 157 | { |
ohneta | 0:cbf811b45305 | 158 | pc.printf("--------\n"); |
ohneta | 0:cbf811b45305 | 159 | pc.printf("i2cSlaveAction()\n"); |
ohneta | 0:cbf811b45305 | 160 | |
ohneta | 0:cbf811b45305 | 161 | static int cnt = 0; |
ohneta | 0:cbf811b45305 | 162 | |
ohneta | 0:cbf811b45305 | 163 | for (int i = 0; i < I2C_PACKET_LENGTH; i++) { |
ohneta | 0:cbf811b45305 | 164 | gI2cReadBuffer[i] = 0x00; |
ohneta | 0:cbf811b45305 | 165 | } |
ohneta | 0:cbf811b45305 | 166 | |
ohneta | 0:cbf811b45305 | 167 | int loopCount = 0; |
ohneta | 0:cbf811b45305 | 168 | int result = i2cSlave.receive(); |
ohneta | 0:cbf811b45305 | 169 | while (result == I2CSlave::NoData) { |
ohneta | 0:cbf811b45305 | 170 | wait_ms(10); |
ohneta | 0:cbf811b45305 | 171 | result = i2cSlave.receive(); |
ohneta | 0:cbf811b45305 | 172 | if (loopCount > 100) { |
ohneta | 0:cbf811b45305 | 173 | return; |
ohneta | 0:cbf811b45305 | 174 | } |
ohneta | 0:cbf811b45305 | 175 | } |
ohneta | 0:cbf811b45305 | 176 | |
ohneta | 0:cbf811b45305 | 177 | switch (result) { |
ohneta | 0:cbf811b45305 | 178 | case I2CSlave::NoData: |
ohneta | 0:cbf811b45305 | 179 | break; |
ohneta | 0:cbf811b45305 | 180 | |
ohneta | 0:cbf811b45305 | 181 | case I2CSlave::WriteGeneral: // the master is writing to all slave -- broadcast |
ohneta | 0:cbf811b45305 | 182 | break; |
ohneta | 0:cbf811b45305 | 183 | |
ohneta | 0:cbf811b45305 | 184 | case I2CSlave::WriteAddressed: // the master is writing to this slave |
ohneta | 0:cbf811b45305 | 185 | int ret = i2cSlave.read(gI2cReadBuffer, I2C_PACKET_LENGTH); |
ohneta | 0:cbf811b45305 | 186 | FGPacket *fgPacket = (FGPacket *)gI2cReadBuffer; |
ohneta | 0:cbf811b45305 | 187 | |
ohneta | 0:cbf811b45305 | 188 | pc.printf("Read : ret=%d [ ", ret); |
ohneta | 0:cbf811b45305 | 189 | for (int i = 0; i < fgPacket->header.length; i++) { |
ohneta | 0:cbf811b45305 | 190 | pc.printf("%02x ", gI2cReadBuffer[i]); |
ohneta | 0:cbf811b45305 | 191 | } |
ohneta | 0:cbf811b45305 | 192 | pc.printf("]\n"); |
ohneta | 0:cbf811b45305 | 193 | |
ohneta | 0:cbf811b45305 | 194 | doCommand(gI2cReadBuffer, I2C_PACKET_LENGTH); |
ohneta | 0:cbf811b45305 | 195 | break; |
ohneta | 0:cbf811b45305 | 196 | |
ohneta | 0:cbf811b45305 | 197 | case I2CSlave::ReadAddressed: // the master has requested a read from this slave |
ohneta | 0:cbf811b45305 | 198 | char buf[32]; |
ohneta | 0:cbf811b45305 | 199 | sprintf(buf, "Ooops:%d", cnt); |
ohneta | 0:cbf811b45305 | 200 | i2cSlave.write(buf, strlen(buf)); |
ohneta | 0:cbf811b45305 | 201 | cnt++; |
ohneta | 0:cbf811b45305 | 202 | break; |
ohneta | 0:cbf811b45305 | 203 | |
ohneta | 0:cbf811b45305 | 204 | default: |
ohneta | 0:cbf811b45305 | 205 | break; |
ohneta | 0:cbf811b45305 | 206 | } |
ohneta | 0:cbf811b45305 | 207 | } |
ohneta | 0:cbf811b45305 | 208 | |
ohneta | 0:cbf811b45305 | 209 | void doCommand(char *readBuffer, int length) |
ohneta | 0:cbf811b45305 | 210 | { |
ohneta | 0:cbf811b45305 | 211 | FGPacket *fgPacket = (FGPacket *)gI2cReadBuffer; |
ohneta | 0:cbf811b45305 | 212 | commandPrint(fgPacket); |
ohneta | 0:cbf811b45305 | 213 | |
ohneta | 0:cbf811b45305 | 214 | switch (fgPacket->header.command) { |
ohneta | 0:cbf811b45305 | 215 | // for Command |
ohneta | 0:cbf811b45305 | 216 | case FGCommand_Non: |
ohneta | 0:cbf811b45305 | 217 | break; |
ohneta | 0:cbf811b45305 | 218 | |
ohneta | 0:cbf811b45305 | 219 | case FGCommand_Device: |
ohneta | 0:cbf811b45305 | 220 | // reserved for future. |
ohneta | 0:cbf811b45305 | 221 | // fgPacket->body.commandDevice.device |
ohneta | 0:cbf811b45305 | 222 | break; |
ohneta | 0:cbf811b45305 | 223 | |
ohneta | 0:cbf811b45305 | 224 | case FGCommand_Output: |
ohneta | 0:cbf811b45305 | 225 | if (fgPacket->body.commandOutput.on == 0) { |
ohneta | 0:cbf811b45305 | 226 | aout.write_u16(0x0000); |
ohneta | 0:cbf811b45305 | 227 | clearReadBuffer(); |
ohneta | 0:cbf811b45305 | 228 | } else { |
ohneta | 0:cbf811b45305 | 229 | masterToReadBufferByFreq(gMasterFrequency); |
ohneta | 0:cbf811b45305 | 230 | } |
ohneta | 0:cbf811b45305 | 231 | break; |
ohneta | 0:cbf811b45305 | 232 | |
ohneta | 0:cbf811b45305 | 233 | case FGCommand_Frequency: |
ohneta | 0:cbf811b45305 | 234 | // TODO: 正確な周波数計算をすること! |
ohneta | 0:cbf811b45305 | 235 | masterToReadBufferByFreq(fgPacket->body.commandFrequency.frequency); |
ohneta | 0:cbf811b45305 | 236 | break; |
ohneta | 0:cbf811b45305 | 237 | |
ohneta | 0:cbf811b45305 | 238 | case FGCommand_WaveformInfo: |
ohneta | 0:cbf811b45305 | 239 | // TODO: パラメタの内容をチェックすること! |
ohneta | 0:cbf811b45305 | 240 | gWaveformInfo = fgPacket->body.commandWaveformInfo; |
ohneta | 0:cbf811b45305 | 241 | |
ohneta | 0:cbf811b45305 | 242 | break; |
ohneta | 0:cbf811b45305 | 243 | case FGCommand_WaveformBlock: |
ohneta | 0:cbf811b45305 | 244 | // TODO: パラメタの内容をチェックすること! |
ohneta | 0:cbf811b45305 | 245 | uint32_t waveformOffset = fgPacket->body.commandWaveformBlock.blockNo * gWaveformInfo.blockSize; |
ohneta | 0:cbf811b45305 | 246 | memcpy((uint8_t *)gMasterBuffer + waveformOffset, fgPacket->body.commandWaveformBlock.buffer, fgPacket->body.commandWaveformBlock.length); |
ohneta | 0:cbf811b45305 | 247 | break; |
ohneta | 0:cbf811b45305 | 248 | |
ohneta | 0:cbf811b45305 | 249 | case FGCommand_WaveformToBuffer: |
ohneta | 0:cbf811b45305 | 250 | masterToReadBufferByFreq(gMasterFrequency); |
ohneta | 0:cbf811b45305 | 251 | break; |
ohneta | 0:cbf811b45305 | 252 | |
ohneta | 0:cbf811b45305 | 253 | // for Status |
ohneta | 0:cbf811b45305 | 254 | case FGStatus_Output: |
ohneta | 0:cbf811b45305 | 255 | break; |
ohneta | 0:cbf811b45305 | 256 | case FGStatus_Frequency: |
ohneta | 0:cbf811b45305 | 257 | break; |
ohneta | 0:cbf811b45305 | 258 | case FGStatus_Device: |
ohneta | 0:cbf811b45305 | 259 | break; |
ohneta | 0:cbf811b45305 | 260 | |
ohneta | 0:cbf811b45305 | 261 | // Special command |
ohneta | 0:cbf811b45305 | 262 | case FGCommand_Reset: |
ohneta | 0:cbf811b45305 | 263 | mbed_reset(); |
ohneta | 0:cbf811b45305 | 264 | break; |
ohneta | 0:cbf811b45305 | 265 | } |
ohneta | 0:cbf811b45305 | 266 | } |
ohneta | 0:cbf811b45305 | 267 | |
ohneta | 0:cbf811b45305 | 268 | void commandPrint(FGPacket *fgPacket) |
ohneta | 0:cbf811b45305 | 269 | { |
ohneta | 0:cbf811b45305 | 270 | pc.printf("command: %d\n", fgPacket->header.command); |
ohneta | 0:cbf811b45305 | 271 | pc.printf("length: %d\n", fgPacket->header.length); |
ohneta | 0:cbf811b45305 | 272 | { |
ohneta | 0:cbf811b45305 | 273 | switch (fgPacket->header.command) { |
ohneta | 0:cbf811b45305 | 274 | case FGCommand_Non: |
ohneta | 0:cbf811b45305 | 275 | pc.printf("FGCommand_Non \n"); |
ohneta | 0:cbf811b45305 | 276 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 277 | pc.printf(" NON\n"); |
ohneta | 0:cbf811b45305 | 278 | break; |
ohneta | 0:cbf811b45305 | 279 | case FGCommand_Device: |
ohneta | 0:cbf811b45305 | 280 | pc.printf("FGCommand_Device \n"); |
ohneta | 0:cbf811b45305 | 281 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 282 | pc.printf(" device: %d\n", fgPacket->body.commandDevice.device); |
ohneta | 0:cbf811b45305 | 283 | break; |
ohneta | 0:cbf811b45305 | 284 | case FGCommand_Output: |
ohneta | 0:cbf811b45305 | 285 | pc.printf("FGCommand_Output \n"); |
ohneta | 0:cbf811b45305 | 286 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 287 | pc.printf(" on: %d\n", fgPacket->body.commandOutput.on); |
ohneta | 0:cbf811b45305 | 288 | break; |
ohneta | 0:cbf811b45305 | 289 | case FGCommand_Frequency: |
ohneta | 0:cbf811b45305 | 290 | pc.printf("FGCommand_Frequency \n"); |
ohneta | 0:cbf811b45305 | 291 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 292 | pc.printf(" freq: %d\n", fgPacket->body.commandFrequency.frequency); |
ohneta | 0:cbf811b45305 | 293 | break; |
ohneta | 0:cbf811b45305 | 294 | |
ohneta | 0:cbf811b45305 | 295 | case FGCommand_WaveformInfo: |
ohneta | 0:cbf811b45305 | 296 | pc.printf("FGCommand_WaveformInfo \n"); |
ohneta | 0:cbf811b45305 | 297 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 298 | pc.printf(" waveSize: %d\n", fgPacket->body.commandWaveformInfo.waveSize); |
ohneta | 0:cbf811b45305 | 299 | pc.printf(" bitPerData: %d\n", fgPacket->body.commandWaveformInfo.bitPerData); |
ohneta | 0:cbf811b45305 | 300 | pc.printf(" blockSize: %d\n", fgPacket->body.commandWaveformInfo.blockSize); |
ohneta | 0:cbf811b45305 | 301 | pc.printf(" blockMaxNum: %d\n", fgPacket->body.commandWaveformInfo.blockMaxNum); |
ohneta | 0:cbf811b45305 | 302 | break; |
ohneta | 0:cbf811b45305 | 303 | |
ohneta | 0:cbf811b45305 | 304 | case FGCommand_WaveformBlock: |
ohneta | 0:cbf811b45305 | 305 | #if 0 |
ohneta | 0:cbf811b45305 | 306 | pc.printf("FGCommand_WaveformBlock \n"); |
ohneta | 0:cbf811b45305 | 307 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 308 | pc.printf(" blockNo: %d\n", fgPacket->body.commandWaveformBlock.blockNo); |
ohneta | 0:cbf811b45305 | 309 | pc.printf(" length: %d\n", fgPacket->body.commandWaveformBlock.length); |
ohneta | 0:cbf811b45305 | 310 | pc.printf(" buffer:\n"); |
ohneta | 0:cbf811b45305 | 311 | for (int i = 0; i < fgPacket->body.commandWaveformBlock.length; i++) { |
ohneta | 0:cbf811b45305 | 312 | pc.printf("%02x ", fgPacket->body.commandWaveformBlock.buffer[i]); |
ohneta | 0:cbf811b45305 | 313 | } |
ohneta | 0:cbf811b45305 | 314 | pc.printf("\n"); |
ohneta | 0:cbf811b45305 | 315 | #endif |
ohneta | 0:cbf811b45305 | 316 | break; |
ohneta | 0:cbf811b45305 | 317 | |
ohneta | 0:cbf811b45305 | 318 | case FGCommand_WaveformToBuffer: |
ohneta | 0:cbf811b45305 | 319 | pc.printf("FGCommand_WaveformToBuffer \n"); |
ohneta | 0:cbf811b45305 | 320 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 321 | pc.printf(" NON\n"); |
ohneta | 0:cbf811b45305 | 322 | break; |
ohneta | 0:cbf811b45305 | 323 | |
ohneta | 0:cbf811b45305 | 324 | case FGStatus_Output: |
ohneta | 0:cbf811b45305 | 325 | pc.printf("FGStatus_Output \n"); |
ohneta | 0:cbf811b45305 | 326 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 327 | pc.printf(" NON\n"); |
ohneta | 0:cbf811b45305 | 328 | break; |
ohneta | 0:cbf811b45305 | 329 | case FGStatus_Frequency: |
ohneta | 0:cbf811b45305 | 330 | pc.printf("FGStatus_Frequency \n"); |
ohneta | 0:cbf811b45305 | 331 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 332 | pc.printf(" NON\n"); |
ohneta | 0:cbf811b45305 | 333 | break; |
ohneta | 0:cbf811b45305 | 334 | case FGStatus_Device: |
ohneta | 0:cbf811b45305 | 335 | pc.printf("FGStatus_Device \n"); |
ohneta | 0:cbf811b45305 | 336 | pc.printf("Param:\n"); |
ohneta | 0:cbf811b45305 | 337 | pc.printf(" NON\n"); |
ohneta | 0:cbf811b45305 | 338 | break; |
ohneta | 0:cbf811b45305 | 339 | } |
ohneta | 0:cbf811b45305 | 340 | } |
ohneta | 0:cbf811b45305 | 341 | } |
ohneta | 0:cbf811b45305 | 342 | |
ohneta | 0:cbf811b45305 | 343 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 344 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 345 | |
ohneta | 0:cbf811b45305 | 346 | int main() { |
ohneta | 0:cbf811b45305 | 347 | pc.baud(115200); |
ohneta | 0:cbf811b45305 | 348 | pc.printf("\n"); |
ohneta | 0:cbf811b45305 | 349 | pc.printf("mbed function generator\n"); |
ohneta | 0:cbf811b45305 | 350 | pc.printf("--\n"); |
ohneta | 0:cbf811b45305 | 351 | |
ohneta | 0:cbf811b45305 | 352 | { |
ohneta | 0:cbf811b45305 | 353 | gWaveformInfo.waveSize = WAVE_MASTER_BUFFER_SIZE; |
ohneta | 0:cbf811b45305 | 354 | gWaveformInfo.bitPerData = 12; |
ohneta | 0:cbf811b45305 | 355 | gWaveformInfo.blockSize = 16; // byte |
ohneta | 0:cbf811b45305 | 356 | gWaveformInfo.blockMaxNum = gWaveformInfo.waveSize / gWaveformInfo.blockSize * ((gWaveformInfo.bitPerData + 7) / 8); |
ohneta | 0:cbf811b45305 | 357 | } |
ohneta | 0:cbf811b45305 | 358 | |
ohneta | 0:cbf811b45305 | 359 | initMasterWaveBuffer(); |
ohneta | 0:cbf811b45305 | 360 | masterToReadBufferByFreq(gMasterFrequency); |
ohneta | 0:cbf811b45305 | 361 | |
ohneta | 0:cbf811b45305 | 362 | i2cSlave.frequency(100000); |
ohneta | 0:cbf811b45305 | 363 | i2cSlave.address(0x62); |
ohneta | 0:cbf811b45305 | 364 | i2cStart.rise(&i2cSlaveAction); |
ohneta | 0:cbf811b45305 | 365 | |
ohneta | 0:cbf811b45305 | 366 | //upButton.rise(&clickedUpButton); |
ohneta | 0:cbf811b45305 | 367 | //downButton.rise(&clickedDownButton); |
ohneta | 0:cbf811b45305 | 368 | |
ohneta | 0:cbf811b45305 | 369 | |
ohneta | 0:cbf811b45305 | 370 | while (1) { |
ohneta | 0:cbf811b45305 | 371 | for (int i = 0; i < gReadBufferLength; i++) { |
ohneta | 0:cbf811b45305 | 372 | //aout.write_u16(gReadBuffer[i]); |
ohneta | 0:cbf811b45305 | 373 | LPC_DAC->DACR = gReadBuffer[i]; // 1data output : MAX 3MHz = 333nS |
ohneta | 0:cbf811b45305 | 374 | } |
ohneta | 0:cbf811b45305 | 375 | } |
ohneta | 0:cbf811b45305 | 376 | |
ohneta | 0:cbf811b45305 | 377 | |
ohneta | 0:cbf811b45305 | 378 | int waitus = 0; |
ohneta | 0:cbf811b45305 | 379 | while (1) { |
ohneta | 0:cbf811b45305 | 380 | for (int i = 0; i < gReadBufferLength; i++) { |
ohneta | 0:cbf811b45305 | 381 | LPC_DAC->DACR = gReadBuffer[i]; // 1data output : MAX 3MHz = 333nS |
ohneta | 0:cbf811b45305 | 382 | wait_us(waitus); |
ohneta | 0:cbf811b45305 | 383 | } |
ohneta | 0:cbf811b45305 | 384 | } |
ohneta | 0:cbf811b45305 | 385 | |
ohneta | 0:cbf811b45305 | 386 | } |
ohneta | 0:cbf811b45305 | 387 | |
ohneta | 0:cbf811b45305 | 388 | //----------------------------------------------------------------------- |
ohneta | 0:cbf811b45305 | 389 | //----------------------------------------------------------------------- |