Contact   Imprint   Advertising   Guidelines

Xensr - any info about their current situation?

Forum for kitesurfers
BrinM
Rare Poster
Posts: 23
Joined: Thu Feb 27, 2020 9:38 pm
Kiting since: 2005
Local Beach: Muriwai
Style: Wet
Gear: Duotone , Cab Foil
Brand Affiliation: None
Location: Muriwai New Zealand
Has thanked: 3 times
Been thanked: 8 times

Xensr - any info about their current situation?

Postby BrinM » Tue Jun 09, 2020 6:32 am

G'day

the website is still in existence, but can no longer, it seems, upload .dat files to the my.xensr site for evaluation.

They seem to load to the 'processing' point and then just sit forever with nothing happening

Does anyone have any info please on whether or not its operating any more/broken/defunct

Anyone know how to get hold of anyone who is/was in the Xensr company??

Is there any other program/site that can read the files?

Appreciate it, thanks

Blackened
Very Frequent Poster
Posts: 1274
Joined: Fri May 04, 2018 4:47 am
Kiting since: 2013
Style: Big Air, Airstyle
Gear: 2020 Rebels
23/24 Orbits
Has thanked: 111 times
Been thanked: 524 times

Re: Xensr - any info about their current situation?

Postby Blackened » Tue Jun 09, 2020 8:27 am

Hey fella,

I'm pretty sure they're out of business. There was a firesale of their hardware last year and their security certificates on their website have long expired.

Shame. I loved having the GPS and tracking my jump locations. It was also so much better at disregarding "wave jumps" than Woo. Was also pretty cool to be able to see a visualisation of board offs.

nothing2seehere
Very Frequent Poster
Posts: 1681
Joined: Fri Jun 27, 2014 3:25 pm
Kiting since: 2012
Weight: 72
Local Beach: Calshot, Hayling, Meon - Southcoast UK
Gear: Duotone Rebel, Evo SLS, Flysurfer Soul/Peak, Ocean rodeo jester, Airush Ultra, shinn boards
Brand Affiliation: None
Has thanked: 205 times
Been thanked: 297 times

Re: Xensr - any info about their current situation?

Postby nothing2seehere » Tue Jun 09, 2020 8:53 am

I thought all that's left is the subscription Xensr sessions app for the iwatch?

I agree that the hardware at the time was ahead of the game. Shame that they didn't just stick a plastic case around it as I suspect they might have stayed solvent if it wasn't for the volume of hardware warranty claims.

joriws
Very Frequent Poster
Posts: 1299
Joined: Wed Nov 24, 2010 11:03 am
Gear: Flysurfer, HQ, Moses, Nobile, North, Ozone
Brand Affiliation: None
Has thanked: 76 times
Been thanked: 163 times

Re: Xensr - any info about their current situation?

Postby joriws » Tue Jun 09, 2020 9:56 am

If you still want to use Xensr to record GPS and jump logs, the dat-file is quite simple in data structure construction (I've reverse engineered it in most parts). Simple Python-code can parse through the file structures and write any output you like. Sure this requires some basic IT-skills.

File structures are:
0) header with start pointers of different structures below
1) IMU-data (largest part of file)
2) GPS-data, can be easily extracted to GPX file
3) jump data events, can be extracted to GPX waypoints
4) some JSON summary-data.

However the hope is as "Woo screen" unofficial app is coded with GPS support that it starts to record track with woo-data added. "Woo screen" author is now doing official Woo-app, could be that feature is there. Then finally the very new Surf.fr app for phone, which should be released to Android any day. It should have logging, online functions, accurate jump measurement without any additional device.

joriws
Very Frequent Poster
Posts: 1299
Joined: Wed Nov 24, 2010 11:03 am
Gear: Flysurfer, HQ, Moses, Nobile, North, Ozone
Brand Affiliation: None
Has thanked: 76 times
Been thanked: 163 times

Re: Xensr - any info about their current situation?

Postby joriws » Tue Jun 09, 2020 10:16 am

I abandoned my project as my Xensr battery does not last that long anymore. Unfortunately Kiteforum forum-software does not allow properly attaching the code with indents, so with Python which is indent-based language you have do reimplement it. If someone continues with below code and writes output, please share it with the community.

XensrDecode.py
#import tkinter as tk
import sys
import struct
import datetime
import json
from tkinter import *
from tkinter.filedialog import askopenfilename,asksaveasfilename
from tkinter.messagebox import showerror
import tkinter.scrolledtext

class GPX():
def __init__(self,file):
self.saveas = file
return

def header(self):
return "<gpx version=\"1.1\" creator=\"Jorge's Xensr to GPX converter\">\n"

def footer(self):
return "</gpx>\n"

class XensrDat():
def __init__(self,file):
self.filename=file
#print ("Open file " + self.filename)
self.IMURECORD=36
self.GPSRECORD=24
self.EVENTRECORD=40
self.SIGNATURE=152389
self.GPSDIV=10**7
self.MICRODIV=10**6
self.HDSDIV=10**2


def getHeader(self):
# header length = 132 bytes, little-endian '<'
# 4 filetype
# 2 major version
# 2 minor version
# 25 fileid
# 13 id
# 12 timestamp (2 year, 2 month, 2 day, 2 hour, 2 min, 2 sec)
# 7 fillbytes/flags/options (zeroes)
# 4 imudataoffset
# 4 imudatabytes
# 4 gpsdataoffset
# 4 gpsdatabytes
# 4 eventdataoffset
# 4 eventdatabytes
# 4 iddataoffset
# 4 iddatabytes
# 2 numberofevents
# 2 sportmode (1002 kiteboarding)
# 4 duration (seconds, divide by 100)
# 6 timestampbinary
# 46 padding
self.header_fmt = '<L 2H 25p 7x 8L 2H L 6B 46x'
self.header_len = struct.calcsize(self.header_fmt)
self.header_unpack = struct.Struct(self.header_fmt).unpack_from

self.header = []

self.fileHandle = open(self.filename, 'rb')
data = self.fileHandle.read(self.header_len)
self.fileHandle.close()

self.header = self.header_unpack(data)
if self.header[0] != self.SIGNATURE:
raise IOError("Unknown file 0x%04x" % self.header[0])
self.tsepoch = self.decodeXensrTimeStamp()

def getID(self):
return self.header[3].decode()

def getSport(self):
return int(self.header[13])

def getDuration(self):
return (float(self.header[14])/self.HDSDIV)

def getImuOffset(self):
return int(self.header[4])

def getImuBytes(self):
return int(self.header[5])

def getImuEntries(self):
return self.getImuBytes()/self.IMURECORD

def getGPSOffset(self):
return int(self.header[6])

def getGPSBytes(self):
return int(self.header[7])

def getGPSEntries(self):
return self.getGPSBytes()/self.GPSRECORD

def getEventOffset(self):
return int(self.header[8])

def getEventBytes(self):
return int(self.header[9])

def getEventEntries(self):
return int(self.header[12])

def getJSONOffset(self):
return int(self.header[10])

def getJSONBytes(self):
return int(self.header[11])

def getJSONData(self):
self.fileHandle = open(self.filename, 'rb')
self.fileHandle.seek(self.getJSONOffset(),0)

data = self.fileHandle.read(self.getJSONBytes()).decode()
self.fileHandle.close()

return json.dumps(json.loads(data), sort_keys=True, indent=4)
#return data

def convertGPSLongToDegrees(self,value):
return float(value)/self.GPSDIV

def convertTimeOffsetToMicro(self,value):
return float(value)/self.MICRODIV

def getEvents(self):
# iterate over filestruct
self.event_fmt = '<40B'
self.event_len = struct.calcsize(self.event_fmt)
self.event_unpack = struct.Struct(self.event_fmt).unpack_from

self.events = []
self.fileHandle = open(self.filename, 'rb')
self.fileHandle.seek(self.getEventOffset(),0)
data = self.fileHandle.read(self.getEventBytes())
self.fileHandle.close()

# iterate over data
self.events = data.iter_unpack('<40B',data)
#self.header = self.header_unpack(data)

from pprint import pprint
pprint(self.events)

def decodeXensrTimeStamp(self):
self.tsyear = int(self.header[15]+2000)
self.tsmon = int(self.header[16])
self.tsday = int(self.header[17])
self.tshour = int(self.header[18])
self.tsmin = int(self.header[19])
self.tssec = int(self.header[20])

return datetime.datetime(self.tsyear,self.tsmon,self.tsday,self.tshour,self.tsmin,self.tssec)

def getRelativeTimeStamp(self,offset):
return self.tsepoch + offset

def headerDebug(self):
#from pprint import pprint
#pprint(self.header)
self.output = []
self.output.append("Xensr file version %d.%02d " % (int(self.header[1]), int(self.header[2])))
self.output.append("File ID: %s" % self.getID())
self.output.append("Sport ID: %d" % self.getSport())
self.output.append("Base timestamp: %s" % self.tsepoch)
self.output.append("Duration: %.2fs" % self.getDuration())
self.output.append("IMU data: 0x%06x - 0x%06x (%d entries)" % (self.getImuOffset(),self.getImuOffset()+self.getImuBytes(), self.getImuEntries()))
self.output.append("GPS data: 0x%06x - 0x%06x (%d entries)" % (self.getGPSOffset(),self.getGPSOffset()+self.getGPSBytes(),self.getGPSEntries()))
self.output.append("Event data: 0x%06x - 0x%06x (%d entries)" % (self.getEventOffset(),self.getEventOffset()+self.getEventBytes(),self.getEventEntries()))
self.output.append("JSON data: 0x%06x - 0x%06x" % (self.getJSONOffset(),self.getJSONOffset()+self.getJSONBytes()))
self.output.append("\n")
return self.output


#def imudata(self):

#def gpsdataentry(self):
# 4 timeoffset
# 4 altitude?
# 4 latitude / 10000000
# 4 longitude / 10000000
# 2 flags?
# 2 speed?
# 2 pressure?
# 1 visible satellites?
# 1 gpsstatus (1 not locked, 0 locked)



#def eventdata(self):


def __del__(self):
self.fileHandle.close()
print ("Close file " + self.filename)

class MyFrame(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title("Xensr session converter to GPX")
self.master.rowconfigure(2, weight=1)
self.master.columnconfigure(3, weight=1)
self.grid(sticky=W+E+N+S)

self.button = Button(self, text="Open Xensr SESH.DAT", command=self.load_file)
self.button.grid(row=1, column=0, sticky=W)

self.convert = Button(self, text="Convert and save GPX v1.1", state=DISABLED, command=self.save_file)
self.convert.grid(row=1, column=1, sticky=W)

self.quit = Button(self, text="Quit", command=self.closeWindow)
self.quit.grid(row=1, column=2, sticky=E)

self.text = tkinter.scrolledtext.ScrolledText(self, height=25, width=80)
self.text.grid(row=2,column=0, columnspan=3, sticky=W)
self.text.bind('<<Modified>>', self.textModified)
self.text.edit_modified(False)

def textModified(self, event):
self.text.see(END)
self.text.edit_modified(False)

def load_file(self):
fname = askopenfilename(filetypes=(("Xensr session files", "SESH*.DAT"),
("All files", "*.*") ))
if fname:
try:
#print("""here it comes: self.settings["template"].set(fname)""")
self.text.insert(END, "Loading: " + fname + "\n")
self.data = XensrDat(fname)
self.text.insert(END, "Processing header\n")
self.data.getHeader()
self.text.insert(END, "\n".join(self.data.headerDebug()))
self.text.insert(END, "JSON container:\n" + str(self.data.getJSONData()) + "\n")
except IOError as err:
#showerror("Open Source File", "Failed to read file\n'%s'\n" % fname)
self.text.insert(END, "IO error: {0}".format(err))
except OSError as err:
self.text.insert(END, "OS error: {0}".format(err))
except:
print("Unexpected error:", sys.exc_info()[0])

# enable save button
self.convert.configure(state=NORMAL)

return

def save_file(self):
# TODO: check if file opened first
if not self.data.filename: return
savename = asksaveasfilename(filetypes=(("GPX files", "*.GPX"),
("All files", "*.*") ), initialfile=self.data.filename+".GPX")

if savename:
try:
self.text.insert(END,"Saving file: " + savename + "\n")

self.gpxout = GPX(savename);

self.text.insert(END, self.gpxout.header())

# setup iterator or something to go over wpt-data (events)
self.data.getEvents()

self.text.insert(END, self.gpxout.footer())
except IOError as err:
self.text.insert(END, "IO error: {0}".format(err))
except OSError as err:
self.text.insert(END, "OS error: {0}".format(err))
except:
print("Unexpected error:", sys.exc_info()[0])

return

def closeWindow(self):
self.text.insert(END, "Goodbye\n")
self.destroy() # close this window's buttos
self.master.destroy() # remove window
sys.exit() # exit

if __name__ == "__main__":
MyFrame().mainloop()

CaliRider
Medium Poster
Posts: 148
Joined: Mon Dec 19, 2016 7:17 pm
Local Beach: 3rd Ave, Cotote Pt., Crissy
Favorite Beaches: Kite Beach Maui
Gear: Slingshot for all!
Brand Affiliation: None
Has thanked: 3 times
Been thanked: 4 times

Re: Xensr - any info about their current situation?

Postby CaliRider » Tue Jun 09, 2020 3:48 pm

From what I know its no longer in business but i did run into some of xenser guys at the beach last month but now they're doing the sessions app. I chatted with them quick as I was launching and I saw they were testing with some device on their boards. I have no idea what it was.

BrinM
Rare Poster
Posts: 23
Joined: Thu Feb 27, 2020 9:38 pm
Kiting since: 2005
Local Beach: Muriwai
Style: Wet
Gear: Duotone , Cab Foil
Brand Affiliation: None
Location: Muriwai New Zealand
Has thanked: 3 times
Been thanked: 8 times

Re: Xensr - any info about their current situation?

Postby BrinM » Tue Jun 09, 2020 10:51 pm

Thanks for the help folks......

let u know how we get on

anyone have a contact for the xensr guys now doing the watch thing??

Thx and best from a hopefully covid19 free New Zealand!

SessionsApp
Rare Poster
Posts: 10
Joined: Mon Feb 10, 2020 4:41 pm
Kiting since: 2010
Local Beach: Based in the midwest, love the Great Lakes!
Favorite Beaches: Kitebeach Maui. Big Bay Cape Town. 3rd Ave, California. Gorge / Hood River. Hatteras.
Style: freeride
Gear: Slingshot mostly.
Brand Affiliation: None
Has thanked: 4 times
Been thanked: 4 times
Contact:

Re: Xensr - any info about their current situation?

Postby SessionsApp » Wed Jun 10, 2020 7:39 pm

BrinM wrote:
Tue Jun 09, 2020 6:32 am
G'day

the website is still in existence, but can no longer, it seems, upload .dat files to the my.xensr site for evaluation.

They seem to load to the 'processing' point and then just sit forever with nothing happening

Does anyone have any info please on whether or not its operating any more/broken/defunct

Anyone know how to get hold of anyone who is/was in the Xensr company??

Is there any other program/site that can read the files?

Appreciate it, thanks
Hello! Was alerted to the issue outlined here and your session files should be processing now. You should not have to re-upload any files - they all were cached and should be in your account. If you have any other issues - you can PM us here through this account.
These users thanked the author SessionsApp for the post:
BrinM (Thu Jun 11, 2020 2:42 am)
Rating: 3.03%

SessionsApp
Rare Poster
Posts: 10
Joined: Mon Feb 10, 2020 4:41 pm
Kiting since: 2010
Local Beach: Based in the midwest, love the Great Lakes!
Favorite Beaches: Kitebeach Maui. Big Bay Cape Town. 3rd Ave, California. Gorge / Hood River. Hatteras.
Style: freeride
Gear: Slingshot mostly.
Brand Affiliation: None
Has thanked: 4 times
Been thanked: 4 times
Contact:

Re: Xensr - any info about their current situation?

Postby SessionsApp » Wed Jun 10, 2020 7:40 pm

BrinM wrote:
Tue Jun 09, 2020 10:51 pm
Thanks for the help folks......

let u know how we get on

anyone have a contact for the xensr guys now doing the watch thing??

Thx and best from a hopefully covid19 free New Zealand!
Hi! You can message Xensr/SessionsApp though this account here on Kiteforum.
These users thanked the author SessionsApp for the post:
BrinM (Thu Jun 11, 2020 2:42 am)
Rating: 3.03%

SessionsApp
Rare Poster
Posts: 10
Joined: Mon Feb 10, 2020 4:41 pm
Kiting since: 2010
Local Beach: Based in the midwest, love the Great Lakes!
Favorite Beaches: Kitebeach Maui. Big Bay Cape Town. 3rd Ave, California. Gorge / Hood River. Hatteras.
Style: freeride
Gear: Slingshot mostly.
Brand Affiliation: None
Has thanked: 4 times
Been thanked: 4 times
Contact:

Re: Xensr - any info about their current situation?

Postby SessionsApp » Wed Jun 10, 2020 7:46 pm

joriws wrote:
Tue Jun 09, 2020 10:16 am
I abandoned my project as my Xensr battery does not last that long anymore. Unfortunately Kiteforum forum-software does not allow properly attaching the code with indents, so with Python which is indent-based language you have do reimplement it. If someone continues with below code and writes output, please share it with the community.
Hi! Nice bit of script code you wrote! Stoked to see you hacking on it. :D

If you are so inclined, you can replace your battery with a 505030 LIPO from Alibaba or other sources. Be careful to not 1) over tighten the
housing screws - that will put excess load on the o ring, and 2) make sure the new battery isn't "fat" when you close up the enclosure such that
the battery might get punctured by the solder points on the bottom of the PCB.
These users thanked the author SessionsApp for the post:
joriws (Wed Jun 10, 2020 8:14 pm)
Rating: 3.03%


Return to “Kitesurfing”

Who is online

Users browsing this forum: Blackened, Clarencephil, Da Yoda, dp19, Faxie, JeffS, Manxman, notamondayperson, sflinux and 483 guests