Wednesday, August 19, 2009

AirSplat Customer Service

My last blog was about the great customer service we got unexpectedly from Ashley Furniture. Unfortunately, for the last month I have had one of my worst customer service experiences. My son ordered an airsoft gun and bio-degradable BBs from AirSplat on July 7th. Below is an accounting of our interaction. Note that every email exchange has the entire conversation included.

7/14 - Package arrives. BBs are not bio-degradable and the gun is missing a part. We plugged in the rechargeable battery and set off an email to customer support:
I think that I am missing a part the my gun. In the picture on the box
there is an aiming device that goes on the top of the gun. It is a small
cylinder with a small triangular cut out. I think that it is supposed
to be in the box and something that I attach to the gun. There were no
separate packages in the gun's box.

I also think that I was sent the wrong BB's. I ordered biodegradable
BB's and can find no indication on the package that these are, in fact,
biodegradable.

Thanks for your time.
7/15 - We are on vacation and discover that the battery charger doesn't work.
7/16 - received this email from AirSplat customer support:
Thank you for contacting Airsplat.

We sincerely apologize for any inconveniences and are disappointed to learn
of the difficulties you have experienced.
If you like I can have the Optics that are missing sent out for you; the
BB's you received were in fact not the Airsoft Elite 6mm .2g 4000 BIO BB's.

The BB's sent were KSC .25g 3000 6mm, you where not charge $16.00 but rather
$11.00 for the alternative BB's due to the fact that the Airsoft Elite 6mm
.2g 4000 BIO BB's are out of stock.

Thank you for choosing Airsplat and please feel free to contact us with any
additional questions or concerns.
Notice that they offered to send the missing optics if we like!

7/17 - We return home to find the above email. We respond:
I really wanted the biodegradable BB's that I ordered, not the standard
BB. Can you exchange theses for the biodegradable? Since the ones that
I ordered are out of stock, can B2-5000-BIO
<http://www.airsplat.com/itemdesc.asp?ic=B2-5000-BIO>
<http://www.airsplat.com/itemdesc.asp?ic=B2-5000-BIO> be sent instead?

In addition, I have found that the charger for the battery for the gun
doesn't charge the battery. Can a replacement be sent? Please send the
missing Optics for the gun as well.

Thanks
Yes we want the missing optics, that was one of the two reasons we contacted them about the order.

7/20 AirSplat's response:
You actually received what you had ordered. These BBs are in fact
biodegradeable, but are not marketed as such since they take several years
to degrade as opposed to several months.

Please feel free to contact us with any additional questions or concerns.
Are you kidding me? I wonder if that logic would work with a "90 days - same as cash" deal! Notice that they don't even acknowledge the problem with the battery charger or the Optics. So now I'm really aggravated, as my next email shows:

7/22
- It did take two days for me to respond, although if I had responded earlier, it probably would have been profanity laden:
The BBs that were sent were substituted without permission.  We wanted the
BBs that degraded in several months. We wanted 4000 BBs. We wanted .2g
BBs, not .25g. They are not what we wanted and we do not want to pay for
them. Frankly, I find the fact that it was even suggested that we received
what was ordered was ridiculous. You also failed to address the charger
issue. The charger that came does not charge the battery. The LED on the
charger does not light and an electrical meter test on the charger indicates
that the charger is not functioning. Finally, the initial message also
indicated that a gun sight was not shipped in the original package.
Airsplat's first response indicated that the sight could be sent if we
desired. We replied that we would like the sight sent, but have not
received an indication that it was ever shipped.

I noticed a recent Airsplat tweet touting 0% negative feedback on Amazon for
the past 30 days. With customer support like this, I would not expect that
string to last much longer. I will, however, give you a chance to fix this
before breaking the string myself.

7/22 - AirSplat's Response:
Dear Customer,

We will have the Airsplat Bio BBs as well as a replacement charger sent out
to you shortly.


Please feel free to contact us with any additional questions or concerns.
Well, apparently being aggravated gets results! We wait for the shipment, although we don't really hold out any hope that they sent the missing sight.

7/29 - Shipment received. Bio-degradable BBs and a fancy new charger! No gun sight.

Now I'm at least somewhat satisfied, and I figure I'll get back to them on the missing sight. The battery doesn't seem to charge right and we have problems with the gun. We get it to work intermittently but by 8/11 it won't function at all. AirSplat has a 30 day return policy, but this process has been so painful, I mistakenly believe it has been longer.

8/11 - We again contact AirSplat support:
Thank you for sending the replacement charger and BBs.  However, the first
thing that was requested was a sight that was supposed to be with the gun.
You offered to send the sight, but that seems to have been dropped while
handling the other issues. You can find the sight issue at the bottom of
this email thread.

Unfortunately, I am having trouble with the gun. The charger seems to be
charging the battery (a volt meter indicates that the battery has power),
but the gun will not fire. Is there any way the gun can be exchanged?
Although we are beyond the initial 30 days, we did not have the ability to
test the gun because of the charger issues that were only resolved a couple
of weeks ago.
Ok, my sense of time stinks, but they can see from the email history that we have only had the working charger for two weeks:

8/12 - AirSPlat's Reply:
Hello

We are thankful for your patronage with AirSplat.com!

We are sorry to hear of the troubles you have experienced and sincerely
apologize for any inconvenience it may have caused. It is never our
intention to inconvenience our customers.

Regarding your concern, at this time the only offer we would be able to
offer is to have you send the gun in for repair and not charge you the
service fee because the warranty has expired. Please advise. Concerning
the optics that you were missing I believe you are inquiring about the
EG706, correct? If this is the case your gun does come with a sight.

Trust that at Airsplat.com, we take pride in working closely with our
customers to ensure the highest level of service. Please let us know if
there is anything else we may assist with.
Great, you've told me what we discussed in the first email....the gun is supposed to have a sight. It's at least they aren't going to charge for the repair right...but wait, how do we go about getting the repair?

8/15 - Another email to AirSplat:
Considering that we were unable to test the gun due to the charger issue, I
am disappointed that you are strictly adhering to the 30 period while
knowing that it was impossible for us to test the gun without a charged
battery. However, if that is our only recourse, please send us the
information on how to go about sending the gun in for repair.
8/17 - AirSplat's response:
Thank you for the update.

Repair fees are as follows for various models:

1. Full size spring $29.95
2. Full size gas $39.95
3. Full size electric $49.95

Repair fees quoted are for inspection and minor repairs. Major parts or
replacement parts will be additional.

Please feel free to contact us with any further questions.
Oh, and I forgot to mention that each response from AirSplat has this attached to the bottom:
PLEASE EMAIL FROM REGISTERED EMAIL ADDRESS WITH AIRSPLAT.COM & RETAIN ALL
EMAIL HISTORY WITH YOUR ORDER # IN THE SUBJECT LINE TO PREVENT DELAY.
I have yet to figure out why they want all email history retained, because they obviously don't read it! It did make it easier to create the timeline, though.

Tuesday, July 7, 2009

Ashley Furniture Customer Service

Earlier this year, my son wanted to change his room around. Part of the redecoration involved buying a love seat. We found that we liked a couple of different ones. Turned out the more expensive one was going to be cheaper if you factored in the great grocery rebate they offered. If you spent over $500, they gave you $500 in free groceries. The more expensive seat was just over $500 and the cheaper one was just under. What a deal!

The catch is that you get it $50 a month, and they gave you the $50 as a gift card after sending in $100 worth of grocery receipts. Still, it made sense, and we got the better piece of furniture.

Over the next three months, we submitted $300 worth of receipts, but never received a gift card. A week ago, we got an email from the company managing the rebate program saying that they were filing for bankruptcy. In the email, they said not to contact the company from whom we received the rebate as they had no control over the situation. We figured we had lost the $500 and didn't contact Ashley.

Today we received a letter from Ashley Furniture. The letter acknowledged that the company managing the program had declared bankruptcy. They also said that they had found another company to manage the program, and that they would honor the rebates. I was impressed! Not only were they honoring the program, they actively sought us out rather than us having to contact them to ask about it.

It's easy to find negative things on the web related to companies. It's easy to complain. I certainly haven't ever published anything positive about a retailer. But this seemed to be beyond good customer service. I hope that someone who is looking what kind of company Ashley is will find this.

Thursday, March 5, 2009

Nerd Kit Week 2

Well we did get the stoplight operational and we learned some things along the way. The final lesson we learned is that the connections on the solderless breadboard are unstable. More on that later. The first step was to verify that the clock interrupt was working correctly. The ATmega168 has a couple of built in timers that essentially operate independent of the controller CPU. It has lots of options and can be used to generate PCM patterns on the controllers output pins to create a clock signal. Very useful, but got in the way of understanding what I wanted to use it for. Eventually, we figured out the configuration to just use it to interrupt our program.
The oscillator runs at 14.7456 MHz. That means it generates a clock tick 14, 745, 600 times per second. The timer can be set up to increment an internal 8 bit counter every clock tick. When the counter wraps around (256 ticks), an interrupt occurs and the controller executes the interrupt routine specified by the timer overflow vector. That would mean 57,600 interrupts per second. That's exactly 57,599 more interrupts per second than we needed. Luckily the control register for the timer provides a setting such that the timing can be divided by some amount. By setting up the timer to only increment its counter every 256 clock ticks, we get our interrupts down to a managable 225 times per second. Using that method and a simple 8 bit integer, I can accurately determine when a second has passed.
The idea behind our timer was that we had a global value that determined how many seconds were left in whatever cycle we were waiting on. The interrupt would simply decrement that value every second until it reached zero. To prove to myself that the timer was functional, I added an LED to one of the output pins on the controller. If the global timer value was odd, I'd set the pin to high, thus lighting the LED. If the global timer value was even, I'd set the pin low, turning off the LED. After discovering one bad bit combination that I had put in the control register, I did indeed get the LED to flash every other second! Now on to the switches.
The switches turned out to be more confusing. We didn't actually have weight sensing switches, but we did have a 7 position dip switch. The NerdKit came with a project by which you could do binary arithmetic by inputting the number through the position of the switches. In their example, they hooked up the dip switch to ground. So, I hooked up my dip switch to ground. Much to my dismay, once I read the value of the pin, the value seemed to disappear. That made the program think that the switch had been flipped off almost as soon as it was flipped on. Eventually, I randomly tried connecting the switch to +5v instead and the value stayed. Another problem solved, but not really understood. When the switch was connected to ground, the program would light the appropriate green LED, but would almost immediately change to yellow and start the timer. At least the cycles were working right! Once the switch was connected to +5v, the program waited until I flipped the switch back before "pretending" that there was no longer traffic on the sensor.
The program basically worked right the first time. That is, I guess it did, because we saw it do the right things in all of the scenarios we through at it. But I can't get it to repeat. One of the things we did was to display what was going on, including the timer value, on the LCD display. Unfortunately, that doesn't seem to work consistently either. And I didn't write the code for that! What I've discovered is that the connections are "brittle" and the program flakes out when the connections aren't quite right. Especially the power connection itself. So that's led me to soldering. I've purchased a printed circuit board (PCB) that's especially designed for the ATmegax8 series. I'm still waiting on parts, but eventually, we are going to wire/solder our traffic example so that the connections are stable. I'll report back when we finish. Once that's done, we are going to create the LED marquee display that got me interested in this in the first place.

Saturday, February 14, 2009

NerdKit Stoplight Project, Week 1


Unfortunately, I had to leave town on business before the NerdKit arrived. Marshall and I had been discussing the Finite State Machine aspect of the traffic light controller. I put together a simple one just based on timers. It only had a handful of states and the only event that triggered a state change was when the timer expired, which we represented using TX. Our simulation is to be based on the temporary traffic signals that are put in place when they rebuild a bridge and restrict traffic to one lane. The signal allows traffic from both directions to share a single lane to cross the bridge.
Our "requirements" are to include weight sensors at each end of the bridge to signal the controller when traffic is waiting to cross the bridge. We decided that we wanted the traffic to have a maximum wait time of 1 minute. We also decided to assume that it took 15 seconds to get from one side of the bridge to the other at the posted work-zone speed limit. Given a 5 second yellow light, that meant that there would be a green light for a maximum of 40 seconds.
Our initial "weightless" state diagram only cared about the position of the lights. The valid states were INIT, GR, YR, CR, RG, RY, and RC. The letters R, Y, and G in the those states represent the color of the light in one of each direction. The letter C, represents a red light in one direction while we wait for traffic to clear. Although we could have used a single RR state that would work for both directions, I was already thinking ahead to the version with weight sensors.
On Monday morning, I made my trip to the airport. I began to work on the FSM diagram, and quickly realized that I couldn't keep track of everything. So I changed direction and began building a spreadsheet. The spread sheet had four columns: current-state, event, action, new-state. The initial state and initial transitions are easy. You start in the state RRNN which represents a red light in both directions and no traffic on either weight sensor. In my initial attempt, there were 5 events that would cause a state transition: T1, N1, T2, N2, and TX. These events correspond to the weight sensor for direction 1 indicating traffic and no traffic, repeating for direction 2, and finally the timer expiring. So my table looked like this:






































CurrentEventActionNew State
RRNNT1G1,T(40)GRTN
RRNNN1N-AN-A
RRNNT2G2,T(40)RGNT
RRNNN2N-AN-A
RRNNTXN-AN-A


Note that two of the events never make sense. If the weight sensor indicates that traffic is present, the event corresponding to traffic arriving isn't valid. In the initial state, we aren't waiting for a timer to signal anything, so we are simply waiting for traffic to appear. When it appears, we will give that direction a green light. The action column indicates which light and for which direction as well as "T(40)", meaning we're setting a timer for 40 seconds.

Working through the table, I discovered that there were 12 states for one direction. Double that for both directions and add in the initial state yields 25 states. Thus the table consists of groups of five entries for each state. However, every group had two entries that didn’t apply.

For each state, there were two “events” that really couldn’t occur, and if they did occur, they would yield the same state. For example, the state GRTN represents a Green light in direction 1, a Red light in direction 2, Traffic sensed by the weight sensor for direction 1, and No Traffic sensed by the weight sensor for direction 2. The T1 event would indicate the sensor changing from not sensing weight to sensing weight. That change cannot occur without first generating the N1 event representing the sensor changing to no weight. Further, even if the event were possible, the event would not cause a state transition as the state machine is already in the state indicated by traffic sensed in direction 1. Therefore, I changed the meaning of T1 and T2 to mean Toggle, or change in the value of the weight sensor in direction 1 and 2 respectively. I was then able to remove the N1 and N2 events and shrink the table by 50 integers.

That reminds me of a time early in my Bell career when Linda Lahue made fun of me for worrying about saving a couple of bytes in a structure. I had come from a programming environment where we only had 64K of data available to us. I wasn’t used to working on a machine with a whole 32MB memory! Today, that’s tiny! Of course, on a large midrange computer, 50 bytes won’t matter, but programming a microcontroller with a small amount of memory, you had better be in the habit of maximizing your memory usage.

At first, Marshall didn’t understand why the table even had rows for events that didn’t make sense for a given state. Of course, he doesn’t have any programming experience at all, so this was an opportunity to show him how we can write a very generic programming routine that is driven by the data. The first thing I noticed about the action column of my table was that there are only two types of actions listed. The first was an indication of what light was to be turned on. Although I didn’t list it in the table, there was also an implied light that needed turned off. The other type of action was setting a timer. Given that these were the only actions ever described by the table, I came up with the following structure to represent the states and transitions:

struct stateEntry {

uint8_t lightOn;

uint8_t lightOff;

uint8_t timer;

uint8_t newState;

};

Next I created an array of these structures. The array consists of groups of three of these structures, one for each of the possible events. The start of this array looks like this:

struct stateEntry stateTable[] {

/* RRNN */

/* T1 */ { G1, R1, GT, GRTN },

/* T2 */ { G2, R2, GT, RGNT },

/* TX */ { NA, NA, NA, NA },

/* GRTN */

/* T1 */ { Y1, G1, YT, YRNN },

/* T2 */ { NA, NA, NA, GRTT },

/* TX */ { NA, NA, NA, GRTNX }

The comments indicate the current state and the three events. Each of the values in the array has an associated #define associated with it to give it a value. The lightOn and lightOff values are bit masks corresponding to pins on the microcontroller that need to be turned on or off. Those pins will be connected to LEDs representing our traffic lights. In the real world, they could be connected to relays which would actually control the more power hungry traffic signals. The third column is defined to be the timer length for the appropriate condition. GT stands for green timer and would be defined as 40. YT is the yellow timer and is defined as 5. If we decide we want a different period of time for these lights to be on, we can change the definition instead of having to change the value in each state in which they apply.

Once the table is filled in, the program becomes very simple. Assume we have functions to return an event number (0,1,2) corresponding to the events (T1, T2, TX), functions for setting the timer, and functions for turning lights on and off. The get_next_event function would figure out if the timer expired or if one of the weight sensors had changed values and return the appropriate value corresponding to the event. The main loop would then have the following logic:

current_state = RRNN

LOOP: event = get_next_event()

index = (current_state * 3) + event

entry = stateTable[index]

if (entry.lightOn != -1)

toggleLights(entry.lightOn, entry.lightOff)

if (entry.timer != -1)

setTimer(entry.timer)

if(entry.newtState != -1)

current_state = entry.newState

goto LOOP

Notice how simple the main logic is. For any given state, the set of data corresponding to the 3 possible events are grouped together. To get to the appropriate group, multiply the value of the current_state by three. This gets us to the group of three entries that correspond to the current state. Then add the value for the current event to obtain the appropriate entry for the current event. This forces the programming thought to be pushed into data. It’s not that we can’t create a buggy program, but the logic errors are mostly likely to be found in the state model.

There are still some hardware dependent issues to deal with, like how to actually enable the chip to output a current on the appropriate pins, how to make the timer work, etc. Since I didn’t actually have the NerdKit with me, the best I could do was to read lots of documents while I was away. In fact, the first step when I get home is to get used to wiring the pieces together. My first program will probably attempt to use the watch dog timer (part of the microcontroller) to count in seconds and display the count on the provided LCD. Once that works, it will be a short step to getting the traffic controller operational.

Sunday, February 8, 2009

When a nerd has a birthday

Just before my birthday this year, I found an interesting article shared on Slashdot. The article was a DIY kit for an led marquee. The project is based on something put together by a couple of MIT students that they call a "nerd kit". I thought it sounded like fun and asked for it for my birthday. It seemed like something that Marshall would enjoy participating in.
After Ruth said that she ordered it for my birthday, I looked up the parts list and downloaded a document on the micro-controller. For a while, I felt like I was in college again. I got really excited about working in assembler and dealing with interrupts! I know that there are very few people in the world that can identify with that.
The other thought that I had involved me teaching Marshall about programming. Marshall has been asking me for a long time to teach him how to write programs. I have tried several times to teach him Java, but every time I try to talk about things I get tangled in the circular dependencies. I can never seem to get a foundation on which to build. Several people at work thought it sounded crazy, but it seemed to me that the limited number of instructions on the micro-controller would make it easier to learn than Java.
Yesterday, Marshall's bantam hockey team had two games in Decatur, a 2 hour drive. Marshall and I sat in the back seat for the trip. We brought a small white board and I made up a hybrid assembler language based on my college experience with the PDP-11 and what I had seen of the instruction set for the micro-controller. In addition, we made up a magic register that would automatically decrement its value every second until it reached zero. Another register was tied to output pins on the micro-controller. Those pins could be used to drive LEDs. Having this in place, we were able to write a small program that simulated a traffic light system using the LEDs. I showed him the various registers in the CPU and how they are used. After going through the program, he seemed to understand how it worked.
After that, I taught him about interrupts and showed him how we could actually accomplish the magic by using a clock interrupt routine to cause a register decrement every second until it reaches zero. He felt comfortable with it all.
Today, we had games in Springfield. This time it was just the two of us in the car, so I wouldn't be able to draw things on a white board. I had printed out the reference pages containing the instruction set for the micro-controller. Marshall started looking at it and asking questions. I was amazed at how many times he pointed out that my "hybrid" language was wrong for the micro-controller based on what he found. At one point, he found some instructions that differentiated between signed and unsigned integers. So we spent the rest of the trip discussing how to represent negative integers in a binary system. I can remember two's complement giving some people fits in college, but Marshall picked it up fairly quickly. I thought it was impressive considering we didn't have anything to write on and the only prop we had was our fingers to represent binary digits!
On the way home, we decided that we were going to do the project where we simulate the traffic lights. The scenario will be the situation where they close down one lane of a two lane road and share the one remaining lane via a traffic light. To do so, I taught him about Finite State Machines. For our next step, we're each going to design a FSM to control the signal. Since this topic excites me, look for me to blog more about our progress!

Saturday, January 17, 2009

A day of contrast




Earlier today I tweeted about skating on a pond. After several "dangerously cold" days, the ice on the pond was thick enough to support us. All five of us went down to the pond behind Grandma's house. Mitchell set up a line of shoes to be one goal and used the hockey bag that I carry my coaching equipment in as the other. He added a couple of shoes and my hockey gloves to the sides of the bag to make the goals as even in size as possible. The we played a little pond hockey....Mitchell, Ruth and Monica against Marshall and me. It was a blast! Ruth has a pair of figure skates, but they hurt her feet yesterday. So today, she wore an old pair of hockey skates. Hockey skates differ from figure skates in a lot of ways, but most significantly hockey skates don't have toe picks. Every time she tried to use the non-existent toe pick, she fell down.

While we were playing, I had a rather amazing feeling of how wonderful life was with these four other people. Mitchell kept trying to get the puck to Monica so she could score, and Marshall let Ruth score. As we played, all of the kids would get these big grins on their faces and everyone was having such a good time just being with each other. When we were about ready to take our skates off, Mitchell and I raced. I just wanted to see how much faster he was than me. I actually was able to beat him the first time, but he was wearing my old skates so that his wouldn't need to be sharpened. He beat me fairly easily by the third race because my wind falls off so quickly compared to his. Then he started helping Marshall with how he took off from a complete stop. And Marshall was a willing student! All in all, the day was amazingly special for how simple it was.

Then came the complete reverse. On Wednesday night, we had a message on our voicemail from the mother of one of the kids who used to play roller hockey for me. We had seen them at teacher conferences recently, and they told us a sad tale of how their son had been arrested for possession. Now they were asking me to participate in an intervention. First I was asked to write a letter to their son, and then I was to read it to him during an intervention. I was given a document to read explaining the format for the letter. It also gave me directions on what types of things to say as well as what not to say. Section one was supposed to say that you loved them and tell them why. Use examples through memories. Section two was supposed to say how things have changed because of their addiction. Section three was to ask them to accept help. There was an example letter that was written by an addict's brother. I hadn't been involved with the boy for many years, but his parents wanted me to be included because I had had a big impact on his life as his roller hockey coach. It was also a time in his life where everything was going well, and they wanted to take him back to that time. I was supposed to be at their house at 4:00 today.

I got there about 5 minutes early, but they were already started. The boy's dad met me at the door and came outside. They had a professional to lead the intervention who had read each of the letters and ordered them so that they had the most impact. I was to read my letter after their daughter. When we entered the room, the boy's mom was reading her letter. Everyone was crying, including intervention target. That was a good thing because the whole idea was to touch something deep inside him and bring him back.

Once we had all read our letters, the boy agreed to accept help. I'm not sure that he knew it then, but that meant going directly to rehab. They left at 7:00 tonight for Tulsa. I discussed the situation with his mom while we were there. Her son had gotten with the wrong crowd in highschool and hid it well. By the time he'd graduated, he was no longer the child they remembered.

I'm truely thankful for my family, even more so after seeing another family go through the pain of an intervention. At least for them, the intervention was successful and they have hope that they will again be the family they had been. The interesting thing was how this boy came from a good family. There are lots of kids that I see doing things of which I don't approve, but they almost exclusively come from parents who, in my opinion, put to much emphasis on alcohol in their own lives. This just brought out that it can really happen to anyone. I just think that your chances are better if you teach your children by example.

Tuesday, December 23, 2008

Marshall Update

Everyone asks about Marshall's condition. During a hockey game on Thursday, October 17th, Marshall was hit after a whistle. Because the play was over, Marshall had stood up and was not in position to absorb a check. The unexpected check knocked him head first into the boards. That night and for the next few days, Marshall felt dizziness and headaches. We skipped practices, and when the symptoms did not go away by the following Monday, we took him to the doctor.

The doctor's diagnosis was a mild concussion, and we were instructed to keep him out of hockey until his symptoms went away. The doctor did not expect the symptoms to last long. For the next two weeks, Marshall missed both hockey and school as he had a great deal of difficulty concentrating. The work of trying to concentrate made his headaches worse. After two weeks, we took him back to the doctor. The doctor said everything was normal and that some people heal more slowly than others. However, the time frame was not unusual.

Marshall's path back to playing consisted of a series of tests. The final two of those tests were to make it through a non-contact practice followed by a contact practice, both without the recurrence of any symptoms. On November 4th, he passed the first test by skating a non-contact practice with the Bantam team. Unfortunately, we never made it to the second test because the next day at school, Marshall was hit in the head at recess.

This time, the blow to the head caused short term memory loss in addition to the other symptoms. The doctor ordered a CT scan which came out normal and again said it was just a matter of waiting for healing to occur. For three more weeks, Marshall missed school and hockey. His mom and I talked to the school about how to get him caught up. After three weeks, Marshall started going to school for half days and that has lasted until Christmas break.

The doctor's original diagnosis was to keep him out until Dec. 1. However, he also took the information to a pediatric neurologist. The neurologist said that Marshall needs to go two weeks without symptoms and be released by another specialist.

At this point, he is still experiencing headaches, but the dizziness and short term memory loss has mostly gone away. With no way of predicting the end of symptoms, it is likely that he'll miss three full months of hockey this year. Given that there isn't much hockey left, it may make sense to simply hold him out the entire year.