#linuxcnc Logs

Oct 29 2022

#linuxcnc Calendar

01:24 AM Deejay: moin
01:34 AM memfrob: Hi guys, so I'm trying to host LinuxCNC + RTAI packages for Bullseye but I have to use --enable-non-distributable=yes and there is no gplv2 package for readline-dev in Bullseye. Is it really an issue to post a LGPL/GPL mixed package?
01:35 AM memfrob: I made some changes with the 4.19 RTAI kernel, and before I push 5.4 kernel debs, I want to make sure my latest changes work for other people.
01:40 AM pere: ah, then I understand. backporting libreadline-gplv2-dev might be the only legal option. not sure.
01:42 AM memfrob: I wonder how the debian devs are doing it.
01:44 AM memfrob: Whelp, I just downloaded it and installed via dpkg -i lol
01:45 AM memfrob: (web browser)
01:47 AM memfrob: I just realized something.. People running Bullseye wont be able to install the linuxcnc deb package because their version of readline will be newer by 2 major versions.
01:47 AM memfrob: Actually 3
01:48 AM memfrob: I posted to the mailing list, signing off for the night. thanks pere!
02:59 AM slime is now known as lumpy
03:16 AM sensille: i tried to migrate my machine to the debian 10 based image, but the latency was just too high. is there anything i can do apart from staying on 7 or buying a new machine?
03:32 AM CaptHindsight[m]: sensille: try using the kernel fro deb 7
03:32 AM CaptHindsight[m]: fro/from
03:32 AM CaptHindsight[m]: on deb 10
03:32 AM CaptHindsight[m]: sensille: Intel CPU?
03:33 AM sensille: CaptHindsight[m]: AMD Phenom II
03:34 AM CaptHindsight[m]: oh have several AMD Phenom II
03:34 AM CaptHindsight[m]: what is you latency with deb 10 and which kernel?
03:34 AM CaptHindsight[m]: should be <20uS
03:36 AM CaptHindsight[m]: Debian 10 is Buster
03:37 AM CaptHindsight[m]: I have Bullseye 1deb 11 with 5.19 or 5.10 preempt_rt kernels well under 20uS
03:38 AM sensille: max interval 75us after not doing much. max jitter 50us
03:39 AM sensille: kernel 4.19
03:39 AM CaptHindsight[m]: are you using isolcpus?
03:40 AM CaptHindsight[m]: I'll be back in 8-10 hours
03:40 AM sensille: i just installed the image as is, a few weeks ago
03:40 AM sensille: i'll look into isolcpus
03:41 AM CaptHindsight[m]: try isolcpus=x,with x being one number lower than the number ot cores you have
03:42 AM sensille: so 3 for linuxcnc, 1 for the system
03:42 AM CaptHindsight[m]: for example for a 4 core isolcpus=3
03:42 AM CaptHindsight[m]: 6 core isolcpus=5
03:43 AM CaptHindsight[m]: LCNC uses real time for the highest core
03:43 AM CaptHindsight[m]: so you reserve the highest core for that
03:44 AM CaptHindsight[m]: so real time LCNC on core 4 and the user space non RT stuff on cores 1, 2and 3
03:44 AM sensille: ah, it's not the number of cpus i want to isolate, but the id of the cpu. so i remove the highest one from the scheduler and lcnc naturally uses it
03:44 AM CaptHindsight[m]: be back in 8-10 hours
03:45 AM CaptHindsight[m]: yes
03:45 AM sensille: ok, thanks
03:45 AM CaptHindsight[m]: hasta banana
03:46 AM CaptHindsight[m]: i have 10 machines using phenom II
03:46 AM CaptHindsight[m]: so i know that they work
03:47 AM CaptHindsight[m]: you can even use Debian Bookworm and the latest prempt_rt kernels
03:48 AM CaptHindsight[m]: sensille: https://forum.linuxcnc.org/media/kunena/attachments/1324/ntu-20Aug2022-34724.png is similar results
03:50 AM CaptHindsight[m]: sensille: linuxcnc uses the highest core for realtime so you want to keep all non-realtime off of it with preempt_rt
03:51 AM CaptHindsight[m]: RTAI does it on its own
03:52 AM sensille: max interval 35us max jitter 9.5us
03:52 AM sensille: that is ... much better :)
04:00 AM travis_farmer[m]: hmmm, may have to try that myself on my machine....
04:29 AM -!- #linuxcnc mode set to +v by ChanServ
04:49 AM JT-Cave: morning
04:57 AM JT-Cave: Tom_itx, https://github.com/jethornton/mesact/commit/fe294177d260f0180765fa3dce37335694c52351
05:26 AM Tom_itx is now known as Tom_L
05:26 AM Tom_L: morning
06:06 AM JT-Cave: getting close on master
06:09 AM pere: morning. :)
07:00 AM JT-Cave: Tom_L, I think I'm done...
07:17 AM Tom_L: on your default values for PID i forgot what you calculated P from
07:17 AM Tom_L: i need to set that
07:19 AM JT-Cave: from what Peter told me :)
07:19 AM JT-Cave: I just pushed a fix or three...
07:19 AM Tom_L: no, i thought there was an input field to fill in for it to come out to 666.66 on mine
07:20 AM Tom_L: maybe not
07:20 AM JT-Cave: the servo thread determines the pid value
07:20 AM Tom_L: yeah, where is that set? i forgot
07:20 AM JT-Cave: thread period on options tab
07:24 AM Tom_L: the ini numbers are carried out to infinity
07:24 AM -!- #linuxcnc mode set to +v by ChanServ
07:24 AM Tom_dev: EFAULT_LINEAR_VELOCITY = 2.500000000000001
07:25 AM Tom_dev: on the velocity numbers anyway
07:26 AM Tom_dev: MAX_FEED_OVERRIDE = 1.5000000000000002
07:26 AM Tom_dev: MIN_LINEAR_VELOCITY = 0.0
07:26 AM Tom_dev: DEFAULT_LINEAR_VELOCITY = 2.500000000000001
07:26 AM Tom_dev: MAX_LINEAR_VELOCITY = 3.5000000000000018
07:27 AM Tom_dev: under [display] and [traj]
07:27 AM JT-Cave: just pushed a few fixes
07:27 AM Tom_dev: maybe don't need to be quite that precise
07:27 AM Tom_dev: ok
07:27 AM JT-Cave: those should be rounded down
07:28 AM JT-Cave: new config or updating?
07:28 AM Tom_dev: new
07:30 AM JT-Cave: that's very odd as it just copies the value from the spinbox for those
07:30 AM JT-Cave: I can't reproduce that...
07:31 AM Tom_dev: lemme do it again to be sure
07:38 AM JT-Cave: ok
07:38 AM Tom_L: just about there..
07:40 AM JT-Cave: just pushed a few more fixes for halui and mdi commands
07:40 AM Tom_L: i'll pull those and start fresh
07:41 AM JT-Cave: ok
07:47 AM Tom_dev: MAX_FEED_OVERRIDE = 1.5000000000000002
07:47 AM Tom_dev: MIN_LINEAR_VELOCITY = 0.0
07:47 AM Tom_dev: DEFAULT_LINEAR_VELOCITY = 1.2
07:47 AM Tom_dev: MAX_LINEAR_VELOCITY = 1.5000000000000002
07:47 AM Tom_dev: in display and traj also has one
07:47 AM Tom_dev: MAX_LINEAR_VELOCITY = 1.5000000000000002
07:47 AM Tom_dev: mdi looks good
07:49 AM Tom_dev: on [MESA] section, do any boards you support require loading the .bin file?
07:49 AM Tom_dev: does the new fpga require that now?
07:49 AM Tom_dev: FIRMWARE = /home/tom/mesact/mesact/src/firmware/7i96s/7i96s_7i85d.bin
07:49 AM Tom_dev: may not be required
07:50 AM JT-Cave: only the old 5i20 boards loaded firmware at bootup
07:50 AM Tom_dev: i remember the old ones did
07:50 AM JT-Cave: how in the world are you getting those values
07:51 AM Tom_dev: heh
07:51 AM Tom_dev: you tell me
07:51 AM Tom_dev: brand new config saved
07:51 AM JT-Cave: did you enter that number in the spin box?
07:52 AM Tom_dev: would display be under the Settings tab?
07:52 AM JT-Cave: I changed the display tab to settings
07:54 AM Tom_L: http://tom-itx.no-ip.biz:81/~webpage/cnc/JT-SHOP/mesact/settings_tab.png
07:54 AM Tom_L: http://tom-itx.no-ip.biz:81/~webpage/cnc/JT-SHOP/mesact/axis_tab.png
07:54 AM JT-Cave: hmm the spin box is a bit screwed up it seems
07:55 AM JT-Cave: what's on your options tab?
07:56 AM Tom_L: http://tom-itx.no-ip.biz:81/~webpage/cnc/JT-SHOP/mesact/options_tab.png
07:57 AM JT-Cave: looks like the huge number thing is a python floating point number issue so I'll have to round them down in code
07:58 AM Tom_dev: i knew it was float but not how to display it :)
07:58 AM JT-Cave: ah yea you changed the thread period so that changes the default pid value
07:58 AM Tom_dev: yeah
07:59 AM JT-Cave: I just usually type a number in but it seems like if you use the up/down arrow keys to change the number you get the floating point issue
07:59 AM Tom_dev: worth testing :)
07:59 AM Tom_dev: i didn't do it on purpose.... i promise :)
08:00 AM Tom_dev: does it change the variable type when you manually enter opposed to using the arrows?
08:00 AM Tom_dev: or just how they are displayed?
08:01 AM Tom_dev: it didn't mess with the SERVO_PERIOD but that was manually entered
08:02 AM Tom_dev: i'm gonna try using the arrows on it too
08:02 AM Tom_dev: SERVO_PERIOD = 1520000
08:02 AM Tom_dev: didn't affect it using the arrows
08:03 AM Tom_dev: but i'd already manually changed it once
08:05 AM JT-Cave: double spin box floating point precision fixed
08:06 AM JT-Cave: as well as the halui check
08:06 AM JT-Cave: only the double spin box is floating point
08:07 AM Tom_dev: oh, for the sliders?
08:07 AM Tom_dev: jog slider settings
08:07 AM Tom_dev: pushed?
08:07 AM Tom_dev: starting over again..
08:09 AM JT-Cave: damn amazon charged my company cc for prime when I didn't have a card associated for prime
08:12 AM Tom_dev: i just noticed something on the axis tab
08:14 AM Tom_dev: when filling in an axis info if you tab across it doesn't tab to the right as you would expect to finish filling in the axis info but skips around in the PID settings
08:14 AM Tom_dev: i've never used tab on that before now
08:15 AM Tom_dev: i'm not sure there's much you can do about that easily...
08:16 AM Tom_dev: doesn't affect the end result.
08:16 AM JT-Cave: yeah I need to sort out the tabs, they get added automagicly when you add an object
08:16 AM JT-Cave: actually I can sort out the tab order in the designer
08:16 AM Tom_dev: same with Homing on that page
08:16 AM Tom_dev: skips around
08:17 AM Tom_dev: i was hoping it would be easy because it makes it nicer
08:20 AM Tom_dev: MAX_FEED_OVERRIDE = 1.2
08:20 AM Tom_dev: MIN_LINEAR_VELOCITY = 0.0
08:20 AM Tom_dev: DEFAULT_LINEAR_VELOCITY = 1.2
08:20 AM Tom_dev: MAX_LINEAR_VELOCITY = 1.5
08:20 AM Tom_dev: yay
08:22 AM Tom_dev: MIN_LINEAR_VELOCITY = 0.0
08:22 AM Tom_dev: #me adds a comment here
08:22 AM Tom_dev: DEFAULT_LINEAR_VELOCITY = 1.2
08:22 AM Tom_dev: that worked too :)
08:25 AM Tom_L: damn.. lcnc even comes up with the board attached
08:31 AM Tom_dev: KINEMATICS = trivkins coordinates=X
08:31 AM Tom_dev: maybe:
08:31 AM Tom_dev: KINEMATICS = trivkins coordinates = X
08:33 AM Tom_dev: did you finish the sserial tab?
08:35 AM JT-Cave: yep
08:35 AM JT-Cave: I think I'm ready to bump the version and build a deb if you can't find any more undocumented features
08:36 AM Tom_dev: i think so too
08:36 AM Tom_dev: looks good
08:36 AM JT-Cave: thanks
08:36 AM Tom_dev: polish the sort order on the axis page..
08:36 AM JT-Cave: I updated a lot of the tab orders
08:36 AM Tom_dev: yeah
08:36 AM Tom_dev: consider adding parport
08:37 AM Tom_dev: and it would be a hard tool to beat hands down
08:38 AM Tom_dev: i didn't look at the HAL tab
08:39 AM Tom_dev: there's an awful lot that can happen there
08:44 AM JT-Cave: the hal tab is an assistant for newbees to help them create simple hal lines
08:44 AM Tom_L: right
08:44 AM pere: Working to promote free software... <URL: https://tech.slashdot.org/story/22/10/28/2041251/youre-going-to-have-to-pay-to-use-some-fancy-colors-in-photoshop-now > :)
08:45 AM Tom_L: one order you might fix..
08:45 AM Tom_L: invert direction in stepgen settings follows the Homing section
08:49 AM Tom_L: after it tabs thru the default values and Homing it goes to invert direction then skips around the pid individual settings then jumps to invert step in stepgen settings then back up to another section
08:50 AM Tom_L: dunno if that can be fixed or not
08:52 AM Tom_L: maybe sort the individual P I D FF0 etc per section after tabbing thru the default buttons
08:52 AM JT-Cave: yeah some of the tab orders are random still, they have to be set for every object in the gui... maybe tomorrow I can putz with that
08:53 AM JT-Cave: you have to go into tab order then click on each object starting with the first one
08:53 AM Tom_L: i like that it hits the 'defaults' first though
08:53 AM JT-Cave: if you screw up you have to start over lol
08:53 AM Tom_L: well don't screw up :)
08:54 AM JT-Cave: I've pushed 1.0.0 and now the docs point to that for rpi debs as well...
08:54 AM Tom_L: ok i'll pull and build some debs
08:54 AM Tom_L: updated the header to 1.0.0 as well?
08:54 AM Tom_L: and the build date
08:54 AM JT-Cave: yea
08:55 AM Tom_L: done? i just pulled to my repo
08:55 AM JT-Cave: at least I "think" I updated everything lol
08:55 AM Tom_L: alot nicer now than before you started ini3 for sure
08:56 AM JT-Cave: wait a minute
08:58 AM JT-Cave: I left the hal tab up, just pushing the deb and ui now
08:58 AM JT-Cave: ok pull and test
09:00 AM Tom_L: building on amd64
09:00 AM Tom_L: 1.0.0
09:03 AM Tom_L: installed
09:03 AM Tom_L: seems to work
09:03 AM Tom_L: building rpi debs next
09:05 AM JT-Cave: thanks
09:05 AM Tom_L: thank you...
09:06 AM Tom_L: i just sit here and break things
09:10 AM Tom_L: want me to push the amd64 deb too?
09:11 AM Tom_L: err.. maybe you built it already
09:14 AM JT-Cave: no, I pushed that already
09:15 AM -!- #linuxcnc mode set to +v by ChanServ
09:15 AM Tom_L: ok got an error on the rpi
09:16 AM Tom_rpi: loadini2.py ine 69 no such file or directory
09:18 AM Tom_dev: on the armhf build
09:20 AM Tom_L: started to open an ini then realized i don't have any on that card so i hit cancel and it error'd
09:21 AM Tom_L: happens on amd64 too
09:21 AM Tom_L: upon hitting cancel
09:22 AM Tom_L: i'll go ahead and build the debs.. shouldn't prevent someone from using it
09:35 AM JT-Cave: open then cancel?
09:37 AM Tom_L: to open an exhisting ini
09:37 AM Tom_L: then i realized i didn't have one on the SD so i hit cancel
09:37 AM Tom_L: PR #39 up
09:37 AM JT-Cave: that is fixed
09:40 AM Tom_L: i'll wait to rebuild the debs..
09:40 AM JT-Cave: ok
09:40 AM Tom_L: not going to prevent using it
09:40 AM * JT-Cave goes to clean chicken shit
09:41 AM Tom_L: i'll test on amd64
09:43 AM -!- #linuxcnc mode set to +v by ChanServ
09:43 AM Tom_dev: A Program Error Occurred in loadini2.py line 264
09:43 AM Tom_dev: Error: list index out of range
09:44 AM Tom_dev: opening the original test 7i96s ini
09:44 AM Tom_dev: arm64
09:44 AM Tom_L: maybe we can't use the old ini now?
09:46 AM Tom_L: cancel works on the amd64 now and also loaded the original (i think) ini
09:47 AM Tom_L: it could have been updated on that pc
09:48 AM Tom_L: the failed one was built with 0.7.3
09:49 AM JT-Cave: pastebin the ini file
09:49 AM Tom_L: ok
09:50 AM Tom_dev: https://paste.debian.net/1258724/
09:52 AM Tom_L: yeah, the one on the amd64 was built with version 0.7.4
09:52 AM Tom_L: same file just saved under 0.7.4
09:53 AM Tom_L: i did remove sserial on it...
09:53 AM Tom_L: i didn't have a sserial wired to test live so i removed it
10:13 AM JT-Cave: fixed the loadini2.py error and pushed
10:13 AM * JT-Cave goes out to the shop to make parts to fix the 200 yard target and clean the M1
10:22 AM Tom_L: ok
10:23 AM JT-Shop: if you find any more undocumented features let me know
10:25 AM Tom_L: :)
10:27 AM roguish[m]: JT-Shop: hey, your code is getting quite fancy.....
10:27 AM roguish[m]: how's the Starlink doing?
10:27 AM Tom_L: roguish[m], check out the latest 1.0.0 build of it. lots of changes
10:28 AM Tom_L: added MDI_COMMAND to halui
10:29 AM roguish[m]: link?
10:29 AM Tom_L: https://github.com/jethornton/mesact
10:29 AM Tom_L: grab the amd64 deb there
10:29 AM roguish[m]: thanks
10:29 AM Tom_L: i'm updating the rpi ones as we speak
10:30 AM JT-Shop: I'm on starlink 100% now and it's much better than viasat
10:30 AM JT-Shop: still need to do a permanent install of the dish...
10:30 AM roguish[m]: very cool
10:35 AM roguish[m]: I could test the code for a 7i80hd full servo system.....with spindle vfd
10:36 AM Tom_L: i don't think he's quite done with the 7i80 code
10:36 AM Tom_L: been pushing forward on available cards to start with
10:36 AM Tom_L: it's partially there
10:52 AM Tom_L: PR #40 up
11:00 AM JT-Shop: thanks
12:04 PM JT-Shop: finished fixing the 200 yard target... time for a nap
12:10 PM travis_farmer[m]: Hmmm, my "range" doesn't go up to 200yrds... (crossbow šŸ˜‰ )
12:12 PM JT-Cave: they have targets out to 400 yards and thinking about adding one at 500 yards
12:13 PM travis_farmer[m]: i think my crossbow would flop before 500 yrds. 390fps and 185lbs draw
12:13 PM Tom_L: not the target range you automated is it?
01:39 PM JT-Shop: no, it's at a friends farm
02:22 PM JT-Shop: can you setup zella and I'll pay now? no, cash only
02:26 PM Tom_L: good nap.
02:27 PM Tom_L: you don't take bitcoin?
02:27 PM Tom_L: i've been asked quite a few of them
02:27 PM _unreal_: I have been so busy lately with my laser etching business side business
02:28 PM _unreal_: ve7it, hi
02:29 PM JT-Shop: I take cash
02:30 PM _unreal_: I do too
02:30 PM Tom_L: do you offer a cash discount?
02:30 PM Tom_L: NO!
02:30 PM JT-Shop: LOL
02:30 PM Tom_L: what if i get 2 instead of one?
02:30 PM xxcodery: sale price: 2 for just twice the price!
02:31 PM _unreal_: I have a client who has me make 100 or so items laser etched per month
02:33 PM JT-Shop: Okay, Iā€™m just tryna be self conscious so I wonā€™t get something that will later donā€™t feel comfortable with cause Iā€™m getting it for my sisterā€™s son.
02:34 PM JT-Shop: Okay, Iā€™m just tryna be self conscious so I wonā€™t get something that will later donā€™t feel comfortable with cause Iā€™m getting it for my sisterā€™s son.
02:34 PM JT-Shop: Okay, Iā€™m just tryna be self conscious so I wonā€™t get something that will later donā€™t feel comfortable with cause Iā€™m getting it for my sisterā€™s son.
02:34 PM JT-Shop: Okay, Iā€™m just tryna be self conscious so I wonā€™t get something that will later donā€™t feel comfortable with cause Iā€™m getting it for my sisterā€™s son.
02:35 PM JT-Shop: Okay, Iā€™m just tryna be self conscious so I wonā€™t get something that will later donā€™t feel comfortable with cause Iā€™m getting it for my sisterā€™s son.
02:35 PM JT-Shop: opps
02:35 PM _unreal_: you seem a bit self conscious
02:35 PM JT-Shop: no me
02:35 PM _unreal_: call it an observation
02:35 PM _unreal_: LOL
02:37 PM JT-Shop: that was a reply to me from someone wanting to buy a tiller from me with zella
02:37 PM JT-Shop: in any case I have no clue what she means
02:38 PM ve7it: _unreal_, hey... how is it hanging in Florida?
02:39 PM _unreal_: worm
02:39 PM _unreal_: ve7it, I have an other JUMBO sat. coming to me IF its not claimed by the boat.
02:39 PM _unreal_: I doubt it will be.
02:40 PM ve7it: cool... you should have enough parts soon to make one of these units fully operational
02:40 PM _unreal_: when I get it. its got the jumbo BLDC motors that I was talking about. When I get it. that I will send to you with the "advanced" motion controller. also the larger motors. one has an onboard encoder. the other two have onboard brakes.
02:40 PM _unreal_: what a sat?
02:40 PM _unreal_: ?
02:40 PM _unreal_: I have lots of onboard bldc's etc.....
02:41 PM ve7it: sure... they are probably still registered
02:41 PM ve7it: one would look good mounted on top of your car
02:42 PM _unreal_: They are the size of my car
02:42 PM _unreal_: the domes make great dog houses
02:58 PM _unreal_: ve7it, I dont know what these bldc's would be best for though. LASER or 3d printer. or maybe cnc mill?
02:58 PM _unreal_: I lean laser and 3d. because they are really ment for higher RPM.
04:21 PM _unreal_: hum quiet
04:39 PM _unreal_: So whats new
04:40 PM Tom_L: mesact 1.0.0
04:40 PM _unreal_: hum
05:13 PM JT-Shop: library files have 7871 lines of code in mesact
05:25 PM Tom_L: yardwork done for today and showered
06:11 PM _unreal_: I have this controller board that I bet would make an amazing motion controller :/
06:11 PM _unreal_: it has two micro controllers, 3 relays, 6 opto isolators and other things on it....
06:12 PM _unreal_: 64f7044f28y and xc9572
06:15 PM _unreal_: typo 64f7044f28y
06:15 PM _unreal_: 64f7044f28v
06:18 PM _unreal_: never fails. I get all of these cool boards and stuff becuase of the line of work i'm in. and no one has ever done anything and published code for the chips.
06:18 PM _unreal_: sigh
06:18 PM _unreal_: time for an other beer
06:18 PM _unreal_: enjoying "Shipyard Pumpkin head"
06:18 PM _unreal_: damn good
06:53 PM Tom_L: JT-Shop, can you add my custom firmware for the 7i80 so i can test it realtime?
06:59 PM Tom_L: .. meh i suppose it won't make much difference really on the test pc
07:02 PM Tom_L: axis aren't enabled on the 7i80hd yet even after selecting a firmware
07:04 PM Tom_L: same for the 7i92
07:05 PM Tom_L: enabled after selecting a daughter card
07:05 PM Tom_L: none available for the 7i80 yet
07:27 PM Tom_L: JT-Cave, are you still using filelist.hal?
07:33 PM Tom_L: it's still included in the [HAL] section but not generated and throws a runtime error
09:31 PM Tom_L: ok i figured it out i think
09:31 PM Tom_L: the old configs used filelist.hal
09:31 PM Tom_L: now you're putting them in the [HAL] section
09:48 PM Centurion_Dan1 is now known as Centurion_Dan
10:02 PM Tom_L: does halshow show nets?
10:28 PM TurBoss: <Tom_L> "does halshow show nets?" <- nope
10:30 PM TurBoss: graphviz scripts have this lines šŸ˜„... (full message at <https://libera.ems.host/_matrix/media/v3/download/libera.chat/4bdc5858a2a1e6ec688962c9ff45ae7c67268067>)
10:34 PM TurBoss: looks like the signals are shown in halshow šŸ¤¦ā€ā™‚ļø
10:39 PM Tom_L: i figured it out i think. i was just testing a config
11:44 PM -!- #linuxcnc mode set to +v by ChanServ