This commit is contained in:
Harald Hoyer 2017-04-25 15:31:37 +02:00
parent f0ae72f25f
commit 3bba1241d6
6 changed files with 99 additions and 36 deletions

View file

@ -25,13 +25,14 @@ class PowerMeterTx(object):
self.antnode = antnode self.antnode = antnode
self.power = 0 self.power = 0
self.cadence = 0 self.cadence = 0
self.sensor_id = sensor_id
# Get the channel # Get the channel
self.channel = antnode.getFreeChannel() self.channel = antnode.getFreeChannel()
try: try:
self.channel.name = 'C:POWER' self.channel.name = 'C:POWER'
self.channel.assign('N:ANT+', CHANNEL_TYPE_TWOWAY_TRANSMIT) self.channel.assign('N:ANT+', CHANNEL_TYPE_TWOWAY_TRANSMIT)
self.channel.setID(POWER_DEVICE_TYPE, sensor_id, 0) self.channel.setID(POWER_DEVICE_TYPE, sensor_id & 0xFFFF, 5)
self.channel.setPeriod(8182) self.channel.setPeriod(8182)
self.channel.setFrequency(57) self.channel.setFrequency(57)
except ChannelError as e: except ChannelError as e:
@ -80,7 +81,7 @@ class PowerMeterTx(object):
# Power was updated, so send out an ANT+ message # Power was updated, so send out an ANT+ message
def broadcast(self): def broadcast(self):
self.powerData.i += 1 self.powerData.i += 1
if self.powerData.i % 121 == 30: if self.powerData.i % 61 == 15:
payload = chr(0x50) # Manufacturer's Info payload = chr(0x50) # Manufacturer's Info
payload += chr(0xFF) payload += chr(0xFF)
payload += chr(0xFF) payload += chr(0xFF)
@ -90,23 +91,25 @@ class PowerMeterTx(object):
payload += chr(0x01) # Model LSB payload += chr(0x01) # Model LSB
payload += chr(0x00) # Model MSB payload += chr(0x00) # Model MSB
elif self.powerData.i % 121 == 60: elif self.powerData.i % 61 == 30:
payload = chr(0x51) # Product Info payload = chr(0x51) # Product Info
payload += chr(0xFF) payload += chr(0xFF)
payload += chr(0xFF) # SW Rev Supp payload += chr(0xFF) # SW Rev Supp
payload += chr(0x01) # SW Rev Main payload += chr(0x01) # SW Rev Main
payload += chr(0xFF) # Serial 0-7 payload += chr((self.sensor_id >> 0)& 0xFF) # Serial 0-7
payload += chr(0xFF) payload += chr((self.sensor_id >> 8)& 0xFF) # Serial 8-15
payload += chr(0xFF) payload += chr((self.sensor_id >> 16)& 0xFF) # Serial 16-23
payload += chr(0xFF) # Serial 24-31 payload += chr((self.sensor_id >> 24)& 0xFF) # Serial 24-31
else: else:
self.data_lock.acquire() self.data_lock.acquire()
power = self.power power = self.power
cadence = self.cadence cadence = self.cadence
self.data_lock.release() self.data_lock.release()
self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff self.powerData.eventCount = (self.powerData.eventCount + 1) & 0xff
self.powerData.cumulativePower = (self.powerData.cumulativePower + int(power)) & 0xffff self.powerData.cumulativePower = (self.powerData.cumulativePower + int(power)) & 0xffff
self.powerData.instantaneousPower = int(power) self.powerData.instantaneousPower = int(power)
payload = chr(0x10) # standard power-only message payload = chr(0x10) # standard power-only message
payload += chr(self.powerData.eventCount) payload += chr(self.powerData.eventCount)
payload += chr(0xFF) # Pedal power not used payload += chr(0xFF) # Pedal power not used

View file

@ -20,7 +20,7 @@ class SpeedTx(object):
self.ucMessageCount = 0 self.ucMessageCount = 0
self.ulRunTime = 0 self.ulRunTime = 0
self.ucPageChange = 0 self.ucPageChange = 0
self.ucExtMesgType = 0 self.ucExtMesgType = 1
def __init__(self, antnode, sensor_id, wheel = 0.100): def __init__(self, antnode, sensor_id, wheel = 0.100):
self.antnode = antnode self.antnode = antnode
@ -28,12 +28,13 @@ class SpeedTx(object):
self.lastTime = 0 self.lastTime = 0
self.wheel = wheel self.wheel = wheel
self.remWay = 0 self.remWay = 0
self.sensor_id = sensor_id
# Get the channel # Get the channel
self.channel = antnode.getFreeChannel() self.channel = antnode.getFreeChannel()
try: try:
self.channel.name = 'C:SPEED' self.channel.name = 'C:SPEED'
self.channel.assign('N:ANT+', CHANNEL_TYPE_TWOWAY_TRANSMIT) self.channel.assign('N:ANT+', CHANNEL_TYPE_TWOWAY_TRANSMIT)
self.channel.setID(SPEED_DEVICE_TYPE, sensor_id, 0) self.channel.setID(SPEED_DEVICE_TYPE, sensor_id & 0xFFFF, 1)
self.channel.setPeriod(8118) self.channel.setPeriod(8118)
self.channel.setFrequency(57) self.channel.setFrequency(57)
except ChannelError as e: except ChannelError as e:
@ -64,8 +65,8 @@ class SpeedTx(object):
self.broadcast() self.broadcast()
def broadcast(self): def broadcast(self):
now = time.time()
self.data_lock.acquire() self.data_lock.acquire()
now = time.time()
if self.lastTime != 0: if self.lastTime != 0:
way = self.speed * (now - self.lastTime) / 3.6 + self.remWay way = self.speed * (now - self.lastTime) / 3.6 + self.remWay
rev = int( way / self.wheel + 0.5 ) rev = int( way / self.wheel + 0.5 )
@ -73,34 +74,36 @@ class SpeedTx(object):
self.data.revCounts += rev self.data.revCounts += rev
self.lastTime = now self.lastTime = now
self.data_lock.release() self.data_lock.release()
#print "Rev: %d Way: %f" % (rev, way)
self.data.ucPageChange += 0x20; self.data.ucPageChange += 0x20;
self.data.ucPageChange &= 0xF0; self.data.ucPageChange &= 0xF0;
self.data.ucMessageCount += 1 self.data.ucMessageCount += 1
if self.data.ucMessageCount >= 65: if self.data.ucMessageCount >= 65:
self.data.ucMessageCount = 0
self.data.ucExtMesgType += 1
if self.data.ucExtMesgType >= 4: if self.data.ucExtMesgType >= 4:
self.data.ucExtMesgType = 1 self.data.ucExtMesgType = 1
if self.data.ucExtMesgType == 1: if self.data.ucExtMesgType == 1:
ulElapsedTime2 = int(now/2) ulElapsedTime2 = int(now/2.0)
payload = chr(0x01) payload = chr(0x01 | (self.data.ucPageChange & 0x80))
payload += chr((ulElapsedTime2) & 0xFF)
payload += chr((ulElapsedTime2 >> 8) & 0xFF) payload += chr((ulElapsedTime2 >> 8) & 0xFF)
payload += chr((ulElapsedTime2 >> 16) & 0xFF) payload += chr((ulElapsedTime2 >> 16) & 0xFF)
payload += chr((ulElapsedTime2 >> 24) & 0xFF)
elif self.data.ucExtMesgType == 2: elif self.data.ucExtMesgType == 2:
payload = chr(0x02) payload = chr(0x02 | (self.data.ucPageChange & 0x80))
payload += chr(0x02) payload += chr(0xFF) # MID
payload += chr(0xFE) payload += chr((self.sensor_id >> 16)& 0xFF) # Serial 17-24
payload += chr(0x21) payload += chr((self.sensor_id >> 24) & 0xFF) # Serial 25-32
elif self.data.ucExtMesgType == 3: elif self.data.ucExtMesgType == 3:
payload = chr(0x03) payload = chr(0x03 | (self.data.ucPageChange & 0x80))
payload += chr(0x01) payload += chr(0x01) # HW
payload += chr(0x01) payload += chr(0x01) # SW
payload += chr(0x01) payload += chr(0x01) # Model
if self.data.ucMessageCount >= 68:
self.data.ucMessageCount = 0
self.data.ucExtMesgType += 1
else: else:
payload = chr(self.data.ucPageChange & 0x80) payload = chr(self.data.ucPageChange & 0x80)
payload += chr(0xFF) payload += chr(0xFF)

View file

@ -1,20 +1,17 @@
CADENCE_DEVICE_TYPE = 0x7A CADENCE_DEVICE_TYPE = 0x7A
SPEED2_DEVICE_TYPE = 0x0F
SPEED_DEVICE_TYPE = 0x7B SPEED_DEVICE_TYPE = 0x7B
SPEED_CADENCE_DEVICE_TYPE = 0x79 SPEED_CADENCE_DEVICE_TYPE = 0x79
POWER_DEVICE_TYPE = 0x0B POWER_DEVICE_TYPE = 0x0B
# Get the serial number of Raspberry Pi # Get the serial number of Raspberry Pi
def getserial(): def getserial():
# Extract serial from cpuinfo file machineid = "0000000000000000"
cpuserial = "0000000000000000"
try: try:
f = open('/proc/cpuinfo', 'r') f = open('/etc/machine-id', 'r')
for line in f: machineid = f.readline()
if line[0:6] == 'Serial':
cpuserial = line[10:26]
f.close() f.close()
except: except:
cpuserial = "ERROR000000000" machineid = "ERROR000000000"
return cpuserial return machineid

View file

@ -9,7 +9,7 @@ from iConst import *
power_meter = None power_meter = None
POWER_SENSOR_ID = int(int(hashlib.md5(getserial()).hexdigest(), 16) & 0xfffe) + 1 POWER_SENSOR_ID = int(int(hashlib.md5(getserial()).hexdigest(), 16) & 0xFFFFfffe) + 1
if __name__ =='__main__': if __name__ =='__main__':
NETKEY = unhexlify(sys.argv[1]) NETKEY = unhexlify(sys.argv[1])

61
testpowerspeed.py Normal file
View file

@ -0,0 +1,61 @@
import serial, struct, sys, hashlib, curses
from time import sleep
from binascii import hexlify,unhexlify
from ant.core import driver
from ant.core import node
from PowerMeterTx import PowerMeterTx
from SpeedTx import SpeedTx
from iConst import *
power_meter = None
POWER_SENSOR_ID = int(int(hashlib.md5(getserial()).hexdigest(), 16) & 0xFFFFfffe) + 1
speed = None
SPEED_SENSOR_ID = int(int(hashlib.md5(getserial()).hexdigest(), 16) & 0xFFFFfffe) + 2
if __name__ =='__main__':
NETKEY = unhexlify(sys.argv[1])
stick = driver.USB1Driver(device="/dev/ttyANT", log=None, debug=True)
antnode = node.Node(stick)
print("Starting ANT node on network %s" % sys.argv[1])
antnode.start()
key = node.NetworkKey('N:ANT+', NETKEY)
antnode.setNetworkKey(0, key)
print("Starting power meter with ANT+ ID " + repr(POWER_SENSOR_ID))
try:
# Create the power meter object and open it
power_meter = PowerMeterTx(antnode, POWER_SENSOR_ID)
power_meter.open()
except Exception as e:
print("power_meter error: " + e.message)
power_meter = None
print("Starting speed sensor with ANT+ ID " + repr(SPEED_SENSOR_ID))
try:
speed = SpeedTx(antnode, SPEED_SENSOR_ID, wheel = 0.1)
speed.open()
except Exception as e:
print("speed error: " + e.message)
speed = None
i = 0
while True:
sleep(1)
power_meter.update(power = i, cadence = i)
speed.update(speed = 25)
i += 1
if (i > 200):
break
if power_meter:
print "Closing power meter"
power_meter.close()
power_meter.unassign()
if speed:
print "Closing speed sensor"
speed.close()
speed.unassign()
if antnode:
print "Stopping ANT node"
antnode.stop()

View file

@ -8,8 +8,7 @@ from SpeedTx import SpeedTx
from iConst import * from iConst import *
speed = None speed = None
SPEED_SENSOR_ID = int(int(hashlib.md5(getserial()).hexdigest(), 16) & 0xFFFFfffe) + 2
SPEED_SENSOR_ID = int(int(hashlib.md5(getserial()).hexdigest(), 16) & 0xfffe) + 2
if __name__ =='__main__': if __name__ =='__main__':
NETKEY = unhexlify(sys.argv[1]) NETKEY = unhexlify(sys.argv[1])