-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path23-million-dollar-erisian.el
147 lines (126 loc) · 6.58 KB
/
23-million-dollar-erisian.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
;;; 23-million-erisian.el --- Gnosis quantified with Neurosky.
;; Copyright (C) 2012 Jonathan Arkell
;; Author: Jonathan Arkell <jonnay@jonnay.net>
;; Created: 16 June 2012
;; Keywords: mindwave
;; Version 0.1
;; This file is not part of GNU Emacs.
;; Released under the GPL
;;; Commentary:
;; Please see the org-file that this was generated from.
(defgroup 23-million-erisian nil
"23 Million Man. An stats collector for mindwave")
(defcustom 23-million-erisian/store-in-org-file "~/Dropbox/org/Brain.org"
"Full file path of where to store the data."
:group '23-million-erisian
:type 'file)
(defcustom 23-million-erisian/tblname-of-data "23million"
"Name of the table where data is to be stored."
:type 'symbol
:group '23-million-erisian)
;; note, I do this a lot, maybe it is time to abstract it properly in mindwave-emacs
(defun 23-million-erisian/start ()
"Start recording the 23 million erisian."
(interactive)
(mindwave-get-buffer)
(when (not (member '23-million-erisian/running-average-hook mindwave/brain-ring-full-hook))
(add-hook 'mindwave/brain-ring-full-hook '23-million-erisian/running-average-hook)))
(defun 23-million-erisian/stop ()
"Stop recording the 23 million erisian"
(interactive)
(remove-hook 'mindwave/brain-ring-full-hook '23-million-erisian/running-average-hook))
(defcustom 23-million-erisian/ring-averages-per-insertion 2
"Number of insertions to put into the table every time the ring fills up.
This is your effective resolution. Here are some general approximations and timing:
val time
1 30 seconds
2 1 minute
30 15 minutes
60 30 minutes
120 1 hour"
:group '23-million-erisian)
(defvar 23-million-erisian/running-average-data nil
"Data structure to hold the running average.
It is in the format of:
(total-as-int . average-brain-ring-so-far)")
(defun 23-million-erisian/running-average-hook (average-brain-ring)
"Takes an AVERAGE-BRAIN-RING, and then updates the minute average."
(let ((total (+ (if 23-million-erisian/running-average-data
(car 23-million-erisian/running-average-data)
0)
1))
(average (if 23-million-erisian/running-average-data
(cdr 23-million-erisian/running-average-data)
(mindwave/make-single-val-brain-ring 0))))
(setq 23-million-erisian/running-average-data
(cons total
(mindwave/brain-ring-apply 'mindwave/safe-div
(mindwave/brain-ring-apply '+
average
average-brain-ring)
(mindwave/make-single-val-brain-ring total))))
(when (>= total 23-million-erisian/ring-averages-per-insertion)
(23-million-erisian/do-insertion-into-file (cdr 23-million-erisian/running-average-data))
(setq 23-million-erisian/running-average-data nil))))
(defvar 23-million-erisian/tbl-buffer-pos nil)
(defconst 23-million-erisian/tbl-current-pos-marker "#mindwave-23million-pos")
(defun 23-million-erisian/do-insertion-into-file (data)
"Inserts DATA into the 23-million-erisian table."
(save-excursion
(progn
(set-buffer (find-file-noselect 23-million-erisian/store-in-org-file))
(23-million-erisian/find-buffer-pos)
(goto-char 23-million-erisian/tbl-buffer-pos)
(when (not (string-equal (buffer-substring-no-properties (line-beginning-position)
(line-end-position))
23-million-erisian/tbl-current-pos-marker))
(error (concat "23-million-erisian: ARG, can't find the proper position to insert data! make sure you have '" 23-million-erisian/tbl-current-pos-marker "' at the bottom of your data table."))))
(delete-region (line-beginning-position)
(line-end-position))
(23-million-erisian/write-running-average data)
(setq 23-million-erisian/tbl-buffer-pos (line-beginning-position))
(insert 23-million-erisian/tbl-current-pos-marker)
(insert "\n")))
(defun 23-million-erisian/find-buffer-pos ()
"find the current insert buffer position for the mindwave table.
Start by opening the file if we have to."
(save-excursion
(set-buffer (find-file-noselect 23-million-erisian/store-in-org-file))
(goto-char (point-min))
(if (re-search-forward (concat "^[ \t]*#\\+TBLNAME:[ \t]*"
23-million-erisian/tblname-of-data
"[ \t]*$")
nil t)
(progn
(goto-char (match-beginning 0))
(if (re-search-forward 23-million-erisian/tbl-current-pos-marker nil t)
(setq 23-million-erisian/tbl-buffer-pos (match-beginning 0))
(error (concat "Cant find marker to insert data. Make sure you have " 23-million-erisian/tbl-current-pos-marker " on your table."))))
(error (concat "Can't find table data " 23-million-erisian/tblname-of-data)))))
(ert-deftest 23-million-erisian/find-buffer-pos ()
""
(should (< 0 (23-million-erisian/find-buffer-pos)))
(should-not (null 23-million-erisian/tbl-buffer-pos)))
(defun 23-million-erisian/write-running-average (brain)
"Writes the running average. used as part of a run-timer"
(let ((time (decode-time)))
; y m d h m s g g b b a a t d m a
(insert (format "| %4s | %5s | %3s | %4s | %6s | %6s | %9s | %8s | %8s | %7s | %9s | %8s | %8s | %10s | %10s | %9s | %s | \n"
(nth 5 time)
(nth 4 time)
(nth 3 time)
(nth 2 time)
(nth 1 time)
(cdr (assoc 'poorSignalLevel brain))
(mindwave/access-in 'eegPower 'lowGamma brain)
(mindwave/access-in 'eegPower 'highGamma brain)
(mindwave/access-in 'eegPower 'lowBeta brain)
(mindwave/access-in 'eegPower 'highBeta brain)
(mindwave/access-in 'eegPower 'lowAlpha brain)
(mindwave/access-in 'eegPower 'highAlpha brain)
(mindwave/access-in 'eegPower 'theta brain)
(mindwave/access-in 'eegPower 'delta brain)
(mindwave/access-in 'eSense 'meditation brain)
(mindwave/access-in 'eSense 'attention brain)
23-million-erisian/mark))))
(provide '23-million-dollar-erisian)