# File: Task.py
# Author: Carl Allendorph
# Date: 05NOV2014
#
# Description:
#  This file contains the implementation of a class to use for
# inspecting the state of a FreeRTOS Task in GDB
#

import gdb


class TaskInspector:

    TCBType = gdb.lookup_type("TCB_t")

    def __init__(self, handle):
        self._tcb = None
        # print("Task: Pass Handle: %s" % str(handle))

        try:
            if handle.type == TaskInspector.TCBType:
                self._tcb = handle
                return
            else:
                print("Handle Type: %s" % str(handle.type))

        except AttributeError as aexc:
            print("Attribute Error: %s" % str(aexc))
            pass
        except Exception as exc:
            print("Error Initializing Task Inspector: %s" % str(exc))
            raise

        try:
            tcbPtr = gdb.Value(handle).cast(TaskInspector.TCBType.pointer())
            self._tcb = tcbPtr.dereference()
            return
        except Exception as exc:
            print("Failed to convert Handle Pointer: %s" % str(handle))

        self._tcb = handle

    def GetName(self):
        if self._tcb != None:
            return self._tcb["pcTaskName"].string()
        else:
            raise ValueError("Invalid TCB")

    def GetPriority(self):
        if self._tcb != None:
            return self._tcb["uxPriority"]
        else:
            raise ValueError("Invalid TCB")

    def GetStackMargin(self):
        if self._tcb != None:
            topStack = self._tcb["pxTopOfStack"]
            stackBase = self._tcb["pxStack"]
            highWater = topStack - stackBase
            return highWater
        else:
            raise ValueError("Invalid TCB")