示例#1
0
    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())
示例#2
0
    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())
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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())
示例#6
0
文件: SpeedTx.py 项目: mch/python-ant
    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))
示例#7
0
    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())
示例#8
0
    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())
示例#10
0
    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)
示例#11
0
 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()))