Rev 1008 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 969 | runge | 1 | |
| 986 | runge | 2 | CanNodes = new Array(); |
| 969 | runge | 3 | CanServices = new Array(); |
| 972 | runge | 4 | CanOfflineTimer = new Interval(offlineCheck, 10000); |
| 1008 | runge | 5 | CanProgrammingNode = null; |
| 969 | runge | 6 | |
| 986 | runge | 7 | function handleNMTMessage(className, commandName, data) |
| 8 | { |
||
| 997 | runge | 9 | var canMessage = new CanNMTMessage(className, commandName, data); |
| 986 | runge | 10 | |
| 11 | switch (canMessage.getCommandName()) |
||
| 12 | { |
||
| 13 | case "Reset": |
||
| 1008 | runge | 14 | // Someone sent a reset command... should we do something? |
| 986 | runge | 15 | break; |
| 16 | |||
| 17 | case "Bios_Start": |
||
| 1008 | runge | 18 | var node = CanNodes[canMessage.getData("HardwareId")]; |
| 19 | |||
| 20 | if (!node) |
||
| 21 | { |
||
| 22 | log("A can node with hardware id " + uint2hex(canMessage.getData("HardwareId"), 32) + " was not found, starting.\n"); |
||
| 23 | node = new CanNode(canMessage.getData("HardwareId"), null); |
||
| 24 | CanNodes[canMessage.getData("HardwareId")] = node; |
||
| 25 | } |
||
| 26 | |||
| 27 | node.handleBiosStart(canMessage.getData("BiosVersion"), canMessage.getData("HasApplication")); |
||
| 986 | runge | 28 | break; |
| 29 | |||
| 30 | case "Pgm_Start": |
||
| 1008 | runge | 31 | // Someone sent a programming start command... should we do something? |
| 986 | runge | 32 | break; |
| 33 | |||
| 34 | case "Pgm_Data": |
||
| 1008 | runge | 35 | // Someone sent a programming data command... should we do something? |
| 986 | runge | 36 | break; |
| 37 | |||
| 38 | case "Pgm_End": |
||
| 1008 | runge | 39 | // Someone sent a programming end command... should we do something? |
| 986 | runge | 40 | break; |
| 41 | |||
| 42 | case "Pgm_Copy": |
||
| 1008 | runge | 43 | // Someone sent a programming copy command... should we do something? |
| 986 | runge | 44 | break; |
| 45 | |||
| 46 | case "Pgm_Ack": |
||
| 1008 | runge | 47 | if (CanProgrammingNode) |
| 48 | { |
||
| 49 | CanProgrammingNode.handleAck(canMessage.getData("Data")); |
||
| 50 | } |
||
| 51 | //else |
||
| 52 | //{ |
||
| 53 | // A node sent pgm ack but we are not in the progress of programming, probably to someone else |
||
| 54 | //} |
||
| 986 | runge | 55 | break; |
| 56 | |||
| 57 | case "Pgm_Nack": |
||
| 1020 | arune | 58 | if (CanProgrammingNode) |
| 59 | { |
||
| 60 | CanProgrammingNode.handleNack(canMessage.getData("Data")); |
||
| 61 | } |
||
| 1008 | runge | 62 | // I do not now what this is for... |
| 986 | runge | 63 | break; |
| 64 | |||
| 65 | case "Start_App": |
||
| 1008 | runge | 66 | // Someone sent a app start command... should we do something? |
| 986 | runge | 67 | break; |
| 68 | |||
| 69 | case "App_Start": |
||
| 1008 | runge | 70 | var node = CanNodes[canMessage.getData("HardwareId")]; |
| 71 | |||
| 72 | if (!node) |
||
| 73 | { |
||
| 74 | log("A can node with hardware id " + uint2hex(canMessage.getData("HardwareId"), 32) + " was not found, starting.\n"); |
||
| 75 | node = new CanNode(canMessage.getData("HardwareId"), null); |
||
| 76 | CanNodes[canMessage.getData("HardwareId")] = node; |
||
| 77 | } |
||
| 78 | |||
| 79 | node.handleHeartbeat(); |
||
| 986 | runge | 80 | break; |
| 81 | |||
| 82 | case "Heartbeat": |
||
| 83 | var node = CanNodes[canMessage.getData("HardwareId")]; |
||
| 84 | |||
| 85 | if (!node) |
||
| 86 | { |
||
| 87 | log("A can node with hardware id " + uint2hex(canMessage.getData("HardwareId"), 32) + " was not found, starting.\n"); |
||
| 88 | node = new CanNode(canMessage.getData("HardwareId"), canMessage.getData("NumberOfModules")); |
||
| 89 | CanNodes[canMessage.getData("HardwareId")] = node; |
||
| 90 | } |
||
| 91 | |||
| 92 | node.handleHeartbeat(canMessage.getData("NumberOfModules")); |
||
| 93 | break; |
||
| 94 | } |
||
| 95 | } |
||
| 96 | |||
| 97 | // This is used to send messages to the can network |
||
| 98 | function sendNMTMessage(canMessage) |
||
| 99 | { |
||
| 100 | sendCanNMTMessage( canMessage.getClassName(), |
||
| 101 | canMessage.getCommandName(), |
||
| 102 | canMessage.getDataString()); |
||
| 103 | } |
||
| 104 | |||
| 969 | runge | 105 | // This is called when a message has been received from the can network |
| 106 | function handleMessage(className, directionFlag, moduleName, moduleId, commandName, data) |
||
| 107 | { |
||
| 997 | runge | 108 | var canMessage = new CanMessage(className, directionFlag, moduleName, moduleId, commandName, data); |
| 109 | |||
| 969 | runge | 110 | var fullId = canMessage.getModuleName() + canMessage.getModuleId(); |
| 111 | |||
| 112 | if (canMessage.getCommandName() == "List" && canMessage.getDirectionFlag() == "From_Owner") |
||
| 113 | { |
||
| 114 | if (!CanServices[fullId]) |
||
| 115 | { |
||
| 116 | var service = ServiceManager.getService("Can", canMessage.getModuleName(), canMessage.getModuleId()) |
||
| 117 | |||
| 118 | if (service != null) |
||
| 119 | { |
||
| 986 | runge | 120 | var node = CanNodes[canMessage.getData("HardwareId")]; |
| 997 | runge | 121 | |
| 986 | runge | 122 | if (node) |
| 123 | { |
||
| 124 | service.setNode(node); |
||
| 125 | node.addService(canMessage.getData("SequenceNumber"), service); |
||
| 126 | CanNodes[canMessage.getData("HardwareId")] = node; |
||
| 127 | } |
||
| 997 | runge | 128 | |
| 969 | runge | 129 | CanServices[fullId] = service; |
| 130 | } |
||
| 131 | else |
||
| 132 | { |
||
| 133 | log("No such service found: " + canMessage.getModuleName() + "\n"); |
||
| 134 | } |
||
| 135 | } |
||
| 136 | } |
||
| 137 | else |
||
| 138 | { |
||
| 139 | if (CanServices[fullId]) |
||
| 140 | { |
||
| 141 | // Tell the service to handle the message, a module service must implement canMessageHandler or derive from CanService-class |
||
| 142 | CanServices[fullId].canMessageHandler(canMessage); |
||
| 143 | } |
||
| 144 | else if (canMessage.getModuleName() == "Debug") |
||
| 145 | { |
||
| 146 | var service = ServiceManager.getService("Can", canMessage.getModuleName(), canMessage.getModuleId()) |
||
| 147 | if (service != null) |
||
| 148 | { |
||
| 149 | CanServices[fullId] = service; |
||
| 150 | CanServices[fullId].canMessageHandler(canMessage); |
||
| 151 | } |
||
| 152 | } |
||
| 153 | } |
||
| 154 | } |
||
| 155 | |||
| 156 | // This is used to send messages to the can network |
||
| 157 | function sendMessage(canMessage) |
||
| 158 | { |
||
| 159 | sendCanMessage( canMessage.getClassName(), |
||
| 160 | canMessage.getDirectionFlag(), |
||
| 161 | canMessage.getModuleName(), |
||
| 162 | canMessage.getModuleId(), |
||
| 163 | canMessage.getCommandName(), |
||
| 164 | canMessage.getDataString()); |
||
| 165 | } |
||
| 166 | |||
| 167 | // This will be called at reqular intervals |
||
| 168 | function offlineCheck() |
||
| 169 | { |
||
| 986 | runge | 170 | for (var n in CanNodes) |
| 969 | runge | 171 | { |
| 986 | runge | 172 | CanNodes[n].checkOffline(); |
| 969 | runge | 173 | } |
| 174 | } |
||
| 175 | |||
| 974 | runge | 176 | function setAllOffline() |
| 177 | { |
||
| 986 | runge | 178 | for (var n in CanNodes) |
| 974 | runge | 179 | { |
| 986 | runge | 180 | CanNodes[n].setOffline(); |
| 974 | runge | 181 | } |
| 182 | } |