def update(self, distance, pace): self.speedData.eventCount = (self.speedData.eventCount + 1) & 0xff self.speedData.cumulativeDistance = int(distance) & 0xffff self.speedData.instPace = int(pace) # calculate the total time since we instantiated, then convert to 1/1024ths of a second # then truncate to 2 bytes n = datetime.datetime.now() timeDelta = n - self.speedData.startTime fSec = int(timeDelta.total_seconds() * 1024) & 0xffff payload = chr(0x00) # data page 0x00 payload += chr(0xFF) # reserved payload += chr(0xFF) # reserved payload += chr(0xFF) # reserved # event time 1/1024 second, LSB then MSB payload += chr(fSec & 0xff) payload += chr(fSec >> 8) # cumulative revolution count, LSB then MSB payload += chr(self.speedData.cumulativeDistance & 0xff) payload += chr(self.speedData.cumulativeDistance >> 8) print payload.encode("hex") ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) self.antnode.driver.write(ant_msg.encode())
def update(self, power): if VPOWER_DEBUG: print 'PowerMeterTx: update called with power ', power self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff if VPOWER_DEBUG: print 'eventCount ', self.powerData.eventCount self.powerData.cumulativePower = (self.powerData.cumulativePower + int(power)) & 0xffff if VPOWER_DEBUG: print 'cumulativePower ', self.powerData.cumulativePower self.powerData.instantaneousPower = int(power) if VPOWER_DEBUG: print 'instantaneousPower ', self.powerData.instantaneousPower payload = chr(0x10) # standard power-only message payload += chr(self.powerData.eventCount) payload += chr(0xFF) # Pedal power not used payload += chr(0xFF) # Cadence not used payload += chr(self.powerData.cumulativePower & 0xff) payload += chr(self.powerData.cumulativePower >> 8) payload += chr(self.powerData.instantaneousPower & 0xff) payload += chr(self.powerData.instantaneousPower >> 8) ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) sys.stdout.write('+') sys.stdout.flush() if VPOWER_DEBUG: print 'Write message to ANT stick on channel ' + repr( self.channel.number) self.antnode.driver.write(ant_msg.encode())
def update(self, cadence, accPower, power): with self.lock: if VPOWER_DEBUG: print('PowerMeterTx: update called with power ', power) self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff if VPOWER_DEBUG: print('eventCount ', self.powerData.eventCount) self.powerData.cumulativePower = ( self.powerData.cumulativePower + int(power) & 0xffff) if VPOWER_DEBUG: print('cumulativePower ', self.powerData.cumulativePower) self.powerData.instantaneousPower = int(power) if VPOWER_DEBUG: print('instantaneousPower ', self.powerData.instantaneousPower) payload = bytearray(b'\x00' * 8) # standard power-only message payload[0] = 0x10 payload[1] = self.powerData.eventCount payload[2] = 0xFF # Pedal power not used payload[3] = int(cadence) & 0xFF payload[4] = self.powerData.cumulativePower & 0xff payload[5] = self.powerData.cumulativePower >> 8 payload[6] = self.powerData.instantaneousPower & 0xff payload[7] = self.powerData.instantaneousPower >> 8 ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) #sys.stdout.write('+') #sys.stdout.flush() if VPOWER_DEBUG: print('Write message to ANT stick on channel ' + repr(self.channel.number)) self.antnode.send(ant_msg)
def update(self, power, cadence=None): if VPOWER_DEBUG: print('PowerMeterTx: update called with power ', power) self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff if VPOWER_DEBUG: print('eventCount ', self.powerData.eventCount) self.powerData.cumulativePower = (self.powerData.cumulativePower + int(power)) & 0xffff if VPOWER_DEBUG: print('cumulativePower ', self.powerData.cumulativePower) self.powerData.instantaneousPower = int(power) if VPOWER_DEBUG: print('instantaneousPower ', self.powerData.instantaneousPower) payload = bytearray(b'\x10') # standard power-only message payload.append(self.powerData.eventCount) payload.append(0xFF) # Pedal power not used if cadence is None: cadence = 0xFF payload.append(int(cadence) & 0xff) payload.append(self.powerData.cumulativePower & 0xff) payload.append(self.powerData.cumulativePower >> 8) payload.append(self.powerData.instantaneousPower & 0xff) payload.append(self.powerData.instantaneousPower >> 8) ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) print(f'Power: {int(power)} W \r', end="") if VPOWER_DEBUG: print('Write message to ANT stick on channel ' + repr(self.channel.number)) self.antnode.send(ant_msg)
def broadcast(self): self.data_lock.acquire() now = time.time() if self.lastTime != 0: way = self.speed * (now - self.lastTime) / 3.6 + self.remWay rev = int( way / self.wheel + 0.5 ) self.remWay = way - rev * self.wheel self.data.revCounts += rev self.lastTime = now self.data_lock.release() self.data.ucPageChange += 0x20; self.data.ucPageChange &= 0xF0; self.data.ucMessageCount += 1 if self.data.ucMessageCount >= 65: if self.data.ucExtMesgType >= 4: self.data.ucExtMesgType = 1 if self.data.ucExtMesgType == 1: ulElapsedTime2 = int(now/2.0) payload = chr(0x01 | (self.data.ucPageChange & 0x80)) payload += chr((ulElapsedTime2) & 0xFF) payload += chr((ulElapsedTime2 >> 8) & 0xFF) payload += chr((ulElapsedTime2 >> 16) & 0xFF) elif self.data.ucExtMesgType == 2: payload = chr(0x02 | (self.data.ucPageChange & 0x80)) payload += chr(0xFF) # MID payload += chr((self.sensor_id >> 16)& 0xFF) # Serial 17-24 payload += chr((self.sensor_id >> 24) & 0xFF) # Serial 25-32 elif self.data.ucExtMesgType == 3: payload = chr(0x03 | (self.data.ucPageChange & 0x80)) payload += chr(0x01) # HW payload += chr(0x01) # SW payload += chr(0x01) # Model if self.data.ucMessageCount >= 68: self.data.ucMessageCount = 0 self.data.ucExtMesgType += 1 else: payload = chr(self.data.ucPageChange & 0x80) payload += chr(0xFF) payload += chr(0xFF) payload += chr(0xFF) usTime1024 = int(now * 1024) payload += chr(usTime1024 & 0xff) payload += chr((usTime1024 >> 8) & 0xff) payload += chr(self.data.revCounts & 0xff) payload += chr((self.data.revCounts >> 8) & 0xff) #print "Broadcast: %s" % hexlify(payload) ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) self.antnode.driver.write(ant_msg.encode())
def update(self, myWheel, mySpeed): # input mySpeed must be millimeters/sec # Then how much time a wheel rotation ? # Please in milliseconds ... and standard wheel in Simulant is 2200000 micrometers myTick = myWheel / mySpeed # # Bike Speed Event Time # Tricky stuff. Must add to previous time the rotation time # but I have milliseconds to be converted to (sic!) 1/1024 sec # then mod 65536 because of the two bytes range # self.speedData.myNow = self.speedData.oldNow + myTick self.speedData.oldNow = self.speedData.myNow antSlot = int(((self.speedData.myNow / 1000) % 64) * 1024) # and of course add 1 revolution self.speedData.totalRevolutions += 1 # payloads myP4 = (antSlot & 0xff) myP5 = (antSlot >> 8) myP6 = (self.speedData.totalRevolutions & 0xff) myP7 = (self.speedData.totalRevolutions >> 8) try: self.speedData.eventCount = (self.speedData.eventCount + 1) & 0xff myPayload = [0x00] # # 3 byte reserved and set to FF # myPayload.append(0xff) myPayload.append(0xff) myPayload.append(0xff) myPayload.append(myP4) myPayload.append(myP5) myPayload.append(myP6) myPayload.append(myP7) payload = bytearray(myPayload) ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) self.antnode.send(ant_msg) except Exception as e: print ("Exception in SpeedTX: "+repr(e))
def broadcast(self): self.powerData.i += 1 if self.powerData.i % 61 == 15: payload = chr(0x50) # Manufacturer's Info payload += chr(0xFF) payload += chr(0xFF) payload += chr(0x01) # HW Rev payload += chr(0xFF) # MID LSB payload += chr(0x00) # MID MSB payload += chr(0x01) # Model LSB payload += chr(0x00) # Model MSB elif self.powerData.i % 61 == 30: payload = chr(0x51) # Product Info payload += chr(0xFF) payload += chr(0xFF) # SW Rev Supp payload += chr(0x01) # SW Rev Main payload += chr((self.sensor_id >> 0) & 0xFF) # Serial 0-7 payload += chr((self.sensor_id >> 8) & 0xFF) # Serial 8-15 payload += chr((self.sensor_id >> 16) & 0xFF) # Serial 16-23 payload += chr((self.sensor_id >> 24) & 0xFF) # Serial 24-31 else: self.data_lock.acquire() power = self.power cadence = self.cadence self.data_lock.release() self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff self.powerData.cumulativePower = (self.powerData.cumulativePower + int(power)) & 0xffff self.powerData.instantaneousPower = int(power) payload = chr(0x10) # standard power-only message payload += chr(self.powerData.eventCount) payload += chr(0xFF) # Pedal power not used payload += chr(cadence) payload += chr(self.powerData.cumulativePower & 0xff) payload += chr(self.powerData.cumulativePower >> 8) payload += chr(self.powerData.instantaneousPower & 0xff) payload += chr(self.powerData.instantaneousPower >> 8) ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) self.antnode.driver.write(ant_msg.encode())
def update(self, power, cadence): if cadence > 254: cadence = 90 myEventCount = self.powerData.eventCount if myEventCount > 254: myEventCount = 254 # print("Updating power & cadence " +str(power) + " " + str(cadence)) try: if VPOWER_DEBUG: print('PowerMeterTx: update called with power ', power) self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff if VPOWER_DEBUG: print('eventCount ', self.powerData.eventCount) self.powerData.cumulativePower = (self.powerData.cumulativePower + int(power)) & 0xffff if VPOWER_DEBUG: print('cumulativePower ', self.powerData.cumulativePower) self.powerData.instantaneousPower = int(power) if VPOWER_DEBUG: print('instantaneousPower ', self.powerData.instantaneousPower) myPayload = [0x10] # standard power-only message myPayload.append(myEventCount) myPayload.append(0xFF) # Pedal power not used myPayload.append(cadence) # Cadence ?? myPayload.append(self.powerData.cumulativePower & 0xff) myPayload.append(self.powerData.cumulativePower >> 8) myPayload.append(self.powerData.instantaneousPower & 0xff) myPayload.append(self.powerData.instantaneousPower >> 8) payload = bytearray(myPayload) ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) # print("PowerMeter: " +str(payload)) if VPOWER_DEBUG: print('Write message to ANT stick on channel ' + repr(self.channel.number)) self.antnode.send(ant_msg) except Exception as e: print("Exception in PowerMeterTX: " + repr(e))
def update(self, strides, distance, speed): self.page1.update(strides, distance, speed) if self.dataPageCount < 64: # 0-63 payload = self.page1.getMessage() else: # 64 if self.commonPageCount < 2: # 0-1 payload = self.page80.getMessage() else: # 2-3 payload = self.page81.getMessage() self.commonPageCount = (self.commonPageCount + 1) % 4 self.dataPageCount = (self.dataPageCount + 1) % 65 print payload.encode('hex') ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) sys.stdout.write('+') sys.stdout.flush() self.antnode.driver.write(ant_msg.encode())
def update(self, power): # if VPOWER_DEBUG: print('PowerMeterTx: update called with power ', power) self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff # if VPOWER_DEBUG: print('eventCount ', self.powerData.eventCount) self.powerData.cumulativePower = (self.powerData.cumulativePower + int(power)) & 0xffff # if VPOWER_DEBUG: print('cumulativePower ', self.powerData.cumulativePower) self.powerData.instantaneousPower = int(power) # if VPOWER_DEBUG: print('instantaneousPower ', self.powerData.instantaneousPower) payload = bytearray(b'\x10') # standard power-only message payload.append(self.powerData.eventCount) payload.append(0xFF) # Pedal power not used payload.append(0xFF) # Cadence not used payload.append(self.powerData.cumulativePower & 0xff) payload.append(self.powerData.cumulativePower >> 8) payload.append(self.powerData.instantaneousPower & 0xff) payload.append(self.powerData.instantaneousPower >> 8) ant_msg = message.ChannelBroadcastDataMessage(self.channel.number, data=payload) sys.stdout.write('+') sys.stdout.flush() # if VPOWER_DEBUG: print('Write message to ANT stick on channel ' + repr(self.channel.number)) self.antnode.send(ant_msg)
def process(self, msg): if isinstance(msg, message.ChannelEventMessage) and \ msg.getMessageID() == 1 and \ msg.getMessageCode() == EVENT_TX: self.broadcast() elif isinstance(msg, message.ChannelAcknowledgedDataMessage): payload = msg.getPayload() a, page, id_ = struct.unpack('BBB', payload[:3]) if a == 0 and page == 1 and id_ == 0xAA: #print ("ChannelAcknowledgedDataMessage: " + hexlify(payload)) payload = chr(0x01) payload += chr(0xAC) payload += chr(0xFF) payload += chr(0xFF) payload += chr(0xFF) payload += chr(0xFF) payload += chr(0x00) payload += chr(0x00) ant_msg = message.ChannelBroadcastDataMessage( self.channel.number, data=payload) self.antnode.driver.write(ant_msg.encode()) else: print("Message ID %d Code %d" % (msg.getMessageID(), msg.getMessageCode()))