|  | 
|  | 1 | +/********************************************** | 
|  | 2 | + * AntPlus LEV Display example | 
|  | 3 | + * | 
|  | 4 | + * Finds a nearby LEV Sensor, pairs | 
|  | 5 | + * to it and then reads the information | 
|  | 6 | + * out via the serial port. | 
|  | 7 | + * | 
|  | 8 | + * Author Bernd Woköck | 
|  | 9 | + * based on the work of Curtis Malainey | 
|  | 10 | + **********************************************/ | 
|  | 11 | +#include <Arduino.h> | 
|  | 12 | +#include "ANT.h" | 
|  | 13 | +#include "ANTPLUS.h" | 
|  | 14 | + | 
|  | 15 | +#define BAUD_RATE 9600 | 
|  | 16 | +#define CHANNEL_0 0 | 
|  | 17 | +#define CHANNEL_1 1 | 
|  | 18 | + | 
|  | 19 | +const uint8_t NETWORK_KEY[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }; | 
|  | 20 | + | 
|  | 21 | +AntWithCallbacks ant = AntWithCallbacks(); | 
|  | 22 | +AntPlusRouter router = AntPlusRouter(); | 
|  | 23 | +ProfileLevDisplay lev = ProfileLevDisplay(); | 
|  | 24 | + | 
|  | 25 | +void levBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data); | 
|  | 26 | +void levSpeedSysinfo1Handler(LevSpeedSysinfo1& msg, uintptr_t data); | 
|  | 27 | +void levSpeedDist1Handler(LevSpeedDist1& msg, uintptr_t data); | 
|  | 28 | +void levSpeedDist2Handler(LevSpeedDist2& msg, uintptr_t data); | 
|  | 29 | +void levSpeedSysinfo2Handler(LevSpeedSysinfo2& msg, uintptr_t data); | 
|  | 30 | +void levBatteryInfo(LevBatteryInfo& msg, uintptr_t data); | 
|  | 31 | +void levAntChannelEvent(ChannelEventResponse& msg, uintptr_t data); | 
|  | 32 | + | 
|  | 33 | +void manufacturersInformationDataPageHandler(ManufacturersInformation& msg, uintptr_t data); | 
|  | 34 | +void productInformationDataPageHandler(ProductInformation& msg, uintptr_t data); | 
|  | 35 | + | 
|  | 36 | +void printStatus(uint8_t status); | 
|  | 37 | + | 
|  | 38 | +void setup() { | 
|  | 39 | + Serial2.begin(BAUD_RATE); | 
|  | 40 | + ant.setSerial(Serial2); | 
|  | 41 | + delay(1000); | 
|  | 42 | + | 
|  | 43 | + router.setDriver(&ant); // never touch ant again | 
|  | 44 | + router.setAntPlusNetworkKey(NETWORK_KEY); | 
|  | 45 | + router.setProfile(CHANNEL_0, &lev); | 
|  | 46 | + | 
|  | 47 | + Serial.begin(BAUD_RATE); | 
|  | 48 | + Serial.println("Running"); | 
|  | 49 | + | 
|  | 50 | +// setup lev display | 
|  | 51 | + lev.onDataPage(levBaseDataPageHandler); | 
|  | 52 | +lev.onLevSpeedSysinfo1(levSpeedSysinfo1Handler); | 
|  | 53 | +lev.onLevSpeedDist1(levSpeedDist1Handler); | 
|  | 54 | +lev.onLevSpeedDist2(levSpeedDist2Handler); | 
|  | 55 | +lev.onLevSpeedSysinfo2(levSpeedSysinfo2Handler); | 
|  | 56 | +lev.onLevBatteryInfo(levBatteryInfo); | 
|  | 57 | +lev.onLevCaps(levCaps); | 
|  | 58 | +lev.onManufacturersInformation(manufacturersInformationDataPageHandler); | 
|  | 59 | +lev.onProductInformation(productInformationDataPageHandler); | 
|  | 60 | +lev.onChannelEvent(levAntChannelEvent); | 
|  | 61 | +lev.begin(); | 
|  | 62 | +delay(100); // wait for module initialization | 
|  | 63 | + | 
|  | 64 | + // wait for pair to complete | 
|  | 65 | + uint8_t status = lev.waitForPair(); | 
|  | 66 | + | 
|  | 67 | +// print channel status | 
|  | 68 | + Serial.println("==========================="); | 
|  | 69 | + printStatus(status); | 
|  | 70 | + Serial.print("Device Number: "); | 
|  | 71 | + Serial.println(lev.getDeviceNumber()); | 
|  | 72 | + Serial.print("Transmisison Type: "); | 
|  | 73 | + Serial.println(lev.getTransmissionType()); | 
|  | 74 | +} | 
|  | 75 | + | 
|  | 76 | +void loop() { | 
|  | 77 | + router.loop(); | 
|  | 78 | +} | 
|  | 79 | + | 
|  | 80 | +void levAntChannelEvent(ChannelEventResponse& msg, uintptr_t data) { | 
|  | 81 | +if (msg.getCode() == STATUS_EVENT_CHANNEL_CLOSED) | 
|  | 82 | +{ | 
|  | 83 | +Serial.println("channel closed - reconnect"); | 
|  | 84 | +lev.begin(); | 
|  | 85 | +} | 
|  | 86 | +} | 
|  | 87 | + | 
|  | 88 | +void levBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data) { | 
|  | 89 | +LevBaseMainDataPage dp = LevBaseMainDataPage(msg); | 
|  | 90 | + Serial.println("==========================="); | 
|  | 91 | + Serial.print("DataPage: "); | 
|  | 92 | + Serial.println(dp.getDataPageNumber()); | 
|  | 93 | + | 
|  | 94 | +// debug | 
|  | 95 | +int l = msg.getDataLength(); | 
|  | 96 | +uint8_t * buf = msg.getData(); | 
|  | 97 | +for (int i = 0; i < l; i++) | 
|  | 98 | +{ | 
|  | 99 | +Serial.print(buf[i], HEX); Serial.print(" "); | 
|  | 100 | +} | 
|  | 101 | +Serial.println(""); | 
|  | 102 | +} | 
|  | 103 | + | 
|  | 104 | +void levSpeedSysinfo1Handler(LevSpeedSysinfo1& msg, uintptr_t data) { | 
|  | 105 | +Serial.print("Temp state: "); | 
|  | 106 | +Serial.println(msg.getTempState()); | 
|  | 107 | +Serial.print("Travel mode state: "); | 
|  | 108 | +Serial.println(msg.getTravelModeState()); | 
|  | 109 | +Serial.print("System state: "); | 
|  | 110 | +Serial.println(msg.getSystemState()); | 
|  | 111 | +Serial.print("Gear state: "); | 
|  | 112 | +Serial.println(msg.getGearState()); | 
|  | 113 | +Serial.print("Gear error: "); | 
|  | 114 | +Serial.println(msg.getError()); | 
|  | 115 | +Serial.print("Speed: "); | 
|  | 116 | +Serial.print(msg.getSpeed()/10); | 
|  | 117 | +Serial.print("."); | 
|  | 118 | +Serial.println(msg.getSpeed() % 10); | 
|  | 119 | +} | 
|  | 120 | + | 
|  | 121 | +void levSpeedDist1Handler(LevSpeedDist1& msg, uintptr_t data) { | 
|  | 122 | +Serial.print("Total dist: "); | 
|  | 123 | +Serial.println((float)msg.getTotalDist() / 100); | 
|  | 124 | +Serial.print("Remaining range: "); | 
|  | 125 | +Serial.println(msg.getRemainingRange()); | 
|  | 126 | +Serial.print("Speed: "); | 
|  | 127 | +Serial.print(msg.getSpeed() / 10); | 
|  | 128 | +Serial.print("."); | 
|  | 129 | +Serial.println(msg.getSpeed() % 10); | 
|  | 130 | +} | 
|  | 131 | + | 
|  | 132 | +void levSpeedDist2Handler(LevSpeedDist2& msg, uintptr_t data) { | 
|  | 133 | +Serial.print("Total dist: "); | 
|  | 134 | +Serial.println((float)msg.getTotalDist() / 100); | 
|  | 135 | +Serial.print("Fuel consumption: "); | 
|  | 136 | +Serial.println(msg.getFuelConsumption()); | 
|  | 137 | +Serial.print("Speed: "); | 
|  | 138 | +Serial.print(msg.getSpeed() / 10); | 
|  | 139 | +Serial.print("."); | 
|  | 140 | +Serial.println(msg.getSpeed() % 10); | 
|  | 141 | +} | 
|  | 142 | + | 
|  | 143 | +void levSpeedSysinfo2Handler(LevSpeedSysinfo2& msg, uintptr_t data) { | 
|  | 144 | +Serial.print("Battery SOC: "); | 
|  | 145 | +Serial.println(msg.getBatterySOC()); | 
|  | 146 | +Serial.print("Travel mode state: "); | 
|  | 147 | +Serial.println(msg.getTravelModeState()); | 
|  | 148 | +Serial.print("System state: "); | 
|  | 149 | +Serial.println(msg.getSystemState()); | 
|  | 150 | +Serial.print("Gear state: "); | 
|  | 151 | +Serial.println(msg.getGearState()); | 
|  | 152 | +Serial.print("Percent Assist: "); | 
|  | 153 | +Serial.println(msg.getPercentAssist()); | 
|  | 154 | +Serial.print("Speed: "); | 
|  | 155 | +Serial.print(msg.getSpeed() / 10); | 
|  | 156 | +Serial.print("."); | 
|  | 157 | +Serial.println(msg.getSpeed() % 10); | 
|  | 158 | +} | 
|  | 159 | + | 
|  | 160 | +void levBatteryInfo(LevBatteryInfo& msg, uintptr_t data) { | 
|  | 161 | +Serial.print("Charging Cycle Count: "); | 
|  | 162 | +Serial.println(msg.getChargingCycleCount()); | 
|  | 163 | +Serial.print("Fuel consumption: "); | 
|  | 164 | +Serial.println(msg.getFuelConsumption()); | 
|  | 165 | +Serial.print("Battery voltage: "); | 
|  | 166 | +Serial.println(msg.getBatteryVoltage()); | 
|  | 167 | +Serial.print("Distance on current charge: "); | 
|  | 168 | +Serial.println(msg.getDistanceOnCurrentCharge()); | 
|  | 169 | +} | 
|  | 170 | + | 
|  | 171 | +void levCaps(LevCaps& msg, uintptr_t data) { | 
|  | 172 | +Serial.print("Travel modes supported: "); | 
|  | 173 | +Serial.println(msg.getTravelModesSupported()); | 
|  | 174 | +Serial.print("Wheel circumference: "); | 
|  | 175 | +Serial.println(msg.getWheelCircumference()); | 
|  | 176 | +} | 
|  | 177 | + | 
|  | 178 | +void manufacturersInformationDataPageHandler(ManufacturersInformation& msg, uintptr_t data) { | 
|  | 179 | +Serial.print("DataPage: "); | 
|  | 180 | +Serial.println(msg.getDataPageNumber()); | 
|  | 181 | +Serial.print("HW Revision: "); | 
|  | 182 | +Serial.println(msg.getHWRevision()); | 
|  | 183 | +Serial.print("ManufacturerID: "); | 
|  | 184 | +Serial.println(msg.getManufacturerID()); | 
|  | 185 | +Serial.print("Model Number: "); | 
|  | 186 | +Serial.println(msg.getModelNumber()); | 
|  | 187 | +} | 
|  | 188 | + | 
|  | 189 | +void productInformationDataPageHandler(ProductInformation& msg, uintptr_t data) { | 
|  | 190 | +Serial.print("DataPage: "); | 
|  | 191 | +Serial.println(msg.getDataPageNumber()); | 
|  | 192 | +Serial.print("SW Revision Supplemental: "); | 
|  | 193 | +Serial.println(msg.getSWRevisionSupplemental()); | 
|  | 194 | +Serial.print("SW Revision Main: "); | 
|  | 195 | +Serial.println(msg.getSWRevisionMain()); | 
|  | 196 | +Serial.print("Serial Number: "); | 
|  | 197 | +Serial.println(msg.getSerialNumber()); | 
|  | 198 | +} | 
|  | 199 | + | 
|  | 200 | +void printStatus(uint8_t status) { | 
|  | 201 | +Serial.print("Channel Status: "); | 
|  | 202 | +switch (status) { | 
|  | 203 | +case CHANNEL_STATUS_UNASSIGNED: | 
|  | 204 | +Serial.println("Unassigned"); | 
|  | 205 | +break; | 
|  | 206 | +case CHANNEL_STATUS_ASSIGNED: | 
|  | 207 | +Serial.println("Assigned"); | 
|  | 208 | +break; | 
|  | 209 | +case CHANNEL_STATUS_SEARCHING: | 
|  | 210 | +Serial.println("Searching"); | 
|  | 211 | +break; | 
|  | 212 | +case CHANNEL_STATUS_TRACKING: | 
|  | 213 | +Serial.println("Tracking"); | 
|  | 214 | +break; | 
|  | 215 | +} | 
|  | 216 | +} | 
|  | 217 | + | 
0 commit comments