同時公開のFunctionGenerator-DACと同時利用によりファンクション・ジェネレータを実現する。

Dependencies:   BLE_API mbed nRF51822

FunctionGenerator-DAC

/users/ohneta/code/FunctionGenerator-DAC/

詳細は上記、FunctionGenerator-DACでおこないます。

Committer:
ohneta
Date:
Tue Jun 16 07:20:05 2015 +0000
Revision:
0:6e47fe8d8f5c
1st release commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ohneta 0:6e47fe8d8f5c 1 #include "mbed.h"
ohneta 0:6e47fe8d8f5c 2
ohneta 0:6e47fe8d8f5c 3 #include <I2C.h>
ohneta 0:6e47fe8d8f5c 4 #include "BLEDevice.h"
ohneta 0:6e47fe8d8f5c 5 #include "FunctionGenCommands.h"
ohneta 0:6e47fe8d8f5c 6
ohneta 0:6e47fe8d8f5c 7 // prototypes
ohneta 0:6e47fe8d8f5c 8 void connectionCallback(Gap::Handle_t Handle_t,
ohneta 0:6e47fe8d8f5c 9 Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr,
ohneta 0:6e47fe8d8f5c 10 Gap::addr_type_t ownAddrType, const Gap::address_t ownAddr,
ohneta 0:6e47fe8d8f5c 11 const Gap::ConnectionParams_t *params);
ohneta 0:6e47fe8d8f5c 12 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason);
ohneta 0:6e47fe8d8f5c 13 void writeCharCallback(const GattCharacteristicWriteCBParams *params);
ohneta 0:6e47fe8d8f5c 14 void lookme();
ohneta 0:6e47fe8d8f5c 15 void tickerCallback();
ohneta 0:6e47fe8d8f5c 16
ohneta 0:6e47fe8d8f5c 17 //void commandPrint(FGCommand *command);
ohneta 0:6e47fe8d8f5c 18
ohneta 0:6e47fe8d8f5c 19 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 20
ohneta 0:6e47fe8d8f5c 21 Ticker ticker;
ohneta 0:6e47fe8d8f5c 22 Serial pc(P0_9, P0_11);
ohneta 0:6e47fe8d8f5c 23 DigitalOut led1(P0_18);
ohneta 0:6e47fe8d8f5c 24 DigitalOut led2(P0_19);
ohneta 0:6e47fe8d8f5c 25
ohneta 0:6e47fe8d8f5c 26 DigitalOut lookmeOut(P0_21);
ohneta 0:6e47fe8d8f5c 27 I2C i2c(P0_22, P0_20);
ohneta 0:6e47fe8d8f5c 28 const int i2cSlaveAddr = 0x62;
ohneta 0:6e47fe8d8f5c 29
ohneta 0:6e47fe8d8f5c 30 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 31
ohneta 0:6e47fe8d8f5c 32 BLEDevice ble;
ohneta 0:6e47fe8d8f5c 33
ohneta 0:6e47fe8d8f5c 34 const static char DEVICE_NAME[] = "mbedFuncGen 0.01";
ohneta 0:6e47fe8d8f5c 35 static const uint16_t uuid16_list[] = {0xFFFF}; // Custom UUID, FFFF is reserved for development
ohneta 0:6e47fe8d8f5c 36
ohneta 0:6e47fe8d8f5c 37 // Set Up custom Characteristics
ohneta 0:6e47fe8d8f5c 38 static uint8_t deviceValue = 0;
ohneta 0:6e47fe8d8f5c 39 static uint8_t outputValue = 0;
ohneta 0:6e47fe8d8f5c 40 static uint32_t frequencyValue = 0;
ohneta 0:6e47fe8d8f5c 41 static WaveformInfo waveformInfoValue;
ohneta 0:6e47fe8d8f5c 42 static WaveformBlock waveformBlockValue;
ohneta 0:6e47fe8d8f5c 43
ohneta 0:6e47fe8d8f5c 44 WriteOnlyArrayGattCharacteristic<uint8_t, 0> resetChar(CHARACTERISTICS_UUID_RESET, NULL);
ohneta 0:6e47fe8d8f5c 45 ReadWriteArrayGattCharacteristic<uint8_t, 1> deviceChar(CHARACTERISTICS_UUID_DEVICE, &deviceValue);
ohneta 0:6e47fe8d8f5c 46 ReadWriteArrayGattCharacteristic<uint8_t, 1> outputChar(CHARACTERISTICS_UUID_OUTPUT, &outputValue);
ohneta 0:6e47fe8d8f5c 47 ReadWriteArrayGattCharacteristic<uint32_t, 1> frequencyChar(CHARACTERISTICS_UUID_FREQUENCY, &frequencyValue);
ohneta 0:6e47fe8d8f5c 48 WriteOnlyArrayGattCharacteristic<WaveformInfo, 1> waveformInfoChar(CHARACTERISTICS_UUID_WAVEFORMINFO, &waveformInfoValue);
ohneta 0:6e47fe8d8f5c 49 WriteOnlyArrayGattCharacteristic<WaveformBlock, 1> waveformBlockChar(CHARACTERISTICS_UUID_WAVEFORMBLOCK, &waveformBlockValue);
ohneta 0:6e47fe8d8f5c 50 WriteOnlyArrayGattCharacteristic<uint8_t, 0> waveformToBufferChar(CHARACTERISTICS_UUID_WAVEFORMTOBUFFER, NULL);
ohneta 0:6e47fe8d8f5c 51
ohneta 0:6e47fe8d8f5c 52 // Set up custom service
ohneta 0:6e47fe8d8f5c 53 GattCharacteristic *characteristics[] = {
ohneta 0:6e47fe8d8f5c 54 &resetChar,
ohneta 0:6e47fe8d8f5c 55 &deviceChar,
ohneta 0:6e47fe8d8f5c 56 &outputChar,
ohneta 0:6e47fe8d8f5c 57 &frequencyChar,
ohneta 0:6e47fe8d8f5c 58 &waveformInfoChar,
ohneta 0:6e47fe8d8f5c 59 &waveformBlockChar,
ohneta 0:6e47fe8d8f5c 60 &waveformToBufferChar
ohneta 0:6e47fe8d8f5c 61 };
ohneta 0:6e47fe8d8f5c 62 GattService customService( 0xA000,
ohneta 0:6e47fe8d8f5c 63 characteristics,
ohneta 0:6e47fe8d8f5c 64 sizeof(characteristics) / sizeof(GattCharacteristic *) );
ohneta 0:6e47fe8d8f5c 65
ohneta 0:6e47fe8d8f5c 66
ohneta 0:6e47fe8d8f5c 67 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 68 /**
ohneta 0:6e47fe8d8f5c 69 *
ohneta 0:6e47fe8d8f5c 70 */
ohneta 0:6e47fe8d8f5c 71 void connectionCallback(Gap::Handle_t Handle_t,
ohneta 0:6e47fe8d8f5c 72 Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr,
ohneta 0:6e47fe8d8f5c 73 Gap::addr_type_t ownAddrType, const Gap::address_t ownAddr,
ohneta 0:6e47fe8d8f5c 74 const Gap::ConnectionParams_t *params)
ohneta 0:6e47fe8d8f5c 75 {
ohneta 0:6e47fe8d8f5c 76 pc.printf("connectionCallback\n");
ohneta 0:6e47fe8d8f5c 77 }
ohneta 0:6e47fe8d8f5c 78
ohneta 0:6e47fe8d8f5c 79 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 80 /*
ohneta 0:6e47fe8d8f5c 81 * Restart advertising when phone app disconnects
ohneta 0:6e47fe8d8f5c 82 */
ohneta 0:6e47fe8d8f5c 83 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
ohneta 0:6e47fe8d8f5c 84 {
ohneta 0:6e47fe8d8f5c 85 pc.printf("disconnectionCallback\n");
ohneta 0:6e47fe8d8f5c 86 ble.startAdvertising();
ohneta 0:6e47fe8d8f5c 87 }
ohneta 0:6e47fe8d8f5c 88
ohneta 0:6e47fe8d8f5c 89 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 90 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 91 /*
ohneta 0:6e47fe8d8f5c 92 * handle writes to writeCharacteristic
ohneta 0:6e47fe8d8f5c 93 */
ohneta 0:6e47fe8d8f5c 94 void writeCharCallback(const GattCharacteristicWriteCBParams *params)
ohneta 0:6e47fe8d8f5c 95 {
ohneta 0:6e47fe8d8f5c 96 led2 = !led2;
ohneta 0:6e47fe8d8f5c 97
ohneta 0:6e47fe8d8f5c 98 FGPacket fgPacket;
ohneta 0:6e47fe8d8f5c 99
ohneta 0:6e47fe8d8f5c 100 pc.printf("--------\n");
ohneta 0:6e47fe8d8f5c 101 pc.printf("writeCharCallback\n");
ohneta 0:6e47fe8d8f5c 102 {
ohneta 0:6e47fe8d8f5c 103 pc.printf("Data received: length = %d, data = ", params->len);
ohneta 0:6e47fe8d8f5c 104 for(int x = 0; x < params->len; x++) {
ohneta 0:6e47fe8d8f5c 105 pc.printf("%02x ", params->data[x]);
ohneta 0:6e47fe8d8f5c 106 }
ohneta 0:6e47fe8d8f5c 107 pc.printf("\n");
ohneta 0:6e47fe8d8f5c 108 }
ohneta 0:6e47fe8d8f5c 109
ohneta 0:6e47fe8d8f5c 110 if (params->charHandle == resetChar.getValueHandle()) {
ohneta 0:6e47fe8d8f5c 111 pc.printf("resetChar\n");
ohneta 0:6e47fe8d8f5c 112
ohneta 0:6e47fe8d8f5c 113 fgPacket.header.command = FGCommand_Reset;
ohneta 0:6e47fe8d8f5c 114 fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandReset);
ohneta 0:6e47fe8d8f5c 115 //fgPacket.body.commandReset = NULL;
ohneta 0:6e47fe8d8f5c 116
ohneta 0:6e47fe8d8f5c 117 } else
ohneta 0:6e47fe8d8f5c 118 if (params->charHandle == deviceChar.getValueHandle()) {
ohneta 0:6e47fe8d8f5c 119 memcpy(&deviceValue, params->data, params->len);
ohneta 0:6e47fe8d8f5c 120 pc.printf("deviceChar : deviceValue: %x\n", deviceValue);
ohneta 0:6e47fe8d8f5c 121
ohneta 0:6e47fe8d8f5c 122 fgPacket.header.command = FGCommand_Device;
ohneta 0:6e47fe8d8f5c 123 fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandDevice);
ohneta 0:6e47fe8d8f5c 124 fgPacket.body.commandDevice.device = deviceValue;
ohneta 0:6e47fe8d8f5c 125
ohneta 0:6e47fe8d8f5c 126 } else
ohneta 0:6e47fe8d8f5c 127 if (params->charHandle == outputChar.getValueHandle()) {
ohneta 0:6e47fe8d8f5c 128 memcpy(&outputValue, params->data, params->len);
ohneta 0:6e47fe8d8f5c 129 pc.printf("outputChar : outputValue: %x\n", outputValue);
ohneta 0:6e47fe8d8f5c 130
ohneta 0:6e47fe8d8f5c 131 fgPacket.header.command = FGCommand_Output;
ohneta 0:6e47fe8d8f5c 132 fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandOutput);
ohneta 0:6e47fe8d8f5c 133 fgPacket.body.commandOutput.on = outputValue;
ohneta 0:6e47fe8d8f5c 134
ohneta 0:6e47fe8d8f5c 135 } else
ohneta 0:6e47fe8d8f5c 136 if (params->charHandle == frequencyChar.getValueHandle()) {
ohneta 0:6e47fe8d8f5c 137 memcpy(&frequencyValue, params->data, params->len);
ohneta 0:6e47fe8d8f5c 138 pc.printf("frequencyChar\n");
ohneta 0:6e47fe8d8f5c 139 pc.printf("frequencyValue: %d (0x%x)\n", frequencyValue, frequencyValue);
ohneta 0:6e47fe8d8f5c 140
ohneta 0:6e47fe8d8f5c 141 fgPacket.header.command = FGCommand_Frequency;
ohneta 0:6e47fe8d8f5c 142 fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandFrequency);
ohneta 0:6e47fe8d8f5c 143 fgPacket.body.commandFrequency.frequency = frequencyValue;
ohneta 0:6e47fe8d8f5c 144
ohneta 0:6e47fe8d8f5c 145 } else
ohneta 0:6e47fe8d8f5c 146 if (params->charHandle == waveformInfoChar.getValueHandle()) {
ohneta 0:6e47fe8d8f5c 147 memcpy(&waveformInfoValue, params->data, params->len);
ohneta 0:6e47fe8d8f5c 148 pc.printf("waveformInfoChar\n");
ohneta 0:6e47fe8d8f5c 149 pc.printf("FGCommandWaveformInfo.waveSize: %d\n", waveformInfoValue.waveSize);
ohneta 0:6e47fe8d8f5c 150 pc.printf(" bitPerData: %d\n", waveformInfoValue.bitPerData);
ohneta 0:6e47fe8d8f5c 151 pc.printf(" blockSize: %d\n", waveformInfoValue.blockSize);
ohneta 0:6e47fe8d8f5c 152 pc.printf(" blockMaxNum: %d\n", waveformInfoValue.blockMaxNum);
ohneta 0:6e47fe8d8f5c 153
ohneta 0:6e47fe8d8f5c 154 fgPacket.header.command = FGCommand_WaveformInfo;
ohneta 0:6e47fe8d8f5c 155 fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandWaveformInfo);
ohneta 0:6e47fe8d8f5c 156 fgPacket.body.commandWaveformInfo = waveformInfoValue;
ohneta 0:6e47fe8d8f5c 157
ohneta 0:6e47fe8d8f5c 158 } else
ohneta 0:6e47fe8d8f5c 159 if (params->charHandle == waveformBlockChar.getValueHandle()) {
ohneta 0:6e47fe8d8f5c 160 memcpy(&waveformBlockValue, params->data, params->len);
ohneta 0:6e47fe8d8f5c 161 pc.printf("waveformBlockChar\n");
ohneta 0:6e47fe8d8f5c 162 pc.printf("waveformBlockChar.blockNo: %d\n", waveformBlockValue.blockNo);
ohneta 0:6e47fe8d8f5c 163 pc.printf(" length: %d\n", waveformBlockValue.length);
ohneta 0:6e47fe8d8f5c 164 pc.printf(" buffer: ");
ohneta 0:6e47fe8d8f5c 165 for (int i = 0; i < waveformBlockValue.length; i++) {
ohneta 0:6e47fe8d8f5c 166 pc.printf("%02x ", waveformBlockValue.buffer[i]);
ohneta 0:6e47fe8d8f5c 167 }
ohneta 0:6e47fe8d8f5c 168 pc.printf("\n");
ohneta 0:6e47fe8d8f5c 169
ohneta 0:6e47fe8d8f5c 170 fgPacket.header.command = FGCommand_WaveformBlock;
ohneta 0:6e47fe8d8f5c 171 fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandWaveformBlock);
ohneta 0:6e47fe8d8f5c 172 fgPacket.body.commandWaveformBlock = waveformBlockValue;
ohneta 0:6e47fe8d8f5c 173
ohneta 0:6e47fe8d8f5c 174 } else
ohneta 0:6e47fe8d8f5c 175 if (params->charHandle == waveformToBufferChar.getValueHandle()) {
ohneta 0:6e47fe8d8f5c 176 pc.printf("waveformToBufferChar : non\n");
ohneta 0:6e47fe8d8f5c 177
ohneta 0:6e47fe8d8f5c 178 fgPacket.header.command = FGCommand_WaveformToBuffer;
ohneta 0:6e47fe8d8f5c 179 fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommand_WaveformToBuffer);
ohneta 0:6e47fe8d8f5c 180 //fgPacket.body.commandWaveformToBuffer = NULL;
ohneta 0:6e47fe8d8f5c 181 }
ohneta 0:6e47fe8d8f5c 182
ohneta 0:6e47fe8d8f5c 183
ohneta 0:6e47fe8d8f5c 184 // I2C送信
ohneta 0:6e47fe8d8f5c 185 {
ohneta 0:6e47fe8d8f5c 186 lookme();
ohneta 0:6e47fe8d8f5c 187 int ret = i2c.write(i2cSlaveAddr, (const char *)&fgPacket, fgPacket.header.length);
ohneta 0:6e47fe8d8f5c 188 pc.printf("I2C ret: %d \n", ret);
ohneta 0:6e47fe8d8f5c 189
ohneta 0:6e47fe8d8f5c 190 //ble.updateCharacteristicValue(readChar.getValueHandle(),params->data,params->len);
ohneta 0:6e47fe8d8f5c 191 }
ohneta 0:6e47fe8d8f5c 192 }
ohneta 0:6e47fe8d8f5c 193
ohneta 0:6e47fe8d8f5c 194 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 195 // 要調整
ohneta 0:6e47fe8d8f5c 196 void lookme()
ohneta 0:6e47fe8d8f5c 197 {
ohneta 0:6e47fe8d8f5c 198 lookmeOut = 0;
ohneta 0:6e47fe8d8f5c 199 wait_ms(5);
ohneta 0:6e47fe8d8f5c 200 lookmeOut = 1;
ohneta 0:6e47fe8d8f5c 201 wait_ms(5);
ohneta 0:6e47fe8d8f5c 202 lookmeOut = 0;
ohneta 0:6e47fe8d8f5c 203 }
ohneta 0:6e47fe8d8f5c 204
ohneta 0:6e47fe8d8f5c 205 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 206 unsigned long gTickerCount = 0;
ohneta 0:6e47fe8d8f5c 207
ohneta 0:6e47fe8d8f5c 208 void tickerCallback()
ohneta 0:6e47fe8d8f5c 209 {
ohneta 0:6e47fe8d8f5c 210 led1 = !led1;
ohneta 0:6e47fe8d8f5c 211 gTickerCount++;
ohneta 0:6e47fe8d8f5c 212 }
ohneta 0:6e47fe8d8f5c 213
ohneta 0:6e47fe8d8f5c 214 //---------------------------------------------------------
ohneta 0:6e47fe8d8f5c 215 /*
ohneta 0:6e47fe8d8f5c 216 * main loop
ohneta 0:6e47fe8d8f5c 217 */
ohneta 0:6e47fe8d8f5c 218 int main(void)
ohneta 0:6e47fe8d8f5c 219 {
ohneta 0:6e47fe8d8f5c 220 ticker.attach(&tickerCallback, 0.5);
ohneta 0:6e47fe8d8f5c 221 i2c.frequency(100000);
ohneta 0:6e47fe8d8f5c 222
ohneta 0:6e47fe8d8f5c 223 pc.baud(115200);
ohneta 0:6e47fe8d8f5c 224 pc.printf("\n");
ohneta 0:6e47fe8d8f5c 225 pc.printf("mbed function generator BLE translator\n");
ohneta 0:6e47fe8d8f5c 226 pc.printf("--\n");
ohneta 0:6e47fe8d8f5c 227
ohneta 0:6e47fe8d8f5c 228
ohneta 0:6e47fe8d8f5c 229 ble.init();
ohneta 0:6e47fe8d8f5c 230 ble.onConnection(connectionCallback);
ohneta 0:6e47fe8d8f5c 231 ble.onDisconnection(disconnectionCallback);
ohneta 0:6e47fe8d8f5c 232
ohneta 0:6e47fe8d8f5c 233 ble.onDataWritten(writeCharCallback); // 書き込まれたときのコールバック
ohneta 0:6e47fe8d8f5c 234 //ble_error_t err = ble.onDataRead(readCharCallback); // 読み込まれたときのコールバック
ohneta 0:6e47fe8d8f5c 235
ohneta 0:6e47fe8d8f5c 236 /*
ohneta 0:6e47fe8d8f5c 237 void onDataSent (void(*callback)(unsigned count))
ohneta 0:6e47fe8d8f5c 238 void onDataWritten (void(*callback)(const GattCharacteristicWriteCBParams *eventDataP))
ohneta 0:6e47fe8d8f5c 239 ble_error_t onDataRead (void(*callback)(const GattCharacteristicReadCBParams *eventDataP))
ohneta 0:6e47fe8d8f5c 240 void onRadioNotification (Gap::RadioNotificationEventCallback_t callback)
ohneta 0:6e47fe8d8f5c 241
ohneta 0:6e47fe8d8f5c 242 */
ohneta 0:6e47fe8d8f5c 243
ohneta 0:6e47fe8d8f5c 244 // setup advertising
ohneta 0:6e47fe8d8f5c 245 {
ohneta 0:6e47fe8d8f5c 246 // BLE only, no classic BT
ohneta 0:6e47fe8d8f5c 247 ble.accumulateAdvertisingPayload( GapAdvertisingData::BREDR_NOT_SUPPORTED |
ohneta 0:6e47fe8d8f5c 248 GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
ohneta 0:6e47fe8d8f5c 249 // advertising type
ohneta 0:6e47fe8d8f5c 250 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
ohneta 0:6e47fe8d8f5c 251 // add name
ohneta 0:6e47fe8d8f5c 252 ble.accumulateAdvertisingPayload( GapAdvertisingData::COMPLETE_LOCAL_NAME,
ohneta 0:6e47fe8d8f5c 253 (uint8_t *)DEVICE_NAME,
ohneta 0:6e47fe8d8f5c 254 sizeof(DEVICE_NAME) );
ohneta 0:6e47fe8d8f5c 255 // UUID's broadcast in advertising packet
ohneta 0:6e47fe8d8f5c 256 ble.accumulateAdvertisingPayload( GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
ohneta 0:6e47fe8d8f5c 257 (uint8_t *)uuid16_list,
ohneta 0:6e47fe8d8f5c 258 sizeof(uuid16_list) );
ohneta 0:6e47fe8d8f5c 259 ble.setAdvertisingInterval(100); // interval is 100ms.
ohneta 0:6e47fe8d8f5c 260 // add my service
ohneta 0:6e47fe8d8f5c 261 ble.addService(customService);
ohneta 0:6e47fe8d8f5c 262
ohneta 0:6e47fe8d8f5c 263 // start advertising
ohneta 0:6e47fe8d8f5c 264 ble.startAdvertising();
ohneta 0:6e47fe8d8f5c 265 }
ohneta 0:6e47fe8d8f5c 266
ohneta 0:6e47fe8d8f5c 267
ohneta 0:6e47fe8d8f5c 268
ohneta 0:6e47fe8d8f5c 269 while (true) {
ohneta 0:6e47fe8d8f5c 270 ble.waitForEvent();
ohneta 0:6e47fe8d8f5c 271 #if 0
ohneta 0:6e47fe8d8f5c 272 {
ohneta 0:6e47fe8d8f5c 273 led2 = 0; wait(0.1);
ohneta 0:6e47fe8d8f5c 274 led2 = 1; wait(0.2);
ohneta 0:6e47fe8d8f5c 275 led2 = 0; wait(0.1);
ohneta 0:6e47fe8d8f5c 276 led2 = 1; wait(0.2);
ohneta 0:6e47fe8d8f5c 277 led2 = 0; wait(0.1);
ohneta 0:6e47fe8d8f5c 278 led2 = 1; wait(0.2);
ohneta 0:6e47fe8d8f5c 279 led2 = 0; wait(0.1);
ohneta 0:6e47fe8d8f5c 280 led2 = 1; wait(0.2);
ohneta 0:6e47fe8d8f5c 281 led2 = 0;
ohneta 0:6e47fe8d8f5c 282 }
ohneta 0:6e47fe8d8f5c 283 #endif
ohneta 0:6e47fe8d8f5c 284 led2 = !led2;
ohneta 0:6e47fe8d8f5c 285 }
ohneta 0:6e47fe8d8f5c 286 }