Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
In Socialtext Unplugged, the selected pages of your Socialtext workspace are displayed as individual "tiddlers" on the page. When the mouse passes over a tiddler a short toolbar menu appears at the top right. Use the commands here to manipulate that particular tiddler: notably closing and editting it. (You can double click on a tiddler as a shortcut to directly enter edit mode).
Over on the right hand side of the window are commands that affect the entire page, in particular "close all" which can be useful to clear the decks when many tiddlers are open at once.
The user is encouraged to ensure that they can SaveChanges before embarking on widespread editing.
Welcome to Socialtext Unplugged. This is a specially designed web page that you can use to view and edit your Socialtext content without having to be online to your Socialtext server.
There are three steps to using Socialtext Unplugged:
* First, learn how to SaveChanges to your local hard drive. This keeps your work safe even if you close your browser or have to reboot your computer
* Secondly, find out how to BrowseAndEdit your content while it is unplugged
* Thirdly, when you can reconnect to your Socialtext server, you can SyncChanges to save your unplugged changes to the server so that other people can see them too
You should also check your system meets the SystemRequirements.
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div class="socialtextLogo"><img src="http://www.eu.socialtext.net/static/2.3.0.0/images/st/logo/socialtext-logo-152x26.gif" width=152 height=26></div>
</div>
<!--}}}-->
Socialtext Unplugged lets you browse and edit your content while you're offline. When you make a change you need to SaveChanges to save the change to your local hard drive, before later performing a SyncChanges to synchronise the change back to the server.
The procedure for SaveChanges is slightly different for different browsers:
* SavingOnInternetExplorer
* SavingOnFireFox
* SavingOnSafari
* SavingOnOpera
You can save changes with any version of FireFox, and also many other browsers in the FireFox family, such as Camino on the Mac and MiniMo on mobile devices. The procedure is:
# Click the button labelled 'save changes' over in the right hand sidebar
# If prompted with an "Internet Security" dialog as follows, click the checkbox labelled "Remember this decision" and then the "Allow" button
## "A script from "file://" is requesting enhanced capabilities that are UNSAFE and could be used to compromise your machine or data..."
# You should then see a message at the top right of the window saying "Main TiddlyWiki file saved"
If you accidentally //deny// permission instead, you may need to UnravelFireFoxPermissions.
You can save changes with Internet Explorer versions 6 and 7, but not the earlier versions. The procedure is:
# Click the button labelled 'save changes' over in the right hand sidebar
# If prompted as follows, click "Yes":
## "An ActiveX control on this page might be unsafe to interact with other parts of the page. Do you want to allow this interaction?"
# You should then see a message at the top right of the window saying "Main TiddlyWiki file saved"
Note that there is currently [[a bug|http://trac.tiddlywiki.org/tiddlywiki/ticket/39]] that prevents Internet Explorer from saving correctly if you have specified a backup directory in AdvancedOptions.
To SaveChanges on Opera, see the instructions for using the TiddlySaver Java applet.
To SaveChanges on Safari, see the instructions for using the TiddlySaver Java applet.
<<search>><<closeAll>><<permaview>><<newTiddler 'New Tiddler' fields:'server.host:"https://saturn.ffzg.hr%2C%20saturn.ffzg.hr:443" server.workspace:"rot13" wikiformat:socialtext'>><<newJournal 'DD MMM YYYY' fields:'server.host:"https://saturn.ffzg.hr%2C%20saturn.ffzg.hr:443" server.workspace:"rot13" wikiformat:socialtext'>><<saveChanges>><<backstage sync>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
Dobrica Pavlinušić's random unstructured stuff
https://saturn.ffzg.hr/rot13/
[[SocialtextScreenStyle]]
[[SocialtextStyleOverrides]]
[[Styles HorizontalMainMenu]]
@@The user interface for synchronization is not finalized@@
To synchronize your changes back to the Socialtext server:
# click on [[Sync]] in the right-hand sidebar
<<tabs txtMoreTab Orphans 'Orphaned tiddlers' TabMoreOrphans Shadowed 'Shadowed tiddlers' TabMoreShadowed>>
Under FireFox, you can run into problems if you accidentally click 'Deny' on the permission request dialog, and have selected //Remember this decision//.
To reverse the effects, first locate the file {{{prefs.js}}} in your FireFox profile directory. Under Windows you'll find it at something like {{{C:\Documents and Settings\Jeremy\Application Data\Mozilla\Firefox\Profiles\o3dhupu6.default\prefs.js}}}, where {{{Jeremy}}} is the name of your windows profile and {{{o3dhupu6}}} will be a similar string of gobbledegook. On the Mac it'll be at {{{~/Library/Application Support/Firefox/Profiles/o3dhupu6.default/prefs.js}}} and on most versions of Linux, at {{{~/.mozilla/firefox/o3dhupu6.default/prefs.js}}}.
Open the file in a text editor and find the line {{{user_pref("capability.principal.codebase.p0.denied", "UniversalXPConnect");}}} and simply replace the word {{{denied}}} with {{{granted}}}.
//(Thanks to JonScully for figuring out this fix)//
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler references > fields syncing jump'></div>
<div class='workspace' id='st-page-wiki-title' macro='view socialtext.workspace'></div>
<div class='title' id='st-page-titletext' macro='view title'></div>
<div class='subtitle'>
Created on <span macro='view created date [[MMM DD, 0hh:0mm]]'></span>.
Updated by <span macro='view modifier link'></span>
on <span macro='view modified date [[MMM DD, 0hh:0mm]]'></span></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></span></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
/***
To use, add {{{[[Styles HorizontalMainMenu]]}}} to your StyleSheet tiddler.
See http://www.w3schools.com/css/css_colors.asp for a color chart.
***/
/*{{{*/
#mainMenu {position:relative;left:auto;width:auto;text-align:left;line-height:normal;padding 0em 1em 0em 1em;font-size:normal;}
#mainMenu br {display:none;}
#mainMenu {background:#336699;}
#mainMenu {padding:2px;}
#mainMenu .button, #mainMenu .tiddlyLink {padding-left:0.5em;padding-right:0.5em;color:white;font-size:115%;}
#displayArea {
margin-top:0;margin-right:20em;margin-bottom:0;margin-left:1em;
padding-top:.1em;padding-bottom:.1em;
}
/*}}}*/
|''Type:''|socialtext|
|''URL:''|https://saturn.ffzg.hr%2C%20saturn.ffzg.hr:443 |
|''Workspace:''|rot13|
|''WorkspaceList:''||
|''Description:''|Dobrica Pavlinušić's random unstructured stuff|
The TiddlySaver Java applet allows TiddlyWiki from a {{{file://}}} URL to save changes Safari, Opera and other browsers.
It is a small file named [["TiddlySaver.jar"|TiddlySaver.jar]] that must be placed in the same directory as your TiddlyWiki file. Before you can use it, you need to give it the necessary privileges by editting your {{{.java.policy}}} file.
For Windows, the file will be at {{{C:\Documents and Settings\your-user-name\.java.policy}}}. Add the following lines (substituting the directory of your TiddlyWiki file as appropriate):
{{{
grant codeBase "file:${user.home}/My Documents/tiddlywiki-folder/*" {
permission java.io.FilePermission "${user.home}${/}My Documents${/}tiddlywiki-folder${/}*", "read,write";
};
}}}
On Mac OS X, the file is found at {{{/Users/your-user-name/.java.policy}}}:
{{{
grant codeBase "file:${user.home}/Documents/tiddlywiki-folder/*" {
permission java.io.FilePermission "${user.home}${/}Documents${/}tiddlywiki-folder${/}*", "read,write";
};
}}}
It can be tricky creating files whose name starts with a period, so you can use this [[pre-built .java.policy file|.java.policy]]. The same file is suitable for Macs too, just edit it and delete the "My " bit, leaving just "Documents". Make sure you save it in the right place for each operating system!
If you have trouble setting up the permissions correctly, you can try granting broader permissions to the applet like this:
{{{
grant codeBase "file://localhost/home/users/Desktop/
TiddlySaver.jar"
{ permission java.security.AllPermission; };
}}}
Note that there is currently [[a bug|http://trac.tiddlywiki.org/ticket/172]] that prevents TiddlySaver from working if you have specified a backup directory in AdvancedOptions.
/***
|''Name:''|SocialtextLocaleOverrides|
|''Description:''|Text changes for Socialtext|
***/
//{{{
merge(config.views.wikified.tag,{
labelNoTags: "No Tags",
labelTags: "Tags"});
merge(config.commands.references,{
text: "incoming links",
tooltip: "Show tiddlers that link to this one",
popupNone: "No incoming links"});
//}}}
/***
|''Name:''|SocialtextTweaksPlugin|
|''Description:''|Allows changes to be synchronised with a Socialtext server|
|''Source:''|http://stunplugged.tiddlywiki.com/#SocialtextTweaksPlugin|
|''Author:''|JeremyRuston (jeremy (at) osmosoft (dot) com)|
|''Version:''|1.0.2|
|''Date:''|Jun 15, 2006|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.2|
Make minor configuration tweaks specific to Socialtext Unplugged
***/
//{{{
// Ensure that the SocialtextTweaksPlugin is only installed once.
if(!version.extensions.SocialtextTweaksPlugin) {
version.extensions.SocialtextTweaksPlugin = {installed:true};
// Check version number of core code
if(version.major < 2 || (version.major == 2 && version.minor < 2))
{alertAndThrow("SocialtextTweaksPlugin requires TiddlyWiki 2.2 or later.");}
merge(config.defaultCustomFields,{
wikiformat:'socialtext',
'server.host':'https://saturn.ffzg.hr%2C%20saturn.ffzg.hr:443'
});
config.options.chkSinglePageMode = true;
config.options.chkEnableAnimations = true;
} // end of "install only once"
//}}}
/***
|''Name:''|SocialtextFormatterPlugin|
|''Description:''|Allows Tiddlers to use [[Socialtext|http://www.socialtext.com/]] text formatting|
|''Author:''|Martin Budden (mjbudden (at) gmail (dot) com)|
|''Source:''|http://www.martinswiki.com/#SocialtextFormatterPlugin|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/SocialtextFormatterPlugin.js|
|''Version:''|0.9.4|
|''Date:''|Jan 21, 2007|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''~CoreVersion:''|2.1.0|
This is the SocialtextFormatterPlugin, which allows you to insert Socialtext formated text into a TiddlyWiki.
The aim is not to fully emulate Socialtext, but to allow you to work with Socialtext content off-line and then resync the content with your Socialtext wiki later on, with the expectation that only minor edits will be required.
To use Socialtext format in a Tiddler, tag the Tiddler with SocialtextFormat or set the tiddler's {{{wikiformat}}} extended field to {{{socialtext}}}
Please report any defects you find at http://groups.google.co.uk/group/TiddlyWikiDev
***/
//{{{
// Ensure that the SocialtextFormatter Plugin is only installed once.
if(!version.extensions.SocialtextFormatterPlugin) {
version.extensions.SocialtextFormatterPlugin = {installed:true};
if(version.major < 2 || (version.major == 2 && version.minor < 1))
{alertAndThrow('SocialtextFormatterPlugin requires TiddlyWiki 2.1 or later.');}
SocialtextFormatter = {}; // 'namespace' for local functions
wikify = function(source,output,highlightRegExp,tiddler)
{
if(source && source != '') {
var w = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
var out = output;
if(tiddler && (tiddler.isTagged(config.parsers.socialtextFormatter.formatTag) || (tiddler.fields.wikiformat==config.parsers.socialtextFormatter.format)) ) {
var d1 = createTiddlyElement(output,'div','content-display-body','content-section-visible');
var d2 = createTiddlyElement(d1,'div','wikipage');
out = createTiddlyElement(d2,'div',null,'wiki');
}
var time1,time0 = new Date();
w.subWikifyUnterm(out);
if(tiddler && config.options.chkDisplayInstrumentation) {
time1 = new Date();
var t = tiddler ? tiddler.title : source.substr(0,10);
displayMessage("Wikify '"+t+"' in " + (time1-time0) + " ms");
}
}
};
stDebug = function(out,str)
{
createTiddlyText(out,str.replace(/\n/mg,'\\n').replace(/\r/mg,'RR'));
createTiddlyElement(out,'br');
};
SocialtextFormatter.Tiddler_changed = Tiddler.prototype.changed;
Tiddler.prototype.changed = function()
{
if((this.fields.wikiformat==config.parsers.socialtextFormatter.format) || this.isTagged(config.parsers.socialtextFormatter.formatTag)) {
// update the links array, by checking for Socialtext format links
this.links = [];
var tiddlerLinkRegExp = /(?:\"(.*?)\" ?)?\[([^\]]*?)\]/mg;
tiddlerLinkRegExp.lastIndex = 0;
var match = tiddlerLinkRegExp.exec(this.text);
while(match) {
var link = match[2];
this.links.pushUnique(link);
match = tiddlerLinkRegExp.exec(this.text);
}
}/* else {
return SocialtextFormatter.Tiddler_changed.apply(this,arguments);
}*/
this.linksUpdated = true;
};
SocialtextFormatter.wafl = function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var lm2 = lookaheadMatch[2];
switch(lookaheadMatch[1]) {
case 'image':
var img = createTiddlyElement(w.output,'img');
img.src = w.tiddler.title + '/' + lm2;
createTiddlyText(img,lm2);
break;
case 'file':
var s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
var a = createTiddlyElement(s,'a');
a.href = w.tiddler.title + '/' + lm2;
createTiddlyText(a,lm2);
break;
case 'link':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createTiddlyElement(s,'a');
var t = w.tiddler ? w.tiddler.title + ':' : '';
a.setAttribute('href','#' + t + lm2);
a.title = 'section link';
createTiddlyText(a,lm2);
break;
case 'weblog':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
var text = lm2;
var link = 'Weblog: ' + lm2;
createTiddlyText(createTiddlyLink(s,link,false,null,w.isStatic),text);
break;
case 'section':
a = createTiddlyElement(w.output,'a');// drop anchor
t = w.tiddler ? w.tiddler.title + ':' : '';
a.setAttribute('name',t + lm2);
break;
case 'date':
createTiddlyText(w.output,lm2);
break;
case 'user':
var oldSource = w.source;
w.source = lm2;
w.nextMatch = 0;
w.subWikifyUnterm(w.output);
w.source = oldSource;
break;
// Shortcut expansions - not strictly syntax
case 'google':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createExternalLink(s,'http://www.google.com/search?q='+lm2);
createTiddlyText(a,lm2);
break;
case 'fedex':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createExternalLink(s,'http://www.fedex.com/Tracking?tracknumbers='+lm2);
createTiddlyText(a,lm2);
break;
case 'map':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createExternalLink(s,'http://maps.google.com/maps?q='+lm2);
createTiddlyText(a,lm2);
break;
case 'wikipedia':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createExternalLink(s,'http://en.wikipedia.org/wiki/'+lm2);
createTiddlyText(a,lm2);
break;
case 'rt':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createExternalLink(s,'http://rt.socialtext.net/Ticket/Display.html?id='+lm2);
createTiddlyText(a,lm2);
break;
case 'stcal':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createExternalLink(s,'https://calendar.socialtext.net:445/view_t.php?timeb=1&id=3&date='+lm2);
createTiddlyText(a,lm2);
break;
case 'svn':
s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
a = createExternalLink(s,'https://repo.socialtext.net/listing.php?rev='+lm2+'sc=1');
createTiddlyText(a,lm2);
break;
default:
w.outputText(w.output,w.matchStart,w.nextMatch);
return;
}
w.nextMatch = this.lookaheadRegExp.lastIndex;
} else {
w.outputText(w.output,w.matchStart,w.nextMatch);
}
};
SocialtextFormatter.presence = function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var p = lookaheadMatch[1];
var text = lookaheadMatch[2];
var link;
var src;
if(p=='aim') {
link = 'aim:goim?screenname=' + text + '&message=hello';
src = 'http://big.oscar.aol.com/sleepleft?on_url=http://www.aim.com/remote/gr/MNB_online.gif&off_url=http://www.aim.com/remote/gr/MNB_offline.gif';
} else if(p=='yahoo'||p=='ymsgr') {
link = 'ymsgr:sendIM?'+text;
src = 'http://opi.yahoo.com/online?u=chrislondonbridge&f=.gif';
} else if(p=='skype'||p=='callto') {
link = 'callto:'+text;
src = 'http://goodies.skype.com/graphics/skypeme_btn_small_green.gif';
} else if(p=='asap') {
link = 'http://asap2.convoq.com/AsapLinks/Meet.aspx?l='+text;
src = 'http://asap2.convoq.com/AsapLinks/Presence.aspx?l='+text;
}
var s = createTiddlyElement(w.output,'span',null,'nlw_phrase');
var a = createExternalLink(s,link);
var img = createTiddlyElement(a,'img');
createTiddlyText(a,text);
img.src = src;
img.border='0';
img.alt = '(' + lookaheadMatch[1] + ')';
if(p=='aim') {
img.width='11'; img.height='13';
}
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
};
config.formatterHelpers.singleCharFormat = function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[0].substr(lookaheadMatch[0].length-2,1) != ' ') {
w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);
} else {
w.outputText(w.output,w.matchStart,w.nextMatch);
}
};
config.socialtext = {};
config.socialtext.formatters = [
{
name: 'socialtextHeading',
match: '^\\^{1,6} ?',
termRegExp: /(\n+)/mg,
handler: function(w)
{
var len = w.matchText.trim().length;
var e = createTiddlyElement(w.output,'h' + len);
var a = createTiddlyElement(e,'a');// drop anchor
var t = w.tiddler ? w.tiddler.title + ':' : '';
len = w.source.substr(w.nextMatch).indexOf('\n');
a.setAttribute('name',t+w.source.substr(w.nextMatch,len));
w.subWikifyTerm(e,this.termRegExp);
}
},
{
name: 'socialtextTable',
match: '^\\|(?:(?:.|\n)*)\\|$',
lookaheadRegExp: /^\|(?:(?:.|\n)*)\|$/mg,
cellRegExp: /(?:\|(?:[^\|]*)\|)(\n|$)?/mg,
cellTermRegExp: /((?:\x20*)\|)/mg,
handler: function(w)
{
var table = createTiddlyElement(w.output,'table');
var rowContainer = createTiddlyElement(table,'tbody');
var prevColumns = [];
w.nextMatch = w.matchStart;
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
var r = this.rowHandler(w,createTiddlyElement(rowContainer,'tr'),prevColumns);
if(!r) {
w.nextMatch++;
break;
}
this.lookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = this.lookaheadRegExp.exec(w.source);
}
},
rowHandler: function(w,e,prevColumns)
{
this.cellRegExp.lastIndex = w.nextMatch;
var cellMatch = this.cellRegExp.exec(w.source);
while(cellMatch && cellMatch.index == w.nextMatch) {
w.nextMatch++;
var cell = createTiddlyElement(e,'td');
w.subWikifyTerm(cell,this.cellTermRegExp);
if(cellMatch[1]) {
// End of row
w.nextMatch = this.cellRegExp.lastIndex;
return true;
}
// Cell
w.nextMatch--;
this.cellRegExp.lastIndex = w.nextMatch;
cellMatch = this.cellRegExp.exec(w.source);
}
return false;
}
},
{
name: 'socialtextList',
match: '^[\\*#]+ ',
lookaheadRegExp: /^([\*#])+ /mg,
termRegExp: /(\n+)/mg,
handler: function(w)
{
var stack = [w.output];
var currLevel = 0, currType = null;
var itemType = 'li';
w.nextMatch = w.matchStart;
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
var listType = lookaheadMatch[1] == '*' ? 'ul' : 'ol';
var listLevel = lookaheadMatch[0].length;
w.nextMatch += listLevel;
if(listLevel > currLevel) {
for(var i=currLevel; i<listLevel; i++) {
stack.push(createTiddlyElement(stack[stack.length-1],listType));
}
} else if(listLevel < currLevel) {
for(i=currLevel; i>listLevel; i--) {
stack.pop();
}
} else if(listLevel == currLevel && listType != currType) {
stack.pop();
stack.push(createTiddlyElement(stack[stack.length-1],listType));
}
currLevel = listLevel;
currType = listType;
var e = createTiddlyElement(stack[stack.length-1],itemType);
w.subWikifyTerm(e,this.termRegExp);
this.lookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = this.lookaheadRegExp.exec(w.source);
}
}
},
{
name: 'socialtextQuoteByLine',
match: '^>+',
lookaheadRegExp: /^>+/mg,
termRegExp: /(\n)/mg,
element: 'blockquote',
handler: function(w)
{
var stack = [w.output];
var currLevel = 0;
var newLevel = w.matchLength;
var i;
do {
if(newLevel > currLevel) {
for(i=currLevel; i<newLevel; i++) {
stack.push(createTiddlyElement(stack[stack.length-1],this.element));
}
} else if(newLevel < currLevel) {
for(i=currLevel; i>newLevel; i--) {
stack.pop();
}
}
currLevel = newLevel;
w.subWikifyTerm(stack[stack.length-1],this.termRegExp);
createTiddlyElement(stack[stack.length-1],'br');
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;
if(matched) {
newLevel = lookaheadMatch[0].length;
w.nextMatch += newLevel;
}
} while(matched);
}
},
{
name: 'socialtextRule',
match: '^----+$\\n+',
handler: function(w)
{
createTiddlyElement(w.output,'hr');
}
},
{
name: 'socialtextPreformatted',
match: '^\\.pre\\s*\\n',
lookaheadRegExp: /^.pre\s*\n((?:.|\n)*?)\n.pre\s*\n/mg,
element: 'pre',
handler: config.formatterHelpers.enclosedTextHelper
},
{
name: 'socialtextHtml',
match: '^\\.html',
lookaheadRegExp: /\.html((?:.|\n)*?)\.html/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
createTiddlyElement(w.output,'span').innerHTML = lookaheadMatch[1];
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: 'macro',
match: '<<',
lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) {
w.nextMatch = this.lookaheadRegExp.lastIndex;
invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);
}
}
},
{
name: 'socialtextExplicitLink',
match: '(?:".*?" ?)?\\[',
lookaheadRegExp: /(?:\"(.*?)\" ?)?\[([^\]]*?)\]/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var link = lookaheadMatch[2];
var text = lookaheadMatch[1] ? lookaheadMatch[1] : link;
createTiddlyText(createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler),text);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: 'socialtextExternalLink',
match: '(?:".*?" ?)?<[a-z]{2,8}:',
lookaheadRegExp: /(?:\"(.*?)\" ?)?<([a-z]{2,8}:.*?)>/mg,
imgRegExp: /\.(?:gif|ico|jpg|png)/g,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var link = lookaheadMatch[2];
var text = lookaheadMatch[1] ? lookaheadMatch[1] : link;
this.imgRegExp.lastIndex = 0;
if(this.imgRegExp.exec(link)) {
var img = createTiddlyElement(w.output,'img');
if(lookaheadMatch[1]) {
img.title = text;
}
img.alt = text;
img.src = link;
} else {
createTiddlyText(createExternalLink(w.output,link),text);
}
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: 'socialtextUrlLink',
match: config.textPrimitives.urlPattern,
handler: function(w)
{
w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch);
}
},
{
name: 'socialtextBold',
match: '\\*(?![\\s\\*])',
lookaheadRegExp: /\*(?!\s)(?:.*?)(?!\s)\*(?=[$\s\|\._\-,])/mg,
termRegExp: /((?!\s)\*(?=[$\s\|\.\-_,]))/mg,
element: 'strong',
handler: config.formatterHelpers.singleCharFormat
},
{
name: 'socialtextItalic',
match: '_(?![\\s_])',
lookaheadRegExp: /_(?!\s)(?:.*?)(?!\s)_(?=[$\s\|\.\*\-,])/mg,
termRegExp: /((?!\s)_(?=[$\s\|\.\*\-,]))/mg,
element: 'em',
handler: config.formatterHelpers.singleCharFormat
},
{
name: 'socialtextStrike',
match: '-(?![\\s\\-])',
lookaheadRegExp: /-(?!\s)(?:.*?)(?!\s)-(?=[$\s\|\.\*_,])/mg,
termRegExp: /((?!\s)-(?=[$\s\|\.\*_,]))/mg,
element: 'del',
handler: config.formatterHelpers.singleCharFormat
},
{
name: 'socialtextMonoSpaced',
match: '`(?![\\s`])',
lookaheadRegExp: /`(?!\s)(?:.*?)(?!\s)`(?=[$\s\.\*\-_,])/mg,
termRegExp: /((?!\s)`(?=[$\s\.\*\-_,]))/mg,
element: 'tt',
handler: config.formatterHelpers.singleCharFormat
},
{
name: 'socialtextParagraph',
match: '\\n{2,}',
handler: function(w)
{
createTiddlyElement(w.output,'p');
}
},
{
name: 'socialtextLineBreak',
match: '\\n',
handler: function(w)
{
createTiddlyElement(w.output,'br');
}
},
{
name: 'socialtextNoWiki',
match: '\\{\\{',
lookaheadRegExp: /\{\{((?:.|\n)*?)\}\}/mg,
element: 'span',
handler: config.formatterHelpers.enclosedTextHelper
},
{
name: 'socialtextTrademark',
match: '\\{tm\\}',
handler: function(w)
{
createTiddlyElement(w.output,'span').innerHTML = '™';
}
},
{
name: 'socialtextWafl',
match: '\\{(?:[a-z]{2,16}): ?.*?\\}',
lookaheadRegExp: /\{([a-z]{2,16}): ?(.*?)\}/mg,
handler: SocialtextFormatter.wafl
},
{
name: 'socialtextPresence',
match: '(?:aim|yahoo|ymsgr|skype|callto|asap):\\w+',
lookaheadRegExp: /(aim|yahoo|ymsgr|skype|callto|asap):(\w+)/mg,
handler: SocialtextFormatter.presence
},
{
name: 'socialtextMailTo',
match: '[\\w\.]+@[\\w]+\.[\\w\.]+',
lookaheadRegExp: /([\w\.]+@[\w]+\.[\w\.]+)/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var text = lookaheadMatch[1];
createTiddlyText(createExternalLink(w.output,'mailto:'+text),text);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: 'socialtextHtmlEntitiesEncoding',
match: '&#?[a-zA-Z0-9]{2,8};',
handler: function(w)
{
createTiddlyElement(w.output,'span').innerHTML = w.matchText;
}
}
];
config.parsers.socialtextFormatter = new Formatter(config.socialtext.formatters);
config.parsers.socialtextFormatter.format = 'socialtext';
config.parsers.socialtextFormatter.formatTag = 'SocialtextFormat';
} // end of 'install only once'
//}}}
/***
|''Name:''|SocialtextAdaptorPlugin|
|''Description:''|Adaptor for moving and converting data to and from Socialtext Wikis|
|''Author:''|Martin Budden (mjbudden (at) gmail (dot) com) and JeremyRuston (jeremy (at) osmosoft (dot) com)|
|''Source:''|http://www.martinswiki.com/#SocialtextAdaptorPlugin|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/SocialtextAdaptorPlugin.js|
|''Version:''|0.5.1|
|''Date:''|Feb 25, 2007|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''~CoreVersion:''|2.2.0|
Socialtext REST documentation is at:
http://www.eu.socialtext.net/st-rest-docs/index.cgi?socialtext_rest_documentation
***/
//{{{
if(!version.extensions.SocialtextAdaptorPlugin) {
version.extensions.SocialtextAdaptorPlugin = {installed:true};
function SocialtextAdaptor()
{
this.host = null;
this.workspace = null;
return this;
}
SocialtextAdaptor.mimeType = 'text/x.socialtext-wiki';
SocialtextAdaptor.serverType = 'socialtext';
SocialtextAdaptor.serverParsingErrorMessage = "Error parsing result from server";
SocialtextAdaptor.errorInFunctionMessage = "Error in function SocialtextAdaptor.%0";
SocialtextAdaptor.prototype.setContext = function(context,userParams,callback)
{
if(!context) context = {};
context.userParams = userParams;
if(callback) context.callback = callback;
context.adaptor = this;
if(!context.host)
context.host = this.host;
if(!context.workspace && this.workspace)
context.workspace = this.workspace;
return context;
};
SocialtextAdaptor.doHttpGET = function(uri,callback,params,headers,data,contentType,username,password)
{
return doHttp('GET',uri,data,contentType,username,password,callback,params,headers);
};
SocialtextAdaptor.doHttpPOST = function(uri,callback,params,headers,data,contentType,username,password)
{
return doHttp('POST',uri,data,contentType,username,password,callback,params,headers);
};
SocialtextAdaptor.fullHostName = function(host)
{
if(!host)
return '';
if(!host.match(/:\/\//))
host = 'http://' + host;
if(host.substr(host.length-1) != '/')
host = host + '/';
return host;
};
SocialtextAdaptor.minHostName = function(host)
{
return host ? host.replace(/^http:\/\//,'').replace(/\/$/,'') : '';
};
// Convert a page title to the normalized form used in uris
SocialtextAdaptor.normalizedTitle = function(title)
{
var n = title.toLowerCase();
n = n.replace(/\s/g,'_').replace(/\//g,'_').replace(/\./g,'_').replace(/:/g,'').replace(/\?/g,'');
if(n.charAt(0)=='_')
n = n.substr(1);
return String(n);
};
// Convert a Socialtext date in YYYY-MM-DD hh:mm format into a JavaScript Date object
SocialtextAdaptor.dateFromEditTime = function(editTime)
{
var dt = editTime;
return new Date(Date.UTC(dt.substr(0,4),dt.substr(5,2)-1,dt.substr(8,2),dt.substr(11,2),dt.substr(14,2)));
};
SocialtextAdaptor.prototype.openHost = function(host,context,userParams,callback)
{
this.host = SocialtextAdaptor.fullHostName(host);
context = this.setContext(context,userParams,callback);
if(context.callback) {
context.status = true;
window.setTimeout(function() {callback(context,userParams);},0);
}
return true;
};
SocialtextAdaptor.prototype.openWorkspace = function(workspace,context,userParams,callback)
{
this.workspace = workspace;
context = this.setContext(context,userParams,callback);
if(context.callback) {
context.status = true;
window.setTimeout(function() {callback(context,userParams);},0);
}
return true;
};
SocialtextAdaptor.prototype.getWorkspaceList = function(context,userParams,callback)
{
context = this.setContext(context,userParams,callback);
var uriTemplate = '%0data/workspaces';
var uri = uriTemplate.format([context.host]);
var req = SocialtextAdaptor.doHttpGET(uri,SocialtextAdaptor.getWorkspaceListCallback,context,{'accept':'application/json'});
return typeof req == 'string' ? req : true;
};
SocialtextAdaptor.getWorkspaceListCallback = function(status,context,responseText,uri,xhr)
{
context.status = false;
context.statusText = SocialtextAdaptor.errorInFunctionMessage.format(['getWorkspaceListCallback']);
if(status) {
try {
eval('var info=' + responseText);
} catch (ex) {
context.statusText = exceptionText(ex,SocialtextAdaptor.serverParsingErrorMessage);
if(context.callback)
context.callback(context,context.userParams);
return;
}
var list = [];
for(var i=0; i<info.length; i++) {
var item = {
title:info[i].title,
name:info[i].name,
modified:SocialtextAdaptor.dateFromEditTime(info[i].modified_time)
};
list.push(item);
}
context.workspaces = list;
context.status = true;
} else {
context.statusText = xhr.statusText;
}
if(context.callback)
context.callback(context,context.userParams);
};
SocialtextAdaptor.prototype.getTiddlerList = function(context,userParams,callback)
{
context = this.setContext(context,userParams,callback);
var uriTemplate = '%0data/workspaces/%1/pages?order=newest';//!! ? or ;
var uri = uriTemplate.format([context.host,context.workspace]);
var req = SocialtextAdaptor.doHttpGET(uri,SocialtextAdaptor.getTiddlerListCallback,context,{'accept':'application/json'});
return typeof req == 'string' ? req : true;
};
SocialtextAdaptor.getTiddlerListCallback = function(status,context,responseText,uri,xhr)
{
context.status = false;
context.statusText = SocialtextAdaptor.errorInFunctionMessage.format(['getTiddlerListCallback']);
if(status) {
try {
eval('var info=' + responseText);
} catch (ex) {
context.statusText = exceptionText(ex,SocialtextAdaptor.serverParsingErrorMessage);
if(context.callback)
context.callback(context,context.userParams);
return;
}
var list = [];
for(var i=0; i<info.length; i++) {
var tiddler = new Tiddler(info[i].name);
tiddler.modified = SocialtextAdaptor.dateFromEditTime(info[i].last_edit_time);
tiddler.modifier = info[i].last_editor;
tiddler.tags = info[i].tags;
tiddler.fields['server.page.id'] = info[i].page_id;
tiddler.fields['server.page.name'] = info[i].name;
tiddler.fields['server.page.revision'] = String(info[i].revision_id);
list.push(tiddler);
}
context.tiddlers = list;
context.status = true;
} else {
context.statusText = xhr.statusText;
}
if(context.callback)
context.callback(context,context.userParams);
};
SocialtextAdaptor.prototype.generateTiddlerInfo = function(tiddler)
{
var info = {};
var host = this && this.host ? this.host : SocialtextAdaptor.fullHostName(tiddler.fields['server.host']);
var workspace = this && this.workspace ? this.workspace : tiddler.fields['server.workspace'];
uriTemplate = '%0%1/index.cgi?%2';
info.uri = uriTemplate.format([host,workspace,SocialtextAdaptor.normalizedTitle(tiddler.title)]);
return info;
};
SocialtextAdaptor.prototype.getTiddler = function(title,context,userParams,callback)
{
return this.getTiddlerRevision(title,null,context,userParams,callback);
};
SocialtextAdaptor.prototype.getTiddlerRevision = function(title,revision,context,userParams,callback)
{
context = this.setContext(context,userParams,callback);
// request the page in json format to get the page attributes
if(revision) {
var uriTemplate = '%0data/workspaces/%1/pages/%2/revisions/%3';
context.revision = revision;
} else {
uriTemplate = '%0data/workspaces/%1/pages/%2';
context.revision = null;
}
uri = uriTemplate.format([context.host,context.workspace,SocialtextAdaptor.normalizedTitle(title),revision]);
context.tiddler = new Tiddler(title);
context.tiddler.fields.wikiformat = 'socialtext';
context.tiddler.fields['server.host'] = SocialtextAdaptor.minHostName(context.host);
context.tiddler.fields['server.workspace'] = context.workspace;
var req = SocialtextAdaptor.doHttpGET(uri,SocialtextAdaptor.getTiddlerCallback,context,{'accept':'application/json'});
return typeof req == 'string' ? req : true;
};
SocialtextAdaptor.getTiddlerCallback = function(status,context,responseText,uri,xhr)
{
context.status = false;
context.statusText = SocialtextAdaptor.errorInFunctionMessage.format(['getTiddlerCallback']);
if(status) {
try {
eval('var info=' + responseText);
context.tiddler.tags = info.tags;
context.tiddler.fields['server.page.id'] = info.page_id;
context.tiddler.fields['server.page.name'] = info.name;
context.tiddler.fields['server.page.revision'] = String(info.revision_id);
context.tiddler.modifier = info.last_editor;
context.tiddler.modified = SocialtextAdaptor.dateFromEditTime(info.last_edit_time);
} catch (ex) {
context.statusText = exceptionText(ex,SocialtextAdaptor.serverParsingErrorMessage);
if(context.callback)
context.callback(context,context.userParams);
return;
}
context.status = true;
} else {
context.statusText = xhr.statusText;
if(context.callback)
context.callback(context,context.userParams);
return;
}
var uriTemplate = context.revision ? '%0data/workspaces/%1/pages/%2/revisions/%3' : '%0data/workspaces/%1/pages/%2';
var host = SocialtextAdaptor.fullHostName(context.tiddler.fields['server.host']);
var workspace = context.workspace ? context.workspace : context.tiddler.fields['server.workspace'];
uri = uriTemplate.format([host,workspace,SocialtextAdaptor.normalizedTitle(context.tiddler.title),context.revision]);
var req = SocialtextAdaptor.doHttpGET(uri,SocialtextAdaptor.getTiddlerCallback2,context,{'accept':SocialtextAdaptor.mimeType});
};
SocialtextAdaptor.getTiddlerCallback2 = function(status,context,responseText,uri,xhr)
{
context.tiddler.text = responseText;
if(status) {
context.status = true;
} else {
context.status = false;
context.statusText = xhr.statusText;
}
if(context.callback)
context.callback(context,context.userParams);
};
SocialtextAdaptor.prototype.getTiddlerRevisionList = function(title,limit,context,userParams,callback)
{
context = this.setContext(context,userParams,callback);
var uriTemplate = '%0data/workspaces/%1/pages/%2/revisions?accept=application/json';
if(!limit)
limit = 5;
var uri = uriTemplate.format([context.host,context.workspace,SocialtextAdaptor.normalizedTitle(title),limit]);
var req = SocialtextAdaptor.doHttpGET(uri,SocialtextAdaptor.getTiddlerRevisionListCallback,context);
return typeof req == 'string' ? req : true;
};
SocialtextAdaptor.getTiddlerRevisionListCallback = function(status,context,responseText,uri,xhr)
{
context.status = false;
if(status) {
var content = null;
try {
eval('var info=' + responseText);
} catch (ex) {
context.statusText = exceptionText(ex,SocialtextAdaptor.serverParsingErrorMessage);
if(context.callback)
context.callback(context,context.userParams);
return;
}
list = [];
for(var i=0; i<info.length; i++) {
var tiddler = new Tiddler(info[i].name);
tiddler.modified = SocialtextAdaptor.dateFromEditTime(info[i].last_edit_time);
tiddler.modifier = info[i].last_editor;
tiddler.tags = info[i].tags;
tiddler.fields['server.page.id'] = info[i].page_id;
tiddler.fields['server.page.name'] = info[i].name;
tiddler.fields['server.page.revision'] = info[i].revision_id;
list.push(tiddler);
}
var sortField = 'server.page.revision';
list.sort(function(a,b) {return a.fields[sortField] < b.fields[sortField] ? +1 : (a.fields[sortField] == b.fields[sortField] ? 0 : -1);});
context.revisions = list;
context.status = true;
} else {
context.statusText = xhr.statusText;
}
if(context.callback)
context.callback(context,context.userParams);
};
SocialtextAdaptor.prototype.putTiddler = function(tiddler,context,userParams,callback)
{
context = this.setContext(context,userParams,callback);
context.tiddler = tiddler;
context.title = tiddler.title;
var uriTemplate = '%0data/workspaces/%1/pages/%2';
var host = context.host ? context.host : SocialtextAdaptor.fullHostName(tiddler.fields['server.host']);
var workspace = context.workspace ? context.workspace : tiddler.fields['server.workspace'];
var uri = uriTemplate.format([host,workspace,tiddler.title,tiddler.text]);
//var req = doHttp('POST',uri,tiddler.text,SocialtextAdaptor.mimeType,null,null,SocialtextAdaptor.putTiddlerCallback,context,{"X-Http-Method": "PUT"});
var req = SocialtextAdaptor.doHttpPOST(uri,SocialtextAdaptor.putTiddlerCallback,context,{"X-Http-Method": "PUT"},tiddler.text,SocialtextAdaptor.mimeType);
return typeof req == 'string' ? req : true;
};
SocialtextAdaptor.putTiddlerCallback = function(status,context,responseText,uri,xhr)
{
if(status) {
context.status = true;
} else {
context.status = false;
context.statusText = xhr.statusText;
}
if(context.callback)
context.callback(context,context.userParams);
};
SocialtextAdaptor.prototype.close = function()
{
return true;
};
config.adaptors[SocialtextAdaptor.serverType] = SocialtextAdaptor;
} //# end of 'install only once'
//}}}
/***
SocialtextStyleOverrides
***/
/*{{{*/
.headerShadow {padding: 2em 0em .5em 1em;}
.headerForeground {padding: 2em 0em .5em 1em;}
#st-page-wiki-title {
font-size: 80%;
}
.subtitle {
font-style: italic;
font-size 80%;
}
/* from #st-tags */
.tagged {
border-color: #bbeebb;
background-color: #f4fff4;
}
.tagged .listTitle {
color: #595;
font-weight: bold;
}
.tagged .button {
color: #000;
}
.selected .tagged {
background-color: ColorPalette::TertiaryLight;
border: 1px solid ColorPalette::TertiaryMid;
}
/* from #st-incoming-links */
.tagging {
border-color: #ebb;
background-color: #fff4f4;
}
.tagging .listTitle {
color: #b78;
font-weight: bold;
}
.tagging .button {
color: #999;
}
.selected .tagging {
background-color: ColorPalette::TertiaryLight;
border: 1px solid ColorPalette::TertiaryMid;
}
.tiddler {/* Tiddler body */
border:1px solid #ccc;
margin:0.5em;
background:#fff;
padding:0.5em;
}
.viewer blockquote {border-left: 0px solid}
.tiddlyLinkNonExisting {
font-style: italic;
border-bottom: 1px dashed;
}
.editor input, .editor textarea {
background: #ffd;
border-style: solid;
border-color: #888 #ccc #ccc #888;
border-width: 2px;
}
.tabContents {white-space: nowrap;}
#displayArea {margin: 1em 20em 0em 14em;}
#sidebar {
position: absolute;
right: 3px;
width: 21em;
font-size: .9em;
}
#sidebarOptions .button {
border-color: #eee;
}
#sidebarTabs .tabContents {
width: 20em;
overflow: hidden;
}
.viewer tt {
font-size: 1.2em;
line-height: 1.4em;
}
ul {list-style-type: square;}
ul ul {list-style-type: circle;}
ol {list-style-type: decimal;}
ol ol {list-style-type: decimal;}
ol ol ol {list-style-type: decimal;}
ol ol ol ol {list-style-type: decimal;}
ol ol ol ol ol {list-style-type: decimal;}
ol ol ol ol ol ol {list-style-type: decimal;}
/*}}}*/
/***
SocialtextScreenStyle
http://www.eu.socialtext.net/static/2.0.0.1/css/st/screen.css
***/
/*{{{*/
body {
font-family: Arial, sans-serif;
color: #000;
background: #eee;
margin: 0;
}
/* Wiki Navigation */
.st-wiki-nav {
clear: both;
margin-left: 10px;
margin-right: 10px;
}
.st-wiki-nav-content {
background: url('../../images/st/wiki-nav/solid.gif') repeat-x left bottom;
margin-left: 24px;
margin-right: 24px;
padding-top: 3px;
min-height: 24px;
}
* html .st-wiki-nav-content {
padding-bottom: 3px;
height: 24px;
}
.st-wiki-nav-right {
background: url('../../images/st/wiki-nav/right-round.gif') no-repeat bottom right;
}
.st-wiki-nav-left {
background: url('../../images/st/wiki-nav/left-round.gif') no-repeat bottom left;
}
#st-home {
float: left;
margin-right: 60px;
padding-top: 2px;
}
#st-home-link {
color: white;
text-decoration: none;
font-weight: bold;
font-family: Helvetica, sans-serif;
font-size: 90%;
}
#st-editing-prefix-container {
border-collapse: collapse;
width: 100%;
padding: 0px;
margin: 0px;
margin-bottom: -20px;
}
#st-editing-prefix-container tr td {
margin: 0px;
padding: 0px;
}
#st-editing-title {
color: black;
background-color: white;
text-decoration: none;
font-weight: bold;
font-family: Helvetica, sans-serif;
font-size: 90%;
margin-bottom: 0.4em;
}
#st-wiki-title-invite {
font-size: 50%;
font-family: Helvetica, sans-serif;
}
#st-wiki-title-central-page-link {
font-size: 50%;
font-family: Helvetica, sans-serif;
}
#st-wiki-title-invite a {
color: #00f;
}
#st-wiki-logo {
text-align: center;
clear: both;
}
#st-wiki-logo-image {
}
.st-wiki-nav-actions {
float: right;
color: black;
font-size: 75%;
padding-top: 3px;
}
.st-wiki-nav-actions a {
padding: 2px;
color: white;
text-decoration: none;
font-family: Helvetica, sans-serif;
}
/* Wiki Subnav */
#st-wiki-subnav {
margin-top: 2px;
font-size: 70%;
font-weight: bold;
font-family: Helvetica, sans-serif;
color: #888;
}
#st-wiki-subnav a {
padding: 2px;
color: #008;
text-decoration: none;
}
#st-wiki-subnav-right {
float: right;
margin-right: 6em;
}
#st-wiki-subnav-left {
float: left;
margin-left: 6em;
}
* html #st-wiki-subnav-left {
margin-left: 3em;
}
/* Wiki Navigation Search Bar */
#st-search-form {
margin: 0;
padding: 0;
padding-top: 1px;
}
#st-search-form .button-table {
float: left;
font-size: 79%;
font-weight: bold;
margin-left: 5px;
margin-top: 1px;
}
#st-search-form #st-search-term {
float: left;
font-size: 60%;
}
/* Content Outline */
#st-content-border, #st-edit-border {
position: relative;
clear: both;
margin-left: 3px;
margin-right: 2px;
margin-bottom: 0px;
margin-top: 0px;
border-bottom: 1px solid #eee;
}
#st-content-border-left, #st-edit-border-left {
background: url('../../images/st/page-shadow/left.gif') left top repeat-y;
position: relative;
}
#st-content-border-right, #st-edit-border-right {
background: url('../../images/st/page-shadow/right.gif') right top repeat-y;
position: relative;
}
#st-content-border-top, #st-edit-border-top {
position: relative;
background: url('../../images/st/page-shadow/top.gif') left top repeat-x;
}
#st-content-border-bottom, #st-edit-border-bottom {
background: url('../../images/st/page-shadow/bottom.gif') left bottom repeat-x;
position: relative;
}
#st-content-border-left-top, #st-edit-border-left-top {
background: url('../../images/st/page-shadow/left-top.gif') left top no-repeat;
position: relative;
}
#st-content-border-right-top, #st-edit-border-right-top {
background: url('../../images/st/page-shadow/right-top.gif') right top no-repeat;
position: relative;
}
#st-content-border-left-bottom, #st-edit-border-left-bottom {
background: url('../../images/st/page-shadow/left-bottom.gif') left bottom no-repeat;
position: relative;
}
#st-content-border-right-bottom, #st-edit-border-right-bottom {
background: url('../../images/st/page-shadow/right-bottom.gif') right bottom no-repeat;
padding-top: 5px;
padding-bottom: 9px;
position: relative;
}
* html #st-content-border-right-bottom, * html #st-edit-border-right-bottom {
padding-top: 4px;
padding-left: 7px;
padding-right: 8px;
position: relative;
}
.st-content-width-controller {
width: 100%;
position: relative;
border-collapse: collapse;
}
.st-content-width-controller td {
vertical-align: top;
}
.st-content {
position: relative;
background-color: white;
margin-top: 0px;
margin-left: 7px;
margin-right: 8px;
margin-bottom: -1px;
border-left: 1px dotted #80a9f3;
border-right: 1px dotted #80a9f3;
border: 1px solid #80a9f3;
padding: 6px 12px 12px 12px;
}
* html .st-content {
margin-top: 0px;
margin-left: 0px;
margin-right: 0px;
}
/* This textarea is only for Safari. However, if we use display:none; here Safari ignores the .value operation in JS */
#st-raw-wikitext-textarea {
width:1px;
height:1px;
margin:0;
padding:0;
}
/* Action Buttons */
.button-table, .button-table tr td {
border-collapse: collapse;
margin: 0;
padding: 0;
}
.button-rounded {
background: url('../../images/st/grey-button/left-top-rounded.png') top left no-repeat;
margin: 0;
}
.button-rounded-right-top {
background: url('../../images/st/grey-button/right-top-rounded.png') top right no-repeat;
margin: 0;
}
.button-rounded-left-bottom {
background: url('../../images/st/grey-button/left-bottom-rounded.png') bottom left no-repeat;
margin: 0;
}
.button-rounded-right-bottom {
background: url('../../images/st/grey-button/right-bottom-rounded.png') bottom right no-repeat;
margin: 0;
}
.button-straight {
background: url('../../images/st/grey-button/left-top-straight.png') top left no-repeat;
margin: 0;
}
.button-straight-right-top {
background: url('../../images/st/grey-button/right-top-straight.png') top right no-repeat;
margin: 0;
}
.button-straight-left-bottom {
background: url('../../images/st/grey-button/left-bottom-straight.png') bottom left no-repeat;
margin: 0;
}
.button-straight-right-bottom {
background: url('../../images/st/grey-button/right-bottom-straight.png') bottom right no-repeat;
margin: 0;
}
.button-content {
font-size: 90%;
}
.button-content a {
display: block;
padding: 2px;
padding-left: 10px;
padding-right: 10px;
font-family: Helvetica, Verdana, sans-serif;
font-weight: bold;
text-decoration: none;
color: black;
}
.button-content input.submit {
border: 0px;
padding: 2px;
padding-left: 10px;
padding-right: 10px;
font-family: Helvetica, Verdana, sans-serif;
font-weight: bold;
text-decoration: none;
color: black;
background-color: transparent;
}
/* Personal Homepage */
#st-homepage {
background: white url('../../images/st/homepage/blue-fade.gif') top left no-repeat;
}
#st-homepage-layout {
margin-top: 15px;
clear: both;
width: 100%;
border-collapse: collapse;
}
#st-homepage-layout tr td.st-homepage-layout-cell {
padding: 5px;
vertical-align: top;
}
#st-homepage-layout-dashboard {
width: 50%
}
#st-homepage-layout-notes {
width: 50%;
}
#st-homepage-notes, #st-homepage-dashboard {
text-align: left;
width: 95%;
}
#st-user-greeting, #st-wiki-title {
font-family: Helvetica, Verdana, sans-serif;
font-size: 150%;
}
#st-wiki-title {
margin-left: 5px;
}
#st-user-greeting {
position: relative;
text-align: right;
float: right;
}
#st-group-notes-content, #st-personal-notes-content {
}
.st-homepage-section {
margin-bottom: 15px;
}
#st-homepage-notes .st-homepage-section {
background-color: white;
border: 1px solid #aaa;
padding: 15px;
}
.st-homepage-section-title {
font-size: 110%;
font-family: Helvetica, Verdana, sans-serif;
}
#st-homepage-notes .st-homepage-section-title {
color: #aaa;
text-decoration: underline;
}
.st-homepage-notes-edit-link {
background: url('../../images/st/homepage/edit-icon.gif') no-repeat left top;
display: block;
text-indent: -2000px;
height: 13px;
width: 36px;
text-decoration: none;
padding:0;
}
* html .st-homepage-notes-edit-link {
border:1px solid white;
}
.st-homepage-notes-edit {
font-family: Verdana, sans-serif;
font-size: 65%;
float: right;
}
.st-homepage-notes-content {
font-size: 85%;
margin-top: 10px;
padding-top: 0px;
padding-bottom: 0px;
font-family: Verdana, Helvetica, sans-serif;
}
#st-dyk {
border-color: #cca !important;
background-color: #ffe !important;
}
#st-dyk-title {
color: #e4a020 !important;
text-decoration: none !important;
}
/* Homepage Simple List */
#st-whats-new-title-link {
background: url('../../images/st/homepage/icon-28-pages.gif') no-repeat left top;
}
#st-watchlist-title-link {
background: url('../../images/st/homepage/icon-28-star.gif') no-repeat left top;
}
#st-wikis-title-link {
background: url('../../images/st/homepage/icon-28-group.gif') no-repeat left top;
}
.st-homepage-simplelist-title-link {
display: block;
padding-left: 32px;
min-height: 32px;
}
* html .st-homepage-simplelist-title-link {
height: 32px;
}
.st-homepage-simplelist-title {
}
.st-homepage-simplelist-table {
margin-left: 25px;
border: 1px dashed #ddd;
border-collapse: collapse;
font-family: Verdana, Helvetica, sans-serif;
font-size: 80%;
width: 95%;
}
.st-homepage-simplelist-table td {
padding: 2px;
}
.st-homepage-simplelist-table tr.st-homepage-simplelist-row-odd {
background-color: #f3f7f7;
}
.st-homepage-simplelist-table tr.st-homepage-simplelist-row-even {
background-color: white;
}
.st-homepage-simplelist-table a {
color: #4f55dd;
text-decoration: none;
}
.st-homepage-simplelist-table a:visited {
color: #551a8b;
}
.st-homepage-simplelist-subleft {
font-size: 80%;
margin-left: 1em;
color: #666;
}
.st-homepage-simplelist-right {
width: 20%;
}
.st-homepage-simplelist-subright {
font-size: 80%;
color: #666;
}
.st-homepage-simplelist {
}
.st-homepage-simplelist-header {
min-height: 35px;
}
.st-homepage-simplelist-header .button-table {
float: right;
margin-right: 15px;
font-size: 95%;
}
.st-homepage-simplelist-header .button-table .button-content {
padding: 1px;
}
.st-homepage-whatsnew-author, .st-homepage-whatsnew-date {
color: #555;
}
.st-homepage-whatsnew-attribution {
padding-left: 1em;
font-size: 80%;
color: #aaa;
}
/* Homepage Wikis List */
#st-wikis-title {
}
/* Data and Templates */
.st-jst-template, .st-json {
display: none;
}
/* Page Sidebox Common Styles */
#st-page-boxes-toggle {
position: relative;
float: right;
text-align: right;
font-family: Verdana, Arial, sans-serif;
font-weight: bold;
font-size: 80%;
margin-bottom: 0.7em;
}
#st-page-boxes-toggle-link {
text-decoration: none;
}
#st-page-boxes-underlay {
float: right;
margin-top: -10px;
margin-right: 10px;
background: white;
z-index: 198;
clear: both;
margin-left: 15px;
}
* html #st-page-boxes-underlay {
margin-right: 4px;
}
#st-page-boxes {
background: inherit;
position: absolute;
right: 23px;
z-index: 199;
margin-top: 15px;
margin-left: 20px;
}
#st-page-boxes, #st-page-boxes-underlay {
width: 225px;
/* padding-left: 15px; */ /* Gives the white border effect, cwest dislikes it. */
}
.st-page-box {
border: 1px solid black;
padding: 5px;
font-family: Verdana, Helvetica, sans-serif;
font-size: 80%;
margin-top: 15px;
}
.st-page-box-title {
font-family: Helvetica, Verdana, sans-serif;
font-weight: bold;
margin-bottom: 10px;
}
.st-page-box-listing {
margin: 0;
padding: 0;
}
.st-page-box-listing-entry {
display: block;
}
.st-page-boxes-nobacklinks {
font-family: Verdana, Helvetica, sans-serif;
font-size: 90%;
color: #888;
}
.st-page-box-first {
margin-top: 0px;
}
/* Page Display */
#st-page-content {
clear: left;
margin-top: 6px;
margin-bottom: 0;
padding-bottom: 0;
}
#st-page-content, #st-page-content td {
font-family: Verdana, Helvetica, sans-serif;
font-size: 90%;
}
#st-page-wiki-title {
font-family: Helvetica, Verdana, sans-serif;
font-size: 65%;
font-weight: bold;
color: #aaa;
margin-bottom: 0.2em;
margin-top: 0.1em;
padding-top: 0;
}
#wiki {
margin: 0;
padding: 0;
}
#st-page-title {
}
#st-page-titletext, .st-page-title {
font-family: Helvetica, Verdana, sans-serif;
font-size: 150%;
font-weight: bold;
color: #888;
border-bottom: 1px solid #888;
}
#st-newpage-pagename-edit {
font-family: inherit;
font-size: inherit;
font-weight: inherit;
color: #000;
border: 1px solid black;
padding-left: 0.3em;
background-color: #ffd;
}
#st-page-details {
font-style: italic;
font-size: 75%;
font-family: Georgia, serif;
margin: 6px 10px 0 10px;
}
#st-page-details-feed-icon {
vertical-align: middle;
border: none;
}
#st-page-stats {
float: right;
vertical-align: middle;
}
#st-attribution {
float: left;
margin-bottom: 10px;
}
#st-page-editing-wysiwyg {
background: #ffd;
border-style: solid;
border-color: #888 #ccc #ccc #888;
border-width: 2px;
width: 100%;
}
#st-page-editing-toolbar {
margin-left: -6px;
overflow: hidden;
float: left;
height: 25px;
}
#wikiwyg_wikitext_textarea {
margin-top: 4px;
background: #ffd;
border-style: solid;
border-color: #888 #ccc #ccc #888;
border-width: 2px;
width: 100%;
font-family: monospace;
}
#st-page-maincontent {
}
#st-page-editing, #wikiwyg_wikitext_textarea {
}
#st-page-editing-pagebody-decoy, #st-page-editing-wysiwyg {
display: none;
}
#st-editing-tools-edit {
display: none;
}
#st-mode-wysiwyg-button
{
font-size: 70%;
margin-left: 4em;
}
#st-mode-wikitext-button
{
font-size: 70%;
}
#st-edit-tips
{
font-size: 70%;
}
.wikiwyg_button {
background: #FFFFFF;
border: 1px solid #FFFFFF;
cursor: pointer;
width: 20px;
height: 20px;
vertical-align: bottom;
}
.wikiwyg_button:hover {
border: 1px outset;
}
.wikiwyg_button:active {
border: 1px inset;
}
#wikiwyg_toolbar {
display: none;
}
/* Sidebox Pagetools: Revisions, Watchlist */
#st-side-box-pagetools {
border-collapse: collapse;
}
#st-rewind-norevisions {
font-family: Helvetica, Arial, sans-serif;
font-size: 11px;
color: #777;
text-decoration: none;
}
#st-side-box-pagetools a {
font-family: Helvetica, Arial, sans-serif;
font-size: 11px;
color: #555;
text-decoration: none;
}
/* Page View Tags/Incoming Links Sidebox */
#st-tags {
background: #f4fff4;
border-color: #bbeebb;
color: #999;
}
#st-tags-title {
color: #595;
}
#st-tags-addlink, #st-tags-addbutton {
font-weight: bold;
}
#st-tags-listing {
margin-bottom: 5px;
}
#st-tags-addinput, #st-tags-message, #st-tags-suggestion {
display: none;
}
#st-tags-deletemessage {
font-size: 90%;
color: #555;
display: none;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
#st-tags-suggestion {
margin-top: 2px;
}
.st-tags-level1 {
font-size: 90%;
}
.st-tags-level2 {
font-size: 100%;
}
.st-tags-level3 {
font-size: 110%;
}
.st-tags-level4 {
font-size: 120%;
}
.st-tags-level5 {
font-size: 130%;
}
.st-tags-tagline .st-tags-tagdelete {
text-decoration: none;
color: #ccc;
}
.st-tags-tagline a {
text-decoration: none;
color: #444;
}
#st-tags-field {
width: 95%;
}
#st-incoming-links {
border-color: #ebb;
background-color: #fff4f4;
}
#st-incoming-links-title {
color: #b78;
}
#st-attachments {
border-color: #bbe;
background-color: #f4f4ff;
}
#st-attachments-uploadbutton, #st-attachments-managebutton {
}
#st-attachments-buttons-uploadbutton {
margin: 0px;
padding: 0px;
padding-left: 2px;
}
#st-attachments-buttons-managebutton {
margin: 0px;
padding: 0px;
padding-right: 2px;
}
#st-attachments-buttons td {
padding-right: 3px;
font-size: 99%;
}
#st-attachments-buttons {
border-collapse: collapse;
margin: 0px;
padding: 0px;
margin-top: 5px;
}
#st-attachments-title {
color: #77b;
}
.st-attachments-line {
width:100%;
overflow:hidden;
}
/* Actions Bar */
#st-actions-bar-spacer {
clear:both;
height:0.5em;
overflow:hidden;
}
#st-actions-bar-spacer-clear {
clear:both;
height:1px;
overflow:hidden;
}
#st-actions-bar, #st-editing-tools-bar {
margin-left: 30px !important;
margin-right: 30px !important;
}
/* Footer */
#st-footer {
margin-top: -8px;
margin-bottom: 5px;
clear: both;
}
/* Socialtext Attribution */
#st-socialtext-attribution {
clear: both;
text-align: center;
font-size: 80%;
font-family: Helvetica, sans-serif;
}
#st-socialtext-attribution-link {
text-decoration: none;
}
#st-socialtext-attribution-image {
border: 0;
}
/* Page Actions */
#st-edit-button-border-left-middle, #st-login-to-edit-button-border-left-middle {
background: url('../../images/st/button-blue/left-middle.gif') left top repeat-y;
}
#st-edit-button-border-right-middle, #st-login-to-edit-button-border-right-middle {
background: url('../../images/st/button-blue/right-middle.gif') right top repeat-y;
}
#st-edit-button-border-left-top, #st-login-to-edit-button-border-left-top {
background: url('../../images/st/button-blue/left-top.gif') left top no-repeat;
}
#st-edit-button-border-right-top, #st-login-to-edit-button-border-right-top {
background: url('../../images/st/button-blue/right-top.gif') right top no-repeat;
}
#st-edit-button-border-left-bottom, #st-login-to-edit-button-border-left-bottom {
background: url('../../images/st/button-blue/left-bottom.gif') left bottom no-repeat;
}
#st-edit-button-border-right-bottom, #st-login-to-edit-button-border-right-bottom {
background: url('../../images/st/button-blue/right-bottom.gif') right bottom no-repeat;
}
#st-edit-button-link, #st-login-to-edit-button-link {
}
#st-comment-button-border-left-middle {
background: url('../../images/st/button-purple/left-middle.gif') left top repeat-y;
}
#st-comment-button-border-right-middle {
background: url('../../images/st/button-purple/right-middle.gif') right top repeat-y;
}
#st-comment-button-border-left-top {
background: url('../../images/st/button-purple/left-top.gif') left top no-repeat;
}
#st-comment-button-border-right-top {
background: url('../../images/st/button-purple/right-top.gif') right top no-repeat;
}
#st-comment-button-border-left-bottom {
background: url('../../images/st/button-purple/left-bottom.gif') left bottom no-repeat;
}
#st-comment-button-border-right-bottom {
background: url('../../images/st/button-purple/right-bottom.gif') right bottom no-repeat;
}
#st-comment-button-link {
}
#st-save-button-border-left-middle {
background: url('../../images/st/button-green/left-middle.gif') left top repeat-y;
}
#st-save-button-border-right-middle {
background: url('../../images/st/button-green/right-middle.gif') right top repeat-y;
}
#st-save-button-border-left-top {
background: url('../../images/st/button-green/left-top.gif') left top no-repeat;
}
#st-save-button-border-right-top {
background: url('../../images/st/button-green/right-top.gif') right top no-repeat;
}
#st-save-button-border-left-bottom {
background: url('../../images/st/button-green/left-bottom.gif') left bottom no-repeat;
}
#st-save-button-border-right-bottom {
background: url('../../images/st/button-green/right-bottom.gif') right bottom no-repeat;
}
#st-save-button-link {
}
#st-preview-button-border-left-middle {
background: url('../../images/st/button-gold/left-middle.gif') left top repeat-y;
}
#st-preview-button-border-right-middle {
background: url('../../images/st/button-gold/right-middle.gif') right top repeat-y;
}
#st-preview-button-border-left-top {
background: url('../../images/st/button-gold/left-top.gif') left top no-repeat;
}
#st-preview-button-border-right-top {
background: url('../../images/st/button-gold/right-top.gif') right top no-repeat;
}
#st-preview-button-border-left-bottom {
background: url('../../images/st/button-gold/left-bottom.gif') left bottom no-repeat;
}
#st-preview-button-border-right-bottom {
background: url('../../images/st/button-gold/right-bottom.gif') right bottom no-repeat;
}
#st-preview-button-link {
}
#st-cancel-button-border-left-middle {
background: url('../../images/st/button-crimson/left-middle.gif') left top repeat-y;
}
#st-cancel-button-border-right-middle {
background: url('../../images/st/button-crimson/right-middle.gif') right top repeat-y;
}
#st-cancel-button-border-left-top {
background: url('../../images/st/button-crimson/left-top.gif') left top no-repeat;
}
#st-cancel-button-border-right-top {
background: url('../../images/st/button-crimson/right-top.gif') right top no-repeat;
}
#st-cancel-button-border-left-bottom {
background: url('../../images/st/button-crimson/left-bottom.gif') left bottom no-repeat;
}
#st-cancel-button-border-right-bottom {
background: url('../../images/st/button-crimson/right-bottom.gif') right bottom no-repeat;
}
#st-cancel-button-link {
}
#st-edit-more-button-border-left-middle {
background: url('../../images/st/button-blue/left-middle.gif') left top repeat-y;
}
#st-edit-more-button-border-right-middle {
background: url('../../images/st/button-blue/right-middle.gif') right top repeat-y;
}
#st-edit-more-button-border-left-top {
background: url('../../images/st/button-blue/left-top.gif') left top no-repeat;
}
#st-edit-more-button-border-right-top {
background: url('../../images/st/button-blue/right-top.gif') right top no-repeat;
}
#st-edit-more-button-border-left-bottom {
background: url('../../images/st/button-blue/left-bottom.gif') left bottom no-repeat;
}
#st-edit-more-button-border-right-bottom {
background: url('../../images/st/button-blue/right-bottom.gif') right bottom no-repeat;
}
#st-edit-more-button-link {
}
.st-page-action-button-link {
min-height: 24px;
min-width: 100px;
text-align: center;
font-family: Helvetica, Verdana, sans-serif;
font-size: 90%;
text-decoration: none;
color: #fff;
font-weight: bold;
display: block;
padding-top: 8px;
padding-bottom: 0px;
margin-bottom: -3px;
width: 100%;
margin-left: -2px;
}
* html .st-page-action-button-link {
padding-top: 5px;
padding-bottom: 0px;
height: 24px;
}
.st-page-action-button {
float: left;
margin: 0;
padding: 0;
margin-right: 10px;
min-height: 20px;
border-collapse: collapse;
width: 100px;
}
/* Attach File Interface */
#st-attachments-attachinterface {
font-family: Helvetica, sans-serif;
font-size: 90%;
display: none;
position: fixed;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
z-index: 2000;
background-image: url('../../images/st/popup/bg.png');
}
#st-attachments-manageinterface {
font-family: Helvetica, sans-serif;
font-size: 90%;
display: none;
position: absolute;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
z-index: 2000;
background-image: url('../../images/st/popup/bg.png');
}
* html #st-attachments-attachinterface {
background-image: none;
}
* html #st-attachments-manageinterface {
background-image: none;
}
* html .popup-overlay {
background-image: url('../../images/st/popup/bg.png');
background-color: #000;
opacity: .70;
position: absolute;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
z-index: 2001;
}
#st-attachments-attach-interface {
z-index: 2002;
background-color: #fff;
color: #000;
border: 4px solid #ccc;
padding: 1em;
width: 520px;
margin-left: auto;
margin-right: auto;
margin-top: 10%;
position: absolute;
top: 0px;
}
* html #st-attachments-attach-interface {
}
#st-attachments-attach-formtarget {
width: 0px;
height: 0px;
border: 0;
padding: 0;
margin: 0;
}
#st-attachments-attach-message {
font-size: 90%;
font-family: Verdana, Arial, Helvetica, Sans-Serif;
}
#st-attachments-attach-title {
font-weight: bold;
font-size: 120%;
}
#st-attachments-attach-close {
float: right;
margin-top: 6px;
}
#st-attachments-attach-uploadbutton {
float: right;
margin-right: 6px;
margin-top: 6px;
padding-bottom: 0;
}
#st-attachments-attach-fileprompt {
margin: 0.2em 0 0.4em 0;
padding-bottom: 0px;
}
#st-attachments-attach-submit {
font-size: 90%;
font-weight: bold;
}
#st-attachments-attach-filename {
font-size: 90%;
}
#st-attachments-attach-uploadmessage {
font-weight: bold;
margin-bottom: 1em;
display: none;
}
#st-attachments-attach-error {
font-weight: bold;
color: #f00;
margin-bottom: 1em;
display: none;
}
#st-attachments-attach-list {
display: none;
color: #666;
font-size: 90%;
margin-top: 1em;
margin-bottom: 1em;
border-top: 1px solid #4949BA;
border-bottom: 1px solid #4949BA;
background-color: #F5F5F5;
padding: 3px;
}
.st-attachments-attach-listlabel {
font-size: 90%;
color: #4949BA;
}
/* Queue File Dialog */
#st-attachmentsqueue-interface {
font-family: Helvetica, sans-serif;
font-size: 90%;
display: none;
position: fixed;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
background-image: url('../../images/st/popup/bg.png'); /* Don't forget IE hack for ship! */
z-index: 2000;
}
* html #st-attachmentsqueue-interface {
background-image: none;
}
#st-attachmentsqueue-dialog {
z-index: 2002;
background-color: #fff;
color: #000;
border: 4px solid #ccc;
padding: 1em;
width: 530px;
margin-left: auto;
margin-right: auto;
margin-top: 10%;
position: absolute;
top: 0px;
}
* html #st-attachmentsqueue-dialog {
}
#st-attachmentsqueue-fileprompt {
margin-bottom: 0.4em;
margin-top: 0;
padding-bottom: 0;
}
#st-attachmentsqueue-title {
font-weight: bold;
font-size: 120%;
}
#st-attachmentsqueue-close {
float: right;
margin-top: 6px;
}
#st-attachmentsqueue-uploadbutton {
float: right;
margin-right: 6px;
margin-top: 6px;
padding-bottom: 0;
}
#st-attachmentsqueue-submit {
font-size: 90%;
}
#st-attachmentsqueue-filename {
font-size: 90%;
}
#st-attachmentsqueue-message {
font-size: 90%;
font-family: Verdana, Arial, Helvetica, Sans-Serif;
}
#st-attachmentsqueue-uploadmessage {
font-weight: bold;
margin-bottom: 1em;
display: none;
}
#st-attachmentsqueue-error {
font-weight: bold;
color: #f00;
margin-bottom: 1em;
display: none;
}
#st-attachmentsqueue-list {
display: none;
color: #666;
font-size: 90%;
margin-top: 1em;
margin-bottom: 1em;
border-top: 1px solid #4949BA;
border-bottom: 1px solid #4949BA;
background-color: #F5F5F5;
padding: 3px;
}
.st-attachmentsqueue-listlabel {
font-size: 90%;
color: #4949BA;
}
/* Lists */
tr.st-trbg-even, tr.st-trbg-even td{
background-color: #f3f7f7;
}
tr.w-st-even-row, tr.w-st-even-row td {
background-color: #f3f7f7;
}
.query-results-header-title, .query-results-header-last-edit-by {
text-align: left;
}
.query-results-row-revisions {
text-align: right;
}
.query-results-content {
font-size: 85%;
border-collapse: collapse;
border: 1px dashed #ddd;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
}
.query-results-row {
border-collapse: collapse;
border: 1px dashed #ddd;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
}
.query-results-row a {
text-decoration: underline;
color: #00f;
}
.query-results-row td {
font-family: Verdana;
padding: 0.3em;
border-left: 1px dashed #ddd;
border-right: 1px dashed #ddd;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.query-results-header-row {
border-collapse: collapse;
border: 1px dashed #ddd;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
}
.query-results-header-row a {
text-decoration: underline;
color: #00f;
}
.query-results-header-row th {
font-family: Helvetica;
padding: 0.3em;
border-left: 1px dashed #ddd;
border-right: 1px dashed #ddd;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
div.st-actionbutton {
float: left;
}
div#deleteme-st-actions-bar {
clear: both;
margin: 0.8em 20px 0.2em auto;
padding: 0;
}
/* Manage File Interface */
#st-attachments-manage-interface {
z-index: 2002;
background-color: #fff;
color: #000;
border: 4px solid #ccc;
padding: 1em;
width: 520px;
margin-left: auto;
margin-right: auto;
margin-top: 10%;
position: absolute;
top: 0px;
}
#st-attachments-manage-filetable {
height: 150px;
margin: 0;
padding: 0;
width: 100%;
overflow: auto;
border: 1px solid #ccc;
}
#st-attachments-manage-filelisting tbody td {
font-size: 90%;
}
#st-attachments-manage-filelisting {
width: 100%;
border-collapse: collapse;
border: 0;
margin: 0;
padding: 0;
}
#st-attachments-manage-fileheader {
background: #ccc;
font-weight: bold;
border-bottom: 1px black solid;
}
#st-attachments-manage-close {
float: right;
margin-top: 3px;
margin-right: -2px;
font-weight: bold;
}
#st-attachments-manage-delete {
margin-top: 3px;
float: left;
font-weight: bold;
}
.st-attachments-manage-filerow {
border-bottom: 1px solid #ccc;
}
.row-odd {
background-color: #eee;
}
.row-even {
background-color: #fff;
}
.row-on {
background-color: #009 !important;
color: white !important;
}
.row-on a {
color: #fff !important;
}
#st-attachments-manage-deletemessage {
color: red;
}
/* Page tools icons */
#st-pagetools-print {
background: url('../../images/st/pagetools/print.gif')
left center no-repeat;
}
#st-pagetools-email {
background: url('../../images/st/pagetools/email.gif')
left center no-repeat;
}
#st-pagetools-tools {
background: url('../../images/st/pagetools/tools.gif')
left center no-repeat;
}
/*
#st-pagetools-watch {
background: url('../../images/st/pagetools/watch-blue.gif')
left center no-repeat;
}
*/
/* *********** Settings *********** */
#st-settings-pane {
}
* html #settings-pane { font-size: 85%;}
.settings-start-table {
}
* html .settings-start-table { font-size: 90%;}
#st-settings-select {
padding: 0px 10px 10px 10px;
vertical-align: top;
width: 1px;
background-color: #eff1ec;
border: none;
}
#st-settings-section {
padding: 0px 10px 10px 10px;
vertical-align: top;
}
.settings-top-header {
margin-top: 1em;
font-weight: bold;
width: 15em;
}
.settings-header {
margin-top: 1em;
font-weight: bold;
}
.settings-selections {
padding: 0px 0px 0px 20px;
line-height: 1.5em;
}
.settings-selections a:visited, .settings-selections a:active {
color: #0000ff;
}
.settings-link {
clear: both;
display: block;
}
.settings-section-left {
text-align: right;
}
.settings-label {
font-weight: bold;
}
.settings-help {
color: #888;
}
.settings-comment {
}
.users-invite-message {
padding: 0.5em 0.5em 0.5em 2em;
background-color: #eee;
/* This seems necessary to fix an IE bug that sometimes
causes the text in this div to be invisible */
z-index: 1000;
}
.workspace-entry-header {
margin-top: .5em;
font-weight: bold;
}
.workspace-entry {
margin-left: 3em;
}
.workspace-entry-p {
margin-top: .5em;
margin-bottom: .75em;
}
.workspace-subentry {
font-style: italic;
font-weight: bold;
margin-left: 1.5em;
}
.preferences-td {
padding:.5em 0 1.5em 0;
}
.preferences-query {
text-align: left;
}
.preference-radio {
background-color: #cec;
}
.user-settings-listall-headings td {
background-color: #eff3ef;
}
#st-settings-save {
padding-bottom: 0.5em;
}
.standard-button-cancel {
font-weight: bold;
background-color: #71004b;
border-left: 1px solid #aaa;
border-top: 1px solid #aaa;
border-bottom: 2px solid #333;
border-right: 2px solid #333;
color: #f4f3b9;
width: 8em;
}
.standard-button-submit {
font-weight: bold;
background-color: #656084;
border-left: 1px solid #aaa;
border-top: 1px solid #aaa;
border-bottom: 2px solid #333;
border-right: 2px solid #333;
color: #f4f3b9;
width: 8em;
}
#st-settings {
font-family: Verdana, Arial, Helvetica, Sans-Serif;
font-size: 90%;
}
/* Listview Tabs */
#st-listview a:visited {
color: #551a8b;
}
#st-listview-tabs ul {
display: block;
list-style: none outside;
margin: 0 0 0 4em;
padding: 0;
font-family: Helvetica, Arial, Sans-serif;
font-size: 80%;
}
#st-listview-tabs li {
display: block;
float: left;
margin: 0 0.8em 0 0;
padding: 3px 0.6em 0 0.6em;
border: 1px solid #d8d8d8;
border-bottom: 1px solid rgb(128, 169, 243);
background-color: #f4f4f4;
position: relative;
bottom: -2px;
}
#st-listview-tabs li.spacer {
margin: 0 0.8em 0 2em;
}
#st-listview-tabs a {
color: #bbb;
text-decoration: none;
}
#st-listview-tabs li.selected {
background-color: #fff !important;
border: 1px solid rgb(128, 169, 243) !important;
border-bottom: 1px solid #fff !important;
font-weight: bold !important;
}
#st-listview-tabs li.selected a {
color: #000 !important;
}
/* Category List Display */
#st-category-display-links {
margin-bottom: 1em;
font-size: 90%;
}
#st-tag-listbody {
font-family: Helvetica, Verdana, sans-serif;
}
/* Attachments List Display */
#st-attachments-list-body table.button-table {
margin-top: 0.1em;
font-size: 80%;
}
/* ********** PageTools Menu ************** */
div#st-editing-tools {
float: left;
}
div#st-pagetools {
z-index: 300;
font-family: Helvetica, Verdana, sans-serif;
font-size: 10px;
float: right;
margin: 18px 0 0 0em;
color: #000;
vertical-align: bottom;
position: relative;
}
#st-pagetools a {
text-decoration: none;
color: black;
padding-left: 17px;
}
#st-pagetools span {
color: inherit;
padding-left: 17px;
vertical-align: top;
}
#st-pagetools span.st-watchlist-link {
color: inherit;
vertical-align: top;
}
.st-watchlist-link {
cursor: pointer;
}
div#st-pagetools ul.level2 {
z-index: 300;
margin: 0;
padding: 0;
background: white;
border: 1px solid #CCC;
border-width: 0 1px;
}
div#st-pagetools li {
position: relative;
list-style: none;
margin: 0;
float: left;
width: 7em;
line-height: 11px;
}
div#st-pagetools ul ul li:hover {
background: #BFE2FF;
}
div#st-pagetools li a {
display: block;
text-decoration: none;
}
div#st-pagetools>ul a {
width: auto;
}
div#st-pagetools ul ul {
position: absolute;
width: auto;
display: none;
}
div#st-pagetools ul ul li {
line-height: 1.5em;
/* width: 100%; */
width: 14em;
}
.first {
border-top: 1px solid #CCC;
}
.separator {
border-bottom: 1px solid #CCC;
}
div#st-pagetools ul ul li a {
border-bottom: 1px solid #CCC;
padding-left: 15px;
padding-right: 3px;
margin-right: 3px;
border: 0px;
}
div#st-pagetools li.submenu li.submenu:hover {
z-index: 300;
background-color: #BFE2FF;
}
div#st-pagetools ul.level1 li.submenu:hover ul.level2 {
display:block;
}
div#st-pagetools ul.level2 {
top: 1.0em;
left: -9.5em;
}
/*
=head2 Revision List Display
Change these styles to update the page revision list.
*/
#st-revision-list-table {
border-collapse: collapse;
font-size: 85%;
color: #000;
}
.st-page-title-decorator {
color: #C80000;
}
.st-revision-header-emphasis {
color: #C80000;
}
.st-revision-list-compare-button-row {
}
.st-revision-list-compare-button-cell {
padding-top: 0.3em;
text-align: center;
}
.st-revision-list-compare-button {
}
#st-revision-list-header-row {
}
#st-revision-list-header-select {
padding: 6px 2px 2px 2px;
text-align: center;
}
#st-revision-list-header-revision {
padding: 6px 2px 2px 2px;
text-align: left;
}
#st-revision-list-header-edited-by {
padding: 6px 2px 2px 2px;
text-align: center;
}
#st-revision-list-header-date {
padding: 6px 2px 2px 2px;
text-align: center;
}
.st-revision-list-row {
border-collapse: collapse;
border: 1px dashed #ddd;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
}
.st-revision-list-row td {
font-family: Verdana;
padding: 0.3em;
border-left: 1px dashed #ddd;
border-right: 1px dashed #ddd;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.st-revision-list-row-select {
padding: 3px 0 2px 0;
text-align: center;
}
.st-revision-list-row-select-old {
}
.st-revision-list-row-select-new {
}
.st-revision-list-row-revision {
}
.st-revision-list-row-revision-link {
}
.st-revision-list-row-edited-by {
}
.st-revision-list-row-date {
}
/* Revision Menu */
#st-pagetools.st-revision-view-bar {
float: left;
}
ul.st-revision-menu {
list-style: none;
margin: 0;
padding: 0.2em;
font-size: 80%;
}
ul.st-revision-menu li {
float: left;
padding: 0 0.4em 0 0.4em;
border-right: thin solid #000000;
}
ul.st-revision-menu li.st-last {
border-right: none;
}
#st-restore-revision-button {
font-size: 80%;
}
/*
=head2 Revision Compare Display
When comparing two revisions of a page, these styles apply.
*/
#st-revision-compare-table {
background-color: #f0f0f0;
}
#st-revision-compare-table td {
background-color: white;
}
.st-revision-compare-old {
background-color: #fdd;
text-decoration: line-through;
}
.st-revision-compare-new {
background-color: #dfd;
font-weight: bold;
}
/* Weblog View */
#st-weblog {
padding: 0;
}
#st-content-weblog-display-width-controller {
}
#st-content-weblog-display-width-controller-nav {
width: 230px;
margin-left: 15px;
border-left: 5px solid #ddd;
margin-top: -1px;
}
#st-weblog-content {
font-family: Verdana, Helvetica, sans-serif;
margin-top: -1px;
margin-bottom: -1px;
border-top: 1px solid #80a9f3;
border-bottom: 1px solid #80a9f3;
}
#st-weblog-title {
font-family: 'Trebuchet MS', Verdana, Helvetica, sans-serif;
font-family: 'Times New Roman', serif;
background-color: #80a9f3;
color: #fff;
font-size: 150%;
font-weight: bold;
padding: 0.2em;
padding-left: 1em;
}
#st-weblog-wikititle {
font-family: Helvetica, Verdana, sans-serif;
font-style: italic;
font-size: 40%;
color: #fff;
margin-bottom: 0.2em;
margin-top: 0.1em;
padding-top: 0;
}
#st-weblog-titletext {
font-family: Helvetica, Verdana, sans-serif;
font-weight: bold;
color: #fff;
}
div.st-weblog-entry {
margin-top: 0.2em;
margin-bottom: 4.8em;
padding: 0 1.5em 0 1.5em;
}
.st-page-title {
clear: both;
}
div.st-weblog-entrytitle span.text {
font-family: Helvetica, Verdana, sans-serif;
font-size: 150%;
font-weight: bold;
color: #000;
}
.st-weblog-entrycontent {
font-family: Verdana, Helvetica, sans-serif;
font-size: 90%;
border-bottom: 1px solid #888;
}
.st-weblog-byline {
float: left;
text-align: left;
font-style: italic;
font-size: 70%;
font-family: Verdana, Helvetica, sans-serif;
}
.st-weblog-post-links {
float: right;
text-align: right;
font-size: 70%;
font-family: Verdana, Helvetica, sans-serif;
}
#st-weblog-archives, #st-weblog-navigation {
position: relative;
float: right;
width: 230px;
}
#st-weblog-archives {
margin-top: 15px;
clear: right;
}
#st-weblog-archives-title, #st-weblog-navigation-title {
margin-left: 15px;
font-family: Helvetica, sans-serif;
font-size: 95%;
font-weight: bold;
color: #999;
border-bottom: 2px solid #f99;
padding-bottom: 5px;
padding-top: 5px;
margin-bottom: 5px;
}
#st-weblog-navigation-content {
margin-left: 15px;
font-size: 80%;
}
#st-weblog-archives ul {
margin: 0;
padding: 0;
}
#st-weblog-archives ul li {
/* list-type: none; */
display: block;
font-size: 80%;
font-family: Helvetica, sans-serif;
padding-left: 15px;
}
#st-weblog-newpost {
padding: 0.5em 0.7em 0.3em 0.3em;
}
#st-weblog-newpost-button {
}
#st-weblog-actionbar-chooseweblog {
float: right;
}
#st-weblog-postbyemail {
font-size: 70%;
font-family: Verdana, Helvetica, sans-serif;
color: #def;
padding-top: 0.4em;
}
#st-weblog-postbyemail-link {
color: #00c;
}
.st-weblog-chooseprompt {
font-size: 90%;
font-family: Verdana, Helvetica, sans-serif;
padding-right: 0.2em;
color: #000;
}
.st-spacer {
padding-right: 0.1em;
padding-left: 0.1em;
}
.st-weblog-preventries {
padding-bottom: 20px;
clear: both;
}
.st-weblog-nextentries {
clear: both;
}
div.st-weblog-entrynav {
margin-top: 0.2em;
margin-bottom: 1.8em;
padding: 0;
}
span.st-weblog-previousentries, span.st-weblog-nextentries {
font-size: 90%;
font-family: Verdana, Helvetica, sans-serif;
padding-left: 1em;
}
/* ******* Page Stats ******** */
#st-usagereport-navbar {
font-size: 80%;
padding: 0;
margin: 0;
}
#st-usagereport-date {
font-weight: bold;
margin-top: 1em;
}
#st-page-usagereport h1 {
font-size: 1.3em;
font-weight: bold;
margin-top: 1.2em;
margin-bottom: 0.3em;
}
#st-page-usagereport h2 {
font-size: 1.1em;
font-weight: bold;
margin-top: 0.8em;
margin-bottom: 0.3em;
}
/* New Page */
#st-newpage-save, #st-newpage-duplicate {
display: none;
position: fixed;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
background: url('../../images/st/popup/bg.png'); /* Don't forget IE hack for ship! */
z-index: 2000;
}
#st-newpage-save-interface {
background-color: #fff;
color: #000;
border: 4px solid #ccc;
padding: 0.5em;
width: 450px;
margin-left: auto;
margin-right: auto;
margin-top: 10%;
position:absolute;
top:0px;
z-index:2003;
}
#st-newpage-duplicate-interface {
background-color: #fff;
color: #000;
border: 4px solid #ccc;
padding: 0.5em;
width: 530px;
margin-left: auto;
margin-right: auto;
margin-top: 10%;
position:absolute;
top:0px;
z-index:2003;
}
#st-newpage-save-title, #st-newpage-duplicate-title {
margin: 0;
padding: 0;
font-weight: bold;
font-family: Helvetica, sans-serif;
font-size: 100%;
}
#st-newpage-save-prompt, #st-newpage-duplicate-prompt {
font-family: Helvetica, sans-serif;
font-size: 90%;
margin-bottom: 0.4em;
}
#st-newpage-save-buttons, #st-newpage-duplicate-buttons {
margin-top: 0.8em;
text-align: right;
}
.st-newpage-duplicate-option {
font-family: Helvetica, sans-serif;
font-size: 90%;
margin: 0;
padding: 0;
}
#st-newpage-duplicate-pagename {
font-size: 90%;
}
.st-newpage-duplicate-emphasis {
background-color: #FFFF00;
font-weight: bold;
}
#st-newpage-save-field-pagename {
margin-bottom: 0;
margin-top: 0.2em;
padding-bottom: 0;
font-size: 90%;
}
#st-newpage-save-tip {
margin-bottom: 0;
margin-top: 1.2em;
padding-bottom: 0;
font-size: 75%;
color: #888;
}
/* Wikitext Styling */
.wiki {
}
.wiki hr {
margin-top: .4em;
margin-bottom: .4em;
}
.wiki .short-rule {
width: 25%;
}
.wiki .medium-rule {
width: 50%
}
.wiki ul,
.wiki ol,
.wiki blockquote {
margin-left: 2em;
padding-left: 0em;
}
.wiki table {
border-collapse: collapse;
}
.wiki td {
border: 1px;
border-style: solid;
padding: .2em;
vertical-align: top;
}
.wiki h1,
.wiki h2,
.wiki h3,
.wiki h4,
.wiki h5,
.wiki h6 {
font-weight: bold;
font-style: normal;
margin-top: 0.1em;
margin-bottom: 8px;
}
.wiki h1 {font-size: 200%;}
.wiki h2 {font-size: 170%;}
.wiki h3 {font-size: 145%;}
.wiki h4 {font-size: 125%;}
.wiki h5 {font-size: 110%;}
.wiki h6 {font-size: 100%;}
.wiki pre {
background-color: #eee; /* XXX */
margin-left: 1em;
margin-right: 1em;
padding: .2em;
}
.wiki .incipient {
text-decoration: none;
border-bottom: 1px dashed;
}
.wiki-include-title {
background-color: #ccccff;
}
.wiki .wiki {
position: relative;
background-color: #ddddff;
border: 1px solid #ccccff;
padding: 3px;
}
.wafl_existence_error {
color: rgb(200,0,0);
border-bottom: 0.2em dashed rgb(200,0,0);
}
#st-edit-mode-container {
}
#st-edit-mode-view {
}
#st-page-editing-uploadbutton {
z-index: 1500;
float: left;
}
/* Comment UI */
body#st-commentui {
background: #ffffff;
}
#st-commentui-container {
}
#st-commentui-container a:visited,
#st-commentui-container a:active {
color: #00f;
}
#st-commentui-notetop {
}
#st-commentui-controls {
}
#st-commentui-savelink {
background-color: #fffebd;
}
#st-commentui-cancellink {
}
#st-commentui-customfield {
}
#st-commentui-customfield .customfield-label {
}
#st-commentui-customfield .customfield-input {
}
#st-commentui-textarea {
padding: 0;
border-style: inset;
border-width: thin;
background-color: #ffd;
color: black;
width: 99%;
height: 150px;
}
/*
=head2 Send Page by Email
Styles for the 'Send Page by Email' popup, accessed from the 'Email' dropdown
menu on the page bar.
*/
#email-page {
background: #ffffff;
font-size: 80%;
}
.email-page-row {
clear: both;
}
.email-page-row-label {
font-weight: bold;
float: left;
width: 5em;
margin-left: 1.2em;
margin-right: 1.2em;
text-align: right;
}
.email-page-row-content {
float: left;
padding-bottom: 1.2em;
}
.email-page-user-select-column {
float: left;
padding-right: 1.2em;
width: 14em;
}
#email-page-user-select-column-center {
width: 10em;
}
.email-page-user-select-label {
text-align: center;
}
#email-page-user-select-add-label {
padding-top: 1em;
}
.email-page-user-select-button-group {
padding-bottom: 2em;
}
.email-page-input {
width: 120px;
clear: both;
display: block;
}
.email-page-select {
width: 175px;
font-size: x-small;
}
#email-page-error-message {
text-align: center;
}
#email-page-buttons-container {
clear: both;
}
#email-page-buttons {
text-align: center;
}
.email-page-input-new {
width: 175px;
}
/* System Status, Red with icon */
#st-system-status-alert {
clear: both;
width: 50%;
margin-left: 25%;
margin-top: 10px;
padding: 5px;
color: #c00;
font-weight: bold;
font-size: 80%;
background: transparent url('../../images/st/system-message/important-note.gif') no-repeat 5px center;
padding-left: 60px;
min-height: 38px;
}
* html #st-system-status-alert {
height: 38px;
}
/* System Status, Green */
#st-system-status {
clear: both;
text-align:center;
width: 80%;
margin-left: 10%;
padding: 8px 0 3px 0;
color: #0a0;
font-family: Arial, Helvetica, sans-serif;
font-size: 80%;
}
.socialtextLogo {
text-align: center;
}
/*}}}*/
/***
|''Name:''|SparklinePlugin|
|''Description:''|Sparklines macro|
***/
//{{{
if(!version.extensions.SparklinePlugin) {
version.extensions.SparklinePlugin = {installed:true};
//--
//-- Sparklines
//--
config.macros.sparkline = {};
config.macros.sparkline.handler = function(place,macroName,params)
{
var data = [];
var min = 0;
var max = 0;
var v;
for(var t=0; t<params.length; t++) {
v = parseInt(params[t]);
if(v < min)
min = v;
if(v > max)
max = v;
data.push(v);
}
if(data.length < 1)
return;
var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
box.title = data.join(",");
var w = box.offsetWidth;
var h = box.offsetHeight;
box.style.paddingRight = (data.length * 2 - w) + "px";
box.style.position = "relative";
for(var d=0; d<data.length; d++) {
var tick = document.createElement("img");
tick.border = 0;
tick.className = "sparktick";
tick.style.position = "absolute";
tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
tick.style.left = d*2 + "px";
tick.style.width = "2px";
v = Math.floor(((data[d] - min)/(max-min)) * h);
tick.style.top = (h-v) + "px";
tick.style.height = v + "px";
box.appendChild(tick);
}
};
}
//}}}
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};
//--
//-- Crypto functions and associated conversion routines
//--
// Crypto "namespace"
function Crypto() {}
// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
var be = Array();
var len = Math.floor(str.length/4);
var i, j;
for(i=0, j=0; i<len; i++, j+=4) {
be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
}
while (j<str.length) {
be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
j++;
}
return be;
};
// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
var str = "";
for(var i=0;i<be.length*32;i+=8)
str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
return str;
};
// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
var hex = "0123456789ABCDEF";
var str = "";
for(var i=0;i<be.length*4;i++)
str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
return str;
};
// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
return Crypto.be32sToHex(Crypto.sha1Str(str));
};
// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};
// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
// Add 32-bit integers, wrapping at 32 bits
add32 = function(a,b)
{
var lsw = (a&0xFFFF)+(b&0xFFFF);
var msw = (a>>16)+(b>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Add five 32-bit integers, wrapping at 32 bits
add32x5 = function(a,b,c,d,e)
{
var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Bitwise rotate left a 32-bit integer by 1 bit
rol32 = function(n)
{
return (n>>>31)|(n<<1);
};
var len = blen*8;
// Append padding so length in bits is 448 mod 512
x[len>>5] |= 0x80 << (24-len%32);
// Append length
x[((len+64>>9)<<4)+15] = len;
var w = Array(80);
var k1 = 0x5A827999;
var k2 = 0x6ED9EBA1;
var k3 = 0x8F1BBCDC;
var k4 = 0xCA62C1D6;
var h0 = 0x67452301;
var h1 = 0xEFCDAB89;
var h2 = 0x98BADCFE;
var h3 = 0x10325476;
var h4 = 0xC3D2E1F0;
for(var i=0;i<x.length;i+=16) {
var j,t;
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
for(j = 0;j<16;j++) {
w[j] = x[i+j];
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=16;j<20;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=20;j<40;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=40;j<60;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=60;j<80;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
h0 = add32(h0,a);
h1 = add32(h1,b);
h2 = add32(h2,c);
h3 = add32(h3,d);
h4 = add32(h4,e);
}
return Array(h0,h1,h2,h3,h4);
};
}
//}}}
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};
//--
//-- Deprecated code
//--
// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};
// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = function(w)
{
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var text = lookaheadMatch[1];
if(config.browser.isIE)
text = text.replace(/\n/g,"\r");
createTiddlyElement(w.output,"pre",null,null,text);
w.nextMatch = lookaheadRegExp.lastIndex;
}
};
// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
createTiddlyElement(place,"br");
};
// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
var i = this.indexOf(item);
return i == -1 ? null : i;
};
// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
return store.getLoader().internalizeTiddler(store,this,title,divRef);
};
// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
return store.getSaver().externalizeTiddler(store,this);
};
// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
return store.allTiddlersAsHtml();
}
// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
refreshPageTemplate(title);
}
// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
story.displayTiddlers(srcElement,titles,template,animate);
}
// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
story.displayTiddler(srcElement,title,template,animate);
}
// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;
// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");
}
//}}}
This is the home page for Dobrica Pavlinušić's random unstructured stuff.
Welcome to my new unsorted stuff site. If you are here to "learn about rot13"<http://en.wikipedia.org/wiki/ROT13> this might not be the right place.
If you are, however looking latest and/or unsorted snippets which didn't made to "my homepage"<http://www.rot13.org/~dpavlin/> or "blog"<http://blog.rot13.org/> you might be on right place.
| {search: category: projects} | {search: category: howto} | {recent_changes: rot13} |
{fetchrss: http://blog.rot13.org/index.xml}
http://git.rot13.org/?p=air-quality;a=blob;f=pms3003.pl;hb=HEAD
{file: PMS3003 series data manual_English_V2.5.pdf}
http://www.plantower.com/en/content/?107.html
http://aqicn.org/sensor/pms3003/
https://github.com/avaldebe/AQmon/blob/master/Documents/PMS3003_LOGOELE.pdf (different manufacturer)
http://download.kamami.pl/p563980-PMS3003%20series%20data%20manual_English_V2.5.pdf
{toc: }
^ spec
Parameters :Index (Unit )
Measuring range: 0.3-1.0um ; 1.0-2.5um ; 2.5-10um
Measurement units: ug/m3
3 Measurement accuracy: ug/m3
4 Response time: <10s
5 Work current: 5V200ma@ Work State 5V2ma@ Standby Fitness
Counting efficiency :50%@0.3um 98% @> = 0.5 um
Response time :≤ 10 sec
DC supply voltage :5 V
Operating current :120 mA
Standby Current :≤ 200 µA
Data interface level :L <0.8 @ 3.3 H> 2.7@3.3 V
Operating temperature range :-20 ~ + 50 °C
Operating humidity range :0 to 99%
MTBF :≥ 3 Year
Size :65 × 42 × 23 mm
^ pinout
PIN1 :VCC :Power Supply (5V).
PIN2 :GND :Ground.
PIN3 :SET :Standby mode (when 0), operating mode (when 1) TTL 3V3
PIN4 :RXD :Serial receive / TTL level @ 3.3V.
PIN5 :TXD :Serial transmit / TTL level @ 3.3V.
PIN6 :RESET :Module reset / TTL level @ 3.3V.
PIN7,8 :NC :Not connected.
^ serial
9600
starts with 0x42 0x4d
Byte buffer index Description
1 – Constant value (0x42)
2 0 Constant value (0x4d)
3 1 Frame length
4 2
5 3 PM1.0 concentration unit (μg/m3)
6 4
7 5 PM2.5 concentration unit (μg/m3)
8 6
9 7 PM10 concentration unit (μg/m3)
10 8
11 9 PM1.0 concentration unit under atmospheric environment (μg/m3)
12 10
13 11 PM2.5 concentration unit under atmospheric environment (μg/m3)
14 12
15 13 PM10 concentration unit under atmospheric environment (μg/m3)
16 14
17 15 reserved
18 16
19 17 reserved
20 18
21 19 reserved
22 20
23 21 Control sum
24 22
^ code
^^ Arduino
doesn't check checksum: https://github.com/suda/PMS3003/blob/master/src/PMS3003.cpp
much better library: https://github.com/fu-hsi/pms
^^ Node MCU
https://github.com/avaldebe/AQmon/blob/master/lua_modules/pms3003.lua
{toc}
^ LCsoft module
{image: lcsoft.jpg}
* http://www.lctech-inc.com/Hardware/Detail.aspx?id=588fbc2e-ecc1-4013-ac35-69bc83bda1fb
^^ pinout
| CLKOUT | INT |
| WOL | SO |
| SI | SCK |
| CS | RESET |
| VCC | GND |
* https://github.com/renatoaloi/EtherEncLib
| | CLKOUT | INT | |
| | WOL | SO | D12 |
| D11 | SI | SCK | D13 |
| D10 | CS | RESET | |
| 5V | VCC | GND | GND |
Home-made software md RAID 5 array from SATA drives:
{fetchrss: http://api.flickr.com/services/feeds/photoset.gne?set=72157603375109805&nsid=46217738@N00&lang=en-us full}
Note nice usage of construction metal stripes with holes which is usually used to hold fence. It has holes just the right size for screws to go through and hold disks nicely spaced (although a little bit more space would be ideal). It's soft enough to be bent at corners to produce nice and leveled space between it and case.
Blog post "RAID5 for home"<http://blog.rot13.org/2007/11/raid5_for_home.html> describes setup in some details.
^ dmesg
.pre
[ 894.003473] usb 1-3.1: new full-speed USB device number 5 using xhci_hcd
[ 894.022883] usb 1-3.1: New USB device found, idVendor=03eb, idProduct=2144
[ 894.022888] usb 1-3.1: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[ 894.022891] usb 1-3.1: Product: Mojo V2
[ 894.022893] usb 1-3.1: Manufacturer: Emb Micro
[ 894.022896] usb 1-3.1: SerialNumber: 84134353230351B0D1B0
[ 894.023034] usb 1-3.1: ep 0x82 - rounding interval to 1024 microframes, ep desc says 2040 microframes
[ 894.039841] cdc_acm 1-3.1:1.0: ttyACM0: USB ACM device
[ 894.040196] usbcore: registered new interface driver cdc_acm
[ 894.040200] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
.pre
^ mojo-loader
http://embeddedmicro.com/tutorials/the-mojo/installing-mojo-loader
remove RXTXcomm from distribution and use one from packages
.pre
dpavlin@blue:/blue-zfs/FPGA/Mojo/mojo-loader-1.1.2/lib$ rm RXTXcomm.jar
dpavlin@blue:/blue-zfs/FPGA/Mojo/mojo-loader-1.1.2/lib$ rm librxtxSerial.so
dpavlin@blue:/blue-zfs/FPGA/Mojo/mojo-loader-1.1.2/lib$ ln -s /usr/share/java/RXTXcomm.jar
dpavlin@blue:/blue-zfs/FPGA/Mojo/mojo-loader-1.1.2/lib$ ln -s /usr/lib/jni/librxtxSerial.so
.pre
alternative implementation: https://github.com/mogorman/mojo.py
^ Bitcoin mining
https://github.com/kramble/DE0-Nano-BitCoin-Miner/tree/master/Mojo_LX9
http://embeddedmicro.com/forum/viewtopic.php?f=3&t=68&sid=8510da058a2db897f380609cfcee4044&start=10#p300
.pre
dpavlin@blue:/blue-zfs/FPGA/Mojo$ git clone https://github.com/kramble/DE0-Nano-BitCoin-Miner.git
Cloning into 'DE0-Nano-BitCoin-Miner'...
remote: Counting objects: 227, done.
remote: Compressing objects: 100% (167/167), done.
remote: Total 227 (delta 74), reused 208 (delta 56)
Receiving objects: 100% (227/227), 659.22 KiB | 174.00 KiB/s, done.
Resolving deltas: 100% (74/74), done.
.pre
upload bitstream
.pre
dpavlin@blue:/blue-zfs/FPGA/Mojo/DE0-Nano-BitCoin-Miner/Mojo_LX9/MiningSoftware$ ../../../mojo.py/mojo.py -v -d /dev/ttyACM1 -i ../Bitstream/mojo_top_hashers6_100MHz_icarus.bin
Rebooting Mojo
Mojo is ready to recieve bitstream
Mojo acknowledged size of bitstream. Writing bitstream
Mojo has been flashed
Verifying Mojo
First Byte was valid getting flash size.
Flash and local bitstream match file size.
Flash and local bitstream are a match.
Mojo has been loaded bitsream
.pre
.pre
dpavlin@blue:/blue-zfs/FPGA/Mojo/DE0-Nano-BitCoin-Miner/Mojo_LX9$ python miner_icarus.py
Miner started on Tue Jul 16 23:26:17 2013
Sending data to FPGA
...
Share found on Tue Jun 25 23:37:11 2013 nonce 0074fd13
Upstream result: True
[15 accepted, 0 failed, 5.25 +/- 1.35 Mhash/s]
.pre
{toc: }
^ BalCCon 2k24 badge
https://www.youtube.com/watch?v=4waDha2DxK8
https://ch405-labs.com/mc-0o00/
https://gitlab.com/ch405labs/badgelife/mcd-0o00/mcd-0o00-hardware-design
{image: MC-0o00-Schema.png}
^ CH32V003
https://github.com/cnlohr/ch32v003fun
^^ esp32s2 programmer
https://github.com/cnlohr/esp32s2-cookbook/tree/master/ch32v003programmer
flash programmer to esp32s2
.pre
dpavlin@nuc:/nuc/Balccon2k24/esp32s2-cookbook/ch32v003programmer$ /nuc/esp8266/esptool/esptool.py --port /dev/ttyUSB2 -b 460800 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x1000 build/bootloader/bootloader.bin 0x10000 build/usb_sandbox.bin 0x8000 build/partition_table/partition-table.bin
esptool.py v4.7-dev
Serial port /dev/ttyUSB2
Connecting.....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Detecting chip type... ESP32-S2
Chip is ESP32-S2 (revision v0.0)
Features: WiFi, No Embedded Flash, No Embedded PSRAM, ADC and temperature sensor calibration in BLK2 of efuse V1
Crystal is 40MHz
MAC: 7c:df:a1:02:81:de
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00001000 to 0x00004fff...
Flash will be erased from 0x00010000 to 0x00041fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Compressed 13376 bytes to 9327...
Wrote 13376 bytes (9327 compressed) at 0x00001000 in 0.4 seconds (effective 244.8 kbit/s)...
Hash of data verified.
Compressed 201568 bytes to 111748...
Wrote 201568 bytes (111748 compressed) at 0x00010000 in 2.6 seconds (effective 614.4 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 119...
Wrote 3072 bytes (119 compressed) at 0x00008000 in 0.1 seconds (effective 391.6 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
.pre
Connect SWIO (Pin D1) on CH32V003 to GPIO6 on the ESP32S2.
Optionally use 10k pull-up on SWIO.
Optional Clock Synthesizer is on GPIO2 "Multi2" / "M0"
VCC Output on GPIO11/12 on ESP32S2.
hmm... doesn't seem to work for me
.pre
dpavlin@nuc:/nuc/Balccon2k24/ch32v003fun/minichlink$ ./minichlink -3i
Found ESP32S2-Style Programmer
Interface Setup
Error: Failed to get chip details
.pre
that's because I didn't turn on switch on badge!
.pre
dpavlin@nuc:/nuc/Balccon2k24/ch32v003fun/minichlink$ ./minichlink -i
[Fri Feb 21 14:38:00 2025] usb 3-3.3.4.4: input irq status -75 received
[Fri Feb 21 14:38:00 2025] usb 3-3.3.4.4: input irq status -75 received
[Fri Feb 21 14:38:00 2025] usb 3-3.3.4.4: input irq status -75 received
Found ESP32S2-Style Programmer
[Fri Feb 21 14:38:00 2025] usb 3-3.3.4.4: input irq status -75 received
Interface Setup
USER/RDPR : e817/5aa5
DATA1/DATA0: ff00/ff00
WRPR1/WRPR0: 00ff/00ff
WRPR3/WRPR2: 00ff/00ff
[Fri Feb 21 14:38:00 2025] usb 3-3.3.4.4: input irq status -75 received
Flash Size: 16 kB
R32_ESIG_UNIID1: 4f29abcd
R32_ESIG_UNIID2: b7cabcd4
R32_ESIG_UNIID3: ffffffff
.pre
flash
.pre
dpavlin@nuc:/nuc/Balccon2k24$ ./minichlink -w functest.bin 0 -b
.pre
^^ ardulink
https://gitlab.com/BlueSyncLine/arduino-ch32v003-swio
{toc: }
^ power
* what about power it by USB http://forums.parallella.org/viewtopic.php?f=12&t=1128
* 2A to micro-usb connector next to the rj45 Ethernet http://forums.parallella.org/viewtopic.php?f=50&t=1081
* How to minimize Epiphany standby power? http://forums.parallella.org/viewtopic.php?uid=590&f=10&t=1069&start=0
* Critical issue with non-conforming USB powered hubs. http://forums.parallella.org/viewtopic.php?f=10&t=841
* USB port change http://forums.parallella.org/viewtopic.php?f=10&t=1072
* USB power fix http://forums.parallella.org/viewtopic.php?f=50&t=1510
* Where can I draw 5V for a fan ? http://forums.parallella.org/viewtopic.php?f=23&t=1049&start=10
^ Update boot flash
This is required to get CR10 led working
* http://forums.parallella.org/viewtopic.php?f=49&t=983
* https://github.com/parallella/parallella-hw/tree/master/boards/parallella-I/firmware
enviroment before u-boot update:
.pre
zynq-uboot> env print
baudrate=115200
bitstream_image=parallella.bit.bin
bootcmd=run modeboot
bootdelay=0
devicetree_image=devicetree.dtb
devicetree_size=0x20000
ethact=zynq_gem
ethaddr=04:4f:8b:00:10:13
fdt_high=0x20000000
initrd_high=0x20000000
ipaddr=192.168.0.99
kernel_image=uImage
kernel_size=0x500000
modeboot=run qspiboot
qspiboot=echo Configuring PL and Booting Linux...;mmcinfo;fatload mmc 0 0x4000000 ${bitstream_image};fpga load 0 0x4000000 0x3dbafc;fatload mmc 0 0x3000000 ${kernel_image};fatload mmc 0 0x2A00000 ${devicetree_image};bootm 0x3000000 - 0x2A00000
serverip=192.168.0.101
stderr=serial
stdin=serial
stdout=serial
Environment size: 655/131068 bytes
.pre
flasing output:
.pre
zynq-uboot> mmcinfo
Device: SDHCI
Manufacturer ID: 3
OEM: 5344
Name: SU08G
Tran Speed: 50000000
Rd Block Len: 512
SD version 2.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
zynq-uboot> fatload mmc 0 0x4000000 parallella.7020.flash.bin
reading parallella.7020.flash.bin
4351800 bytes read
zynq-uboot> sf probe 0 0 0
SF: Detected N25Q128 with page size 64 KiB, total 16 MiB
zynq-uboot> sf erase 0 0x1000000
SF: Successfully erased 16777216 bytes @ 0x0
zynq-uboot> sf write 0x4000000 0 0x$filesize
SF: program success 4351800 bytes @ 0x0
# I skipped set ethaddr because it was already set correctly
zynq-uboot> set AdaptevaSKU SKUA101040
zynq-uboot> saveenv
Saving Environment to SPI Flash...
SF: Detected N25Q128 with page size 64 KiB, total 16 MiB
Erasing SPI flash...SF: Successfully erased 131072 bytes @ 0x4e0000
Writing to SPI flash...SF: program success 131072 bytes @ 0x4e0000
done
.pre
^ GPIO
.pre
dpavlin@parallella:~/parallella-utils$ make gpiotest
gcc -o gpiotest gpiotest.c para_morse.c para_gpio.c -Wall -lrt
dpavlin@parallella:~/parallella-utils$ sudo ./gpiotest
[sudo] password for dpavlin:
GPIOTEST - Basic test of para_gpio
Initializing...
Success, pausing 5 seconds
Setting direction (forces output to 0!)...
Pausing 5 seconds
Reading multiple times
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Toggling pin 100000 times...
Took 1.432 seconds, 69818 updates/sec
Write / Read test, 100000 times...
Took 2.618 seconds, 76384 ops/sec
Setting output to 0
Verifying level... OK
Disabling output and monitoring input
Gave up waiting for the input to transition
Setting output to 1
Verifying level... OK
Disabling output and monitoring input
Input flipped after 0 cycles
Closing
.pre
^ FPGA
* Zynq documentation http://forums.parallella.org/viewtopic.php?f=51&t=1114
* Command-line programming http://forums.parallella.org/viewtopic.php?uid=590&f=51&t=1161&start=0
.pre
sudo mknod /dev/xdevcfg c 250 0
sudo -s
cat parallella.bit.bin > /dev/xdevcfg
exit
# programming time
cat /sys/devices/amba.1/f8007000.devcfg/prog_done
.pre
* Routing additional Zynq hard block I/O to PEC_FPGA http://forums.parallella.org/viewtopic.php?f=51&t=1154
* Source http://forums.parallella.org/viewtopic.php?uid=590&f=10&t=1069&start=0
* does the board contains thermal sensor(s) ? http://forums.parallella.org/viewtopic.php?f=23&t=930
.pre
/sys/bus/iio/devices/iio:device0/in_temp0_raw
/sys/bus/iio/devices/iio:device0/in_temp0_offset
/sys/bus/iio/devices/iio:device0/in_temp0_scale
T = ((in_temp0_raw + in_temp0_offset) * in_temp0_scale) / 1000)
.pre
script:
.pre
#!/bin/bash
raw=`cat /sys/bus/iio/devices/iio:device0/in_temp0_raw`
offset=`cat /sys/bus/iio/devices/iio:device0/in_temp0_offset`
scale=`cat /sys/bus/iio/devices/iio:device0/in_temp0_scale`
c_temp=`echo "scale=1;(($raw + $offset) * $scale) / 1000" | bc`
f_temp=`echo "scale=1;(($c_temp * 9) / 5) + 32" | bc`
echo
echo "Zynq Temp: $c_temp C / $f_temp F"
echo
.pre
Modified to display temperature in loop: {file: temp.sh}
^^ headless stream
http://forums.parallella.org/viewtopic.php?f=48&t=1213
removed html traces from device tree
^ serial
* serial port http://forums.parallella.org/viewtopic.php?f=10&t=845
^ hardware
* Eagle library available http://forums.parallella.org/viewtopic.php?f=11&t=559
* KiCad daughter card template http://forums.parallella.org/viewtopic.php?f=11&t=1204 https://github.com/TiZed/Parallella_Template
* Parallella Case With 12V Fan http://www.thingiverse.com/thing:273701
* Parallella clip case https://github.com/kyllikki/designs/tree/master/Parallella
* ARM JTAG http://forums.parallella.org/viewtopic.php?f=10&t=167
* uboot network problems http://forums.parallella.org/viewtopic.php?f=48&t=1667&p=10416&hilit=devicetree#p10416
^ software
^^ device tree
.pre
sudo apt-get install device-tree-compiler
# Compiling a device tree blob from source (.dts-->.dtb):
dtc -I dts -O dtb -o devicetree.dtb zynq-parallella1-headless.dts
# To get source from compiled device tree (.dtb-->.dts):
dtc -I dtb -O dts -o devicetree.dts devicetree.dtb
.pre
^^ /dev
see how to modify devicetree at http://elinux.org/Parallella_Speed_Up_Ubuntu
^^ Debian
http://elinux.org/Parallella_Debian
^^ Epiphany
* cgminer https://github.com/LordRafa/cgminer
{file: The-Generic-STM32F103-Pinout-Diagram.pdf}
{toc: }
stm32f103 board
^ arduino boot loader
* https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki/Flashing-Bootloader-for-BluePill-Boards
^ triple usb serial
^^ pill_serial
* https://satoshinm.github.io/blog/171223_stm32serial_triple_usb-to-serial_adapter_using_stm32_blue_pill.html
* https://github.com/satoshinm/pill_serial
| Function | Pin and Port |
| USART3 TX | PB10 |
| USART3 RX | PB11 |
| USART2 TX | PA2 |
| USART2 RX | PA3 |
| USART1 TX | PA9 |
| USART1 RX | PA10 |
| USART | TX pin | RX pin | special | speed | sensor | linux |
| 3 | PB10 | PB11 | | 9600 | [MH-Z19B] | /dev/ttyACM1 |
| 2 | PA2 | PA3 | | 9600 | | |
| 1 | PA9 | PA10 | BOOT=0 | 9600 | | |
.pre
dpavlin@nuc:/nuc/stm32/pill_serial$ cat flash.sh
sudo ../stlink/build/Release/st-flash write src/pill_serial.bin 0x08000000
.pre
lower serial speed to 9600 so we can use slow sensors on it: {file: serial-speed.diff}
^^ bluepill-serial-monster
https://github.com/r2axz/bluepill-serial-monster
^ openocd with raspberry pi
http://git.rot13.org/?p=openocd-rpi2-stm32;a=blob;f=openocd-rpi.txt
^ clones
https://github.com/thanks4opensource/buck50/issues/2
https://github.com/keirf/Greaseweazle/wiki/STM32-Fakes
.pre
dpavlin@nuc:/nuc/stm32/Greaseweazle$ wget https://github.com/keirf/Greaseweazle/releases/download/v0.22/Greaseweazle-v0.22.zip
dpavlin@nuc:/nuc/stm32/Greaseweazle$ unzip Greaseweazle-v0.22.zip Greaseweazle-v0.22/alt/Blinky_Test-v0.22.hex
Archive: Greaseweazle-v0.22.zip
inflating: Greaseweazle-v0.22/alt/Blinky_Test-v0.22.hex
.pre
write it to flash using openocd
.pre
> flash write_image erase /nuc/stm32/Greaseweazle/Greaseweazle-v0.22/alt/Blinky_Test-v0.22.hex 0 ihex
auto erase enabled
wrote 5120 bytes from file /nuc/stm32/Greaseweazle/Greaseweazle-v0.22/alt/Blinky_Test-v0.22.hex in 0.299529s (16.693 KiB/s)
.pre
serial output is on the programming interface at pins A9/TX and A10/RX: Not via the USB port!
.pre
pi@pihdmi:/nuc/stm32/buck50 $ microcom -p /dev/ttyUSB1
connected to /dev/ttyUSB1
Escape character: Ctrl-\
Type the escape character to get to the prompt.
** Blinky
** Blinky Test **
** Keir Fraser <keir.xen@gmail.com>
** https://github.com/keirf/Greaseweazle
Serial = ff48:0670:8967:5655:4740:6706
Flash Size = 128kB
Device ID = 0x0000
Revision = 0x0000
Testing I2C1... OK
Testing I2C2... OK
Testing SPI1... OK
Testing SPI2... OK
Testing TIM1... OK
Testing TIM2... OK
Testing TIM3... OK
Testing TIM4... OK
DMA Test #1... OK
DMA Test #2... OK
DMA Test #3... OK
DMA Test #4... OK
Testing 64kB Flash... OK
Enable TIM4 IRQ... .OK
Testing 20kB SRAM (endless loop)................................................................
.pre
After flashing this test, you will not be able to address blue pill using openocd.
To work-around this problem, I switched boot0 jumper, used stm32loader (after pressing reset button) to load alternative binary.
I guess that I have read (and used) too much XP driven programming and testing, so I started devising tests after each sysadmin change also. So, here are some tips assorted by services:
{toc: }
^ smtp
Test all `MX` records for domain `bobcatsss2008.org` by sending e-mail to `test@bobcatsss2008.org`
.pre
host -t mx bobcatsss2008.org | awk '{ print $4 }' | xargs -i swaks -t test@bobcatsss2008.org -s {}
.pre
^ dns
Dumps all zones from all name servers.
.pre
host -t ns bobcatsss2008.org | awk '{ print $3 }' | xargs -i host -t soa -va bobcatsss2008.org {}
.pre
^ Before performance tuning
^^ Memory
.pre
titan:~# free
total used free shared buffers cached
Mem: 903920 884360 19560 0 6728 167636
-/+ buffers/cache: 709996 193924
Swap: 995988 367732 628256
.pre
Koristi relativno mnogo swap-a, dmesg ima poruke o OOM-u, dakle treba mu više swap-a (ideja: smanjiti broj apache childova, jer je apache-ssl zapravo jako velik).
Mašina zapravo brutalno swap-a, pa nije ni čudo da se vuče kao crknuta krava:
.pre
titan:~# vmstat 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
6 37 430500 7692 3728 105088 8 2 14 3 2 11 18 12 69 0
3 45 432800 6512 3632 103128 2524 1596 4019 1931 1370 1613 11 28 61 0
2 47 442860 7460 3608 102216 649 2553 857 2664 489 381 3 32 65 0
5 56 444028 4760 3620 102328 497 1840 556 1869 464 282 3 37 60 0
16 44 472132 6788 3684 102392 4467 10889 5239 11409 3297 2770 5 34 61 0
11 36 474232 5868 3784 103212 1589 1212 2047 1435 681 812 13 28 59 0
3 38 488996 5232 3708 102672 1952 5435 2985 5885 1704 1675 7 30 63 0
1 18 493556 6976 3808 104396 491 855 1291 1105 866 643 8 31 61 0
0 24 497508 6024 3736 104160 203 1576 1008 1768 551 592 6 36 59 0
2 20 499324 5900 3800 105964 509 375 1549 533 517 727 8 30 62 0
6 23 501608 5928 3844 106700 300 1528 804 1647 505 466 5 35 60 0
2 26 500752 7804 3872 106388 629 583 1281 795 508 588 6 29 64 0
4 26 500240 8068 3872 107264 533 300 1311 439 465 580 9 28 63 0
.pre
Disk nema uključen dma:
.pre
titan:~# hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
IO_support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 9729/255/63, sectors = 156299375, start = 0
titan:~# hdparm -d 1 -c 3 -a 16 -m 16 /dev/hda
.pre
Instalirao sam: atop, hdparm, vim, sysstat, atsar
Vratio sam direktive za broj apache child-ova:
.pre
titan:~# diff -urw /etc/apache-ssl/httpd.conf.before_dpavlin /etc/apache-ssl/httpd.conf
--- /etc/apache-ssl/httpd.conf.before_dpavlin 2007-02-07 19:29:54.000000000 +0100
+++ /etc/apache-ssl/httpd.conf 2007-02-07 20:19:55.000000000 +0100
@@ -124,7 +124,7 @@
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
-KeepAliveTimeout 15
+KeepAliveTimeout 5
#
# Server-pool size regulation. Rather than making you guess how many
@@ -139,10 +139,15 @@
# a new spare. If there are more than MaxSpareServers, some of the
# spares die off. The default values are probably OK for most sites.
#
+MinSpareServers 10
+MaxSpareServers 10
+
#
# Number of servers to start initially --- should be a reasonable ballpark
# figure.
#
+StartServers 10
+
#
# Limit on total number of servers running, i.e., limit on the number
# of clients who can simultaneously connect --- if this limit is ever
@@ -150,6 +155,8 @@
# It is intended mainly as a brake to keep a runaway server from taking
# the system with it as it spirals down...
#
+MaxClients 512
+#MaxClients 2048
#
# MaxRequestsPerChild: the number of requests each child process is
.pre
Brojevi su namjerno konzervativno mali, cilj je prestati koristiti swap.
Pokušao sam smanjiti broj konekacija iz php-a na mysql:
.pre
titan:~# diff -urw /etc/php4/apache/php.ini.before_dpavlin /etc/php4/apache/php.ini
*** /etc/php4/apache/php.ini.before_dpavlin 2007-01-31 22:19:05.000000000 +0100
*** /etc/php4/apache/php.ini 2007-02-07 19:45:40.000000000 +0100
@@ -530,7 +530,7 @@
mysql.max_persistent = 16
; Maximum number of links (persistent + non-persistent). -1 means no limit.
-mysql.max_links = 256
+mysql.max_links = 32
mysql.connect_timeout = 30
; Default port number for mysql_connect(). If unset, mysql_connect() will use
.pre
sve u svemu, donekle uspješno:
.pre
titan:~# ps ax | egrep '(apache-ssl|mysqld)' | awk '{ print $5 }' | sort | uniq -c
2 /bin/sh
1 /usr/lib/apache-ssl/gcache
62 /usr/sbin/apache-ssl
47 /usr/sbin/mysqld
1 grep
1 logger
titan:~# free
total used free shared buffers cached
Mem: 903920 815964 87956 0 21896 304012
-/+ buffers/cache: 490056 413864
Swap: 995988 164696 831292
titan:~# uptime
20:33:43 up 9 days, 12:38, 4 users, load average: 1.25, 1.34, 2.60
titan:~# vmstat 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 162956 61912 26160 359660 8 3 16 4 3 13 18 12 69 0
0 0 162956 55044 26200 359736 1 0 17 232 285 662 24 1 75 0
6 0 162956 54020 26264 359960 0 0 71 231 337 506 18 1 80 0
1 0 162956 54984 26300 360856 0 0 292 215 425 615 39 2 60 0
1 0 162956 51108 26368 360896 0 0 7 335 320 702 32 3 65 0
1 0 162956 49692 26472 360928 7 0 7 479 439 765 26 2 72 0
4 0 162956 55144 26496 360960 0 0 3 205 331 655 74 4 22 0
2 0 162956 54324 26568 360996 0 0 4 489 466 816 56 5 39 0
0 0 162956 54208 26604 361168 0 0 55 215 310 566 29 2 69 0
4 0 162956 48900 26840 362348 0 0 373 1059 522 1106 44 4 52 0
1 0 162956 40216 27000 363224 0 0 277 732 505 967 37 4 59 0
0 0 162956 55336 27016 363864 0 0 211 220 320 553 47 2 51 0
1 0 162952 60284 27096 364056 1 0 55 417 355 693 32 2 65 0
.pre
uptime oko je 2 (što je za dvoprocesorsku mašinu o.k.), a zapravo ima i nešto idle CPU-a što je uvijek zgodno.
Here is a tail about my try to use "Subversion"<http://subversion.tigris.org/> (actually, "svk"<http://svk.bestpractical.com/> to manage my local changes on "qemu"<http://fabrice.bellard.free.fr/qemu/> project
This page is based on "CVS to SVN guide on Savannah"<https://savannah.gnu.org/maintenance/CvSToSvN>
^ Copy project from Savannah
.pre
rsync -av rsync://cvs.sv.gnu.org/sources/qemu qemu-cvs/
.pre
^ Convert CVS to Subversion
.pre
cvs2svn --cvs-revnums -s qemu-svn qemu-cvs
.pre
Because of "all reasons documented here"<http://www.voip-info.org/wiki/view/CallWeaver> I'm no longer using Asterisk but [CodeWeaver]
{toc: }
^ Fritz PCI ISDN
* get Fritz driver from http://www.avm.de/ftp/cardware/fritzcrd.pci/linux/ and use http://sifnt.net.au/files/asterisk/fritz-linux-2.6.17.patch to compile it on recent kernels ("original instructions"<http://www.voip-info.org/wiki/index.php?page=Asterisk+AVM+Fritz+CAPI+Driver+Install>)
* Use latest CAPI driver from subversion:
.pre
svn co svn://svn.chan-capi.org/chan-capi/trunk chan-capi-trunk
.pre
Version `1.0.1` has problems with fcpci, so don't use it!
* Than follow more-or-less "instructions on this page"<http://www.voip-info.org/wiki/index.php?page=Asterisk+How+to+connect+with+CAPI>
^ Motorola 62802 (SM65) winmodem
.pre
dpavlin@brr:~$ lspci -v -s 04
05:04.0 Communication controller: Motorola Wildcard X100P
Subsystem: Motorola Unknown device 0002
Flags: bus master, medium devsel, latency 32, IRQ 10
I/O ports at 1000 [size=256]
Memory at f0500000 (32-bit, non-prefetchable) [size=4K]
Capabilities: <access denied>
.pre
^ Compilation
http://www.asterisk.org/developers/get-source
^^ zaptel
.pre
apt-get install libnewt-dev
svn co http://svn.digium.com/svn/zaptel/trunk zaptel
cd zaptel
./configure
make menuconfig
make
sudo make install
sudo make config
cd -
.pre
^^ libbri
Not needed for Motorola card above
.pre
# svn co http://svn.digium.com/svn/libpri/trunk libpri
.pre
^^ asterisk
.pre
svn co http://svn.digium.com/svn/asterisk/trunk asterisk
./configure
make
sudo make install
sudo make samples
.pre
{toc: }
^ meanIT tablet Q70
7" IPS Quad Core
recovery: extdroid4.4.2_r2-a33-v2.0
^^ adb shell
.pre
dpavlin@siobhan:~$ adb shell
root@astar-ococci:/ #
root@astar-ococci:/ # cat /proc/cmdline
console=ttyS0,115200 root=/dev/nandd init=/init loglevel=4 specialstr= partitions=bootloader@nanda:env@nandb:boot@nandc:system@nandd:data@nande:misc@nandf:recovery@nandg:cache@nandh:metadata@nandi:private@nandj:UDISK@nandk boot_type=0 config_size=39716
root@astar-ococci:/ # cat /proc/cpuinfo
Processor : ARMv7 Processor rev 5 (v7l)
processor : 0
BogoMIPS : 5714.28
processor : 1
BogoMIPS : 4800.00
processor : 3
BogoMIPS : 4800.00
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5
Hardware : sun8i
Revision : 0000
Serial : 1a884915
.pre
^^ board
AL-AX3-751B-V1.0
2015.03.26
http://linux-sunxi.org/Aoson_M751s
https://github.com/Icenowy/linux-kernel-lichee-a33/tree/aoson-m751s
^ USB FEL
Vol+ to enter FEL mode
.pre
Bus 003 Device 004: ID 1f3a:efe8 Onda (unverified) V972 tablet in flashing mode
root@x230:~# sunxi-fel ver
AWUSBFEX soc=00001667(A33) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000
# read SID
root@x230:~# sunxi-fel readl 0x01c23800
0x0461872a
root@x230:~# sunxi-fel sid
0461872a:033c50c3:1a884915:00000000
.pre
^^ device info
* http://linux-sunxi.org/Retrieving_device_information
.pre
dpavlin@x230:~/a33$ sudo sunxi-fel read 0x42400000 0x82d0 boot1.header
# blocks and version doesn't work any more
root@x230:~# sunxi-fel -v read 0x43000000 0x20000 script.bin
# also doesn't transfer anything and hangs
.pre
^^ extract data from device
.pre
dpavlin@klin:/klin/armbian/sunxi-tools$ make CROSS_COMPILE=arm-linux-gnueabihf- sunxi-meminfo
arm-linux-gnueabihf-gcc -std=c99 -Wall -Wextra -Wno-unused-result -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE -D_DEFAULT_SOURCE -Iinclude/ -static -o sunxi-meminfo meminfo.c
dpavlin@klin:/klin/armbian/sunxi-tools$ make CROSS_COMPILE=arm-linux-gnueabihf- sunxi-script_extractor
arm-linux-gnueabihf-gcc -std=c99 -Wall -Wextra -Wno-unused-result -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE -D_DEFAULT_SOURCE -Iinclude/ -static -o sunxi-script_extractor script_extractor.c
# put files in /cache/ instead of /sdcard/ since /sdcard/ doesn't have executable permission
dpavlin@x230:/mnt/klin/klin/armbian/sunxi-tools$ adb push sunxi-script_extractor /cache/
[100%] /cache/sunxi-script_extractor
dpavlin@x230:/mnt/klin/klin/armbian/sunxi-tools$ adb push sunxi-meminfo /cache/
[100%] /cache/sunxi-meminfo
root@astar-ococci:/cache # ./sunxi-meminfo
Error: unknown or unhandled Soc: 0x1667
255|
# urgh!
svroot@astar-ococci:/cache # ./sunxi-script_extractor > a33.bin
root@astar-ococci:/cache # ls -al a33.bin
-rw-rw-rw- root root 131072 2017-10-18 17:57 a33.bin
.pre
^^ u-boot
.pre
dpavlin@klin:/klin/u-boot$ git remote -v
sunxi git://git.denx.de/u-boot-sunxi.git (fetch)
sunxi git://git.denx.de/u-boot-sunxi.git (push)
dpavlin@klin:/klin/u-boot$ git checkout -b sunxi/next sunxi/next
Branch 'sunxi/next' set up to track remote branch 'next' from 'sunxi'.
Switched to a new branch 'sunxi/next'
dpavlin@klin:/klin/u-boot$ make CROSS_COMPILE=arm-linux-gnueabihf- q8_a33_tablet_1024x600_defconfig
dpavlin@klin:/klin/u-boot$ make CROSS_COMPILE=arm-linux-gnueabihf- -j4
.pre
* http://linux-sunxi.org/FEL/USBBoot
^ malware pre-installed
* com.adups.fota
{toc: }
Various infrared links collected here
{tag_list: IR}
^ Ir Send
Updated for HVAC Mitsubishi & Panasonic IR
* https://github.com/r45635/HVAC-IR-Control
^ Tasmota IR
^^ Configure module
Generic
D4 GPIO2 - AM2301
D6 GPIO12 - IN - IRrecv
D7 GPIO13 - Switch1 - reed relay to gnd
D5 GPIO14 - OUT - IRsend
^^ Configure WIFI
AP1 SSID, AP1 password
hostname - ir
^^ Configure MQTT
Host: rpi2
Topic: ir
^^ Configure Logging
Telemetry period: 10
^^ Configure Other
Device Name: IR
Friendly Name 1: IR
^^ Console
SerialLog 3 - turn serial log output https://tasmota.github.io/docs/Commands/
^^ reed sensor
switch 2 gpio 13
https://tasmota.github.io/docs/Buttons-and-Switches/#switchmode-15
expose gpio 13 in homeassistant as lodja_vrata sensor, remove connection with relay
.pre
SwitchText2 lodja_vrata
Setoption114 1
SwitchMode2 15
.pre
^ ESP IR TR
https://templates.blakadder.com/ESP_IR_TR.html
.pre
{"NAME":"Tasmota IR-Gateway","GPIO":[0,0,0,0,1056,0,0,0,0,0,1088,0,0,0],"FLAG":0,"BASE":18}
.pre
GPIO04 IRsend
GPIO14 IRrecv
^^ AM2301 + IR
module pinout
{image: esp_ir_tr-pinout.jpg}
{image: esp_ir_tr-am2301-gpio15.jpg}
(it's on GPIO13, ignore picture name which is wrong)
addition AM2301 on GPIO13 - requires custom tasmota ir build with USE_DHT enabled for IR_FIRMWARE build
.pre
(venv) dpavlin@nuc:/nuc/esp8266/Tasmota$ git diff
diff --git a/tasmota/include/tasmota_configurations.h b/tasmota/include/tasmota_configurations.h
index 1260892a0..c64d1ac1e 100644
--- a/tasmota/include/tasmota_configurations.h
+++ b/tasmota/include/tasmota_configurations.h
@@ -503,7 +503,8 @@
#undef USE_PROJECTOR_CTRL // Disable support for LCD/DLP Projector serial control interface
#undef USE_LOX_O2 // Disable support for LuminOx LOX O2 Sensor
-#undef USE_DHT // Disable support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
+// XXX FIXME dpavlin -- keep DHT11
+//#undef USE_DHT // Disable support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
#undef USE_MAX31865 // Disable support for MAX31865 RTD sensors using softSPI
#undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8
.pre
template:
.pre
{"NAME":"Tasmota IR-Gateway","GPIO":[0,0,0,0,1056,0,0,0,0,0,1088,1216,0,0],"FLAG":0,"BASE":18}
.pre
`irc-logger` is irc bot which records conversations, supports tags and create web archive of your conversations to enable better recall than from vague memory.
It supports several interesting features including tagging// (just add two slashes at end of the word, and it becomes tag in web archive)
{fetchrss: http://svn.rot13.org/index.cgi/irc-logger/rss/trunk full}
{toc: }
Similar board with instructions for Debian install: https://github.com/alexeicolin/javelin
^ NS4300N
* Porting openwrt to mpc8343-based NAS
** https://forum.openwrt.org/viewtopic.php?id=47856
Hold reset button below ethernet connector to reset admin account password to admin.
.pre
Operating System Embedded Linux
Version 01.02.0000.05
CPU MPC 8343
.pre
ssh package: http://www.16paws.com/projects/NS4300N/dropbear.html
telnet: http://www.avsforum.com/forum/26-home-theater-computers/859675-promise-smartstor-ns4300n-8.html#post15558981
^^ hack upgrade
http://www.avsforum.com/forum/26-home-theater-computers/859675-promise-smartstor-ns4300n-22.html
.pre
I spent some time digging around my NS4300N and found the symmetric key password for firmware upgrade packages and probably NS4600 plugins. I have verified that this password (used with bcrypt) decrypts and encrypts NSx700, NS4600, NS4300N, NS2300N firmware packages.
The password is "30570000"
it's quite simple to decrypt and unpackage a firmware release, for example (from a linux box):
mv ns4300_010512.upg ns4300_010512.bfe
bcrypt ns4300_010512.bfe
Encryption key: 30570000
dd if=ns4300_010512 of=ns4300_010512.tgz bs=1k skip=79
tar xzf ns4300_010512.tgz
leaves you with rev, fix_script, kernel, rootfs, pro_sqfs, & usr_sqfs files
you can then mount the various fs images on a loopback device and modify to you hearts content, reverse the above steps and use normal upgrade process to flash the modified firmware
have fun!
.pre
^^ get root with plugin
http://www.avsforum.com/forum/26-home-theater-computers/859675-promise-smartstor-ns4300n-7.html#post15191530
.pre
After much pain and suffering today, I got the engmode shell to be a full shell on the SR5 firmware. Here's the steps (assuming you are on Mac Os X or Linux):
1) Download the new itunes plugin frimware from promise--
itunes_plugin_0000_010002_A1.ppg
2) Extract the tarball:
dd if=itunes_plugin_0000_010002_A1.ppg of=test.tgz bs=97k skip=1
tar -zxvf test.tgz
This makes the file "rev" and the directory "itunes" in the current directory.
3) Edit the "itunes/upgrade_script" perl script. Add the following lines at the top after the "#!/usr/bin/perl" line:
system qq(sudo cp /etc/passwd /tmp/passwd);
system qq(sudo sed -e 's/engsh/sh/g' /tmp/passwd > /tmp/passwd.wks);
system qq(sudo cp /tmp/passwd.wks /etc/passwd);
Save the file.
4) Create a new plugin ".ppg" file with your changes:
tar -zcvf itunes.tgz ./rev ./itunes
dd if=/dev/zero of=itunes_plugin_0000_010002_A1_mod.ppg bs=97k count=1
cat itunes.tgz >> itunes_plugin_0000_010002_A1_mod.ppg
5) Put this modified file itunes_plugin_0000_010002_A1_mod.ppg on one of the NS4300N's shares.
6) Uninstall the itunes/firefly plugin (if you had it installed previously)
7) Install the modified itunes plugin
8) After the Installation OK dialoge comes up, test the telnet:
telnet YOUR_BOX_IP_ADDRESS 2380
login=engmode
pwd=hawk201
9) You may have to uninstall this plugin and reinstall the original, I saw some flakey behavior where itunes/firefly didn't want to startup till I reinstalled with the original plugin from promise. Might be I need a "chmod -R 777" or some such in the building of the plugin. But as uninstalling and reinstalling is not so much a pain I didn't take the time to verify.
This may be lost after reboot of the NS4300N (i have a feeling the passwd file is refreshed from /data after a reboot). I just wanted to get this out to everyone in case they wanted to play around.
For those that want to make the firefly config file writeable, keep in mind that the NS4300N's design overwrites the config file when the firefly server is enabled/disabled from the web interface with the original configuration file. I found it simpler to make some soft links than to work around Promise's design paradigms.
.pre
^ NS4600
.pre
Operating System Embedded Linux
Version 02.01.0000.16
CPU AMCC 431
Network Adapter Gigabit Ethernet Card 10/100/1000 Mbps
MAC Address 00:01:55:30:53:8D
.pre
* http://scratchpad.wikia.com/wiki/NS4600
Latest firmware:
Update 3TB HDD support models - 2011/11/17 02.01.0000.22
^^ hack upgrade
.pre
# bcyrypt as above....
dd if=foo of=foo.tbz bs=1k skip=46
mkdir foo-files
tar xvf ../foo.tbz
apt-get install mtd-utils
dpavlin@klin:/tmp/foo-files$ /usr/sbin/jffs2dump -v app_jffs2-p -c -b -e app2
dpavlin@klin:/tmp/foo-files$ ls -al app2
-rw-r--r-- 1 dpavlin dpavlin 41167608 Dec 1 21:04 app2
sudo modprobe mtdram total_size=41000 erase_size=256
sudo modprobe mtdblock
dpavlin@klin:/tmp/foo-files$ cat /proc/mtd
dev: size erasesize name
mtd0: 0280a000 00040000 "mtdram test device"
dpavlin@klin:/tmp/foo-files$ sudo dd if=app2 of=/dev/mtdblock0
80405+1 records in
80405+1 records out
41167608 bytes (41 MB) copied, 0.47149 s, 87.3 MB/s
dpavlin@klin:/tmp/foo-files$ mkdir /tmp/foo-app2
dpavlin@klin:/tmp/foo-files$ sudo mount /dev/mtdblock0 /tmp/foo-app2/ -t jffs2
dpavlin@klin:/tmp/foo-files$ ls -al /tmp/foo-app2/
total 39592
drwxr-xr-x 3 root root 0 Jan 1 1970 .
drwxrwxrwt 1 root root 1726 Dec 1 21:14 ..
-rwx------ 1 root root 40542208 Nov 2 2011 app_sqfs
dpavlin@klin:/tmp/foo-app2$ sudo unsquashfs -l app_sqfs | less
### ramdisk
dpavlin@klin:/tmp/foo-files/rootfs-ppc$ dd if=../rootfs-p of=rootfs-ppc.gz bs=64 skip=1
59783+1 records in
59783+1 records out
3826120 bytes (3.8 MB) copied, 0.164652 s, 23.2 MB/s
dpavlin@klin:/tmp/foo-files/rootfs-ppc$ file rootfs-ppc.gz
rootfs-ppc.gz: gzip compressed data, was "ramdisk.img", last modified: Wed Nov 2 20:57:28 2011, max compression, from Unix
dpavlin@klin:/tmp/foo-files/rootfs-ppc$ gzip -d rootfs-ppc.gz
dpavlin@klin:/tmp/foo-files/rootfs-ppc$ file rootfs-ppc
rootfs-ppc: Linux rev 0.0 ext2 filesystem data, UUID=00000000-0000-0000-0000-000000000000
dpavlin@klin:/tmp/foo-files/rootfs-ppc$ mkdir rootfs
dpavlin@klin:/tmp/foo-files/rootfs-ppc$ sudo mount rootfs-ppc rootfs/ -o loop
.pre
^^ serial port
* http://vogelchr.blogspot.hr/2011/06/promise-smartstor-ns4600-serial-port.html
{image: ns4600_pcb_cn11_labels.jpg}
https://plus.google.com/photos/102970072923818524447/albums/5025551365487818161/5614004462366176018?pid=5614004462366176018&oid=102970072923818524447
On my board (which is marked NS4600P GP0930-03 REV.A3) serial connector is marked CN6)
pinout:
| pin | voltage | serial |
| 1 | 3.3V | TX |
| 2 | 0V | GND |
| 3 | 1.7V | RX |
| 4 | 3.3V | VCC |
Serial port output:
.pre
U-Boot 1.3.4 (NS4600p - 013 - 800MHz) (Jun 01 2010 - 16:16:09)
CPU: AMCC PowerPC 431EXr at 800 MHz (PLB=200, OPB=100, EBC=100 MHz)
Security/Kasumi support
Bootstrap Option F - Boot ROM Location NAND (8 bits), booting from NAND
Internal PCI arbiter disabled
32 kB I-Cache 32 kB D-Cache
Board: NS4600p - PROMISE 4-bay NAS Target Board, 1*PCIe/1*SATA
I2C: ready
DRAM: 256 MB
Enclosure: Load fan configurations from VPD
NAND: 128 MiB
eth0 MAC = 00:01:55:30:53:89
eth1 MAC = 00:00:00:00:00:00
PCI: Bus Dev VenId DevId Class Int
PCIE1: successfully set as root-complex
01 00 105a 3f20 0104 00
SCSI: Net: ppc_4xx_eth0
Hit Ctrl + C to stop autoboot: 0
No wakeup events detected! Auto booting...
Leave clock generator PD mode... OK
Leave net PHY PD mode... OK
Turn on all activity LED power... OK
Blinking LED... OK
Turn on disk power... OK
NAND read: device 0 offset 0xc80000, size 0x300000
3145728 bytes read: OK
NAND read: device 0 offset 0xf80000, size 0x800000
8388608 bytes read: OK
NAND read: device 0 offset 0x100000, size 0x3000
12288 bytes read: OK
## Booting kernel from Legacy Image at 01200000 ...
Image Name: Linux-2.6.32.14
Created: 2011-01-20 4:39:31 UTC
Image Type: PowerPC Linux Kernel Image (gzip compressed)
Data Size: 2339544 Bytes = 2.2 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
## Loading init Ramdisk from Legacy Image at 01b00000 ...
Image Name: 02.01.0000.22
Created: 2011-11-02 20:57:34 UTC
Image Type: PowerPC Linux RAMDisk Image (gzip compressed)
Data Size: 3826120 Bytes = 3.6 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
## Flattened Device Tree blob at 01a00000
Booting using the fdt blob at 0x1a00000
Uncompressing Kernel Image ... OK
Loading Ramdisk to 0fa55000, end 0fdfb1c8 ... OK
Loading Device Tree to 00ffa000, end 00ffffff ... OK
Using PowerPC 44x Platform machine description
Linux version 2.6.32.14 (root@ptk-229) (gcc version 4.2.2) #3 Thu Jan 20 12:39:14 CST 2011
Found initrd at 0xcfa55000:0xcfdfb1c8
Zone PFN ranges:
DMA 0x00000000 -> 0x00001000
Normal 0x00001000 -> 0x00001000
HighMem 0x00001000 -> 0x00001000
Movable zone start PFN for each node
early_node_map[1] active PFN ranges
0: 0x00000000 -> 0x00001000
MMU: Allocated 1088 bytes of context maps for 255 contexts
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 4094
Kernel command line: root=/dev/ram rw console=ttyS0,115200 mtdparts=nand0:1024K(u-boot),512K(dtb),3072K(safe-k),8192K(safe-r),3072K(kernel),8192K(rootfs),16384K(usr),2048K(data),1024K(oem),87552K(app)
PID hash table entries: 1024 (order: -4, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 1, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 0, 65536 bytes)
Memory: 252096k/262144k available (4864k kernel code, 10048k reserved, 512k data, 269k bss, 384k init)
Kernel virtual memory layout:
* 0xffef0000..0xffff0000 : fixmap
* 0xfdee0000..0xffee0000 : highmem PTEs
* 0xfd6e0000..0xfdee0000 : consistent mem
* 0xfd6e0000..0xfd6e0000 : early ioremap
* 0xd1000000..0xfd6e0000 : vmalloc & ioremap
SLUB: Genslabs=15, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Hierarchical RCU implementation.
NR_IRQS:512
UIC0 (32 IRQ sources) at DCR 0xc0
UIC1 (32 IRQ sources) at DCR 0xd0
UIC2 (32 IRQ sources) at DCR 0xe0
UIC3 (32 IRQ sources) at DCR 0xf0
clocksource: timebase mult[500000] shift[22] registered
Console: colour dummy device 80x25
Mount-cache hash table entries: 8192
xor: measuring software checksum speed
8regs : 96.000 MB/sec
8regs_prefetch: 128.000 MB/sec
32regs : 96.000 MB/sec
32regs_prefetch: 112.000 MB/sec
xor: using function: 8regs_prefetch (128.000 MB/sec)
NET: Registered protocol family 16
OCM1: 65536 Bytes (enabled)
OCM1: 65536 Bytes (non-cached)
OCM1: 0 Bytes (cached)
256k L2-cache enabled
PCIE0: Port disabled via device-tree
PCIE1: Checking link...
PCIE1: Device detected, waiting for link...
PCIE1: link is up !
PCI host bridge /plb/pciex@d20000000 (primary) ranges:
MEM 0x0000000e80000000..0x0000000effffffff -> 0x0000000080000000
MEM 0x0000000f00100000..0x0000000f001fffff -> 0x0000000000000000
IO 0x0000000f80010000..0x0000000f8001ffff -> 0x0000000000000000
Removing ISA hole at 0x0000000f00100000
4xx PCI DMA offset set to 0x00000000
/plb/pciex@d20000000: Legacy ISA memory support enabled
PCIE1: successfully set as root-complex
PCI: Probing PCI hardware
PCI: Hiding 4xx host bridge resources 0000:80:00.0
pci 0000:80:00.0: PCI bridge, secondary bus 0000:81
pci 0000:80:00.0: IO window: 0x1000-0x1fff
pci 0000:80:00.0: MEM window: 0x80000000-0x800fffff
pci 0000:80:00.0: PREFETCH window: disabled
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mod_init:1047
ppc460ex_dma_per_chan_init:1059
Switching to clocksource timebase
NET: Registered protocol family 2
IP route cache hash table entries: 16384 (order: 0, 65536 bytes)
TCP established hash table entries: 8192 (order: 0, 65536 bytes)
TCP bind hash table entries: 8192 (order: -1, 32768 bytes)
TCP: Hash tables configured (established 8192 bind 8192)
TCP reno registered
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Trying to unpack rootfs image as initramfs...
rootfs image is not initramfs (no cpio magic); looks like an initrd
Freeing initrd memory: 3736k freed
Probing AMCC DMA driver
PPC4xx PLB DMA engine @0x04_00018080 size 200 IRQ 25
PPC460ex PLB DMA engine @0x00_00000100 size 263
new_chan->chan_id 0x0
new_chan->chan->chan_id 0x0
PPC460ex PLB DMA engine @0x00_00000108 size 271
new_chan->chan_id 0x1
new_chan->chan->chan_id 0x1
PPC460ex PLB DMA engine @0x00_00000110 size 279
new_chan->chan_id 0x2
new_chan->chan->chan_id 0x2
PPC460ex PLB DMA engine @0x00_00000118 size 287
new_chan->chan_id 0x3
new_chan->chan->chan_id 0x3
VFS: Disk quotas dquot_6.5.2
Dquot-cache hash table entries: 16384 (order 0, 65536 bytes)
squashfs: version 4.0 (2009/01/31) Phillip Lougher
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
fuse init (API version 7.13)
SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled
SGI XFS Quota Management subsystem
msgmni has been set to 496
alg: No test for stdrng (krng)
async_tx: api initialized (async)
io scheduler noop registered
io scheduler deadline registered (default)
ppc4xx_gpio:gpio0_base(0xd13a0b00), gpio1_base(0xd13e0c00)
ppc4xx_gpio:Success to register driver (major = 253)
Serial: 8250/16550 driver, 2 ports, IRQ sharing enabled
serial8250.0: ttyS0 at MMIO 0x4ef600300 (irq = 19) is a 16550A
console [ttyS0] enabled
serial8250.0: ttyS1 at MMIO 0x4ef600400 (irq = 20) is a 16550A
4ef600300.serial: ttyS0 at MMIO 0x4ef600300 (irq = 19) is a 16550
4ef600400.serial: ttyS1 at MMIO 0x4ef600400 (irq = 20) is a 16550
brd: module loaded
loop: module loaded
NAND device: Manufacturer ID: 0xad, Chip ID: 0xf1 (Hynix NAND 128MiB 3,3V 8-bit)
Scanning device for bad blocks
10 cmdlinepart partitions found on MTD device nand0
Creating 10 MTD partitions on "nand0":
0x000000000000-0x000000100000 : "u-boot"
0x000000100000-0x000000180000 : "dtb"
0x000000180000-0x000000480000 : "safe-k"
0x000000480000-0x000000c80000 : "safe-r"
0x000000c80000-0x000000f80000 : "kernel"
0x000000f80000-0x000001780000 : "rootfs"
0x000001780000-0x000002780000 : "usr"
0x000002780000-0x000002980000 : "data"
0x000002980000-0x000002a80000 : "oem"
0x000002a80000-0x000008000000 : "app"
PPC 4xx OCP EMAC driver, version 3.54
mal0: descriptor-memory = ocm
MAL v2 /plb/mcmal, 2 TX channels, 16 RX channels
ZMII /plb/opb/emac-zmii@ef600d00 initialized
RGMII /plb/opb/emac-rgmii@ef601500 initialized with MDIO support
TAH /plb/opb/emac-tah@ef601350 initialized
TAH /plb/opb/emac-tah@ef601450 initialized
/plb/opb/emac-rgmii@ef601500: input 0 in RGMII mode
eth0: EMAC-0 /plb/opb/ethernet@ef600e00, MAC 00:01:55:30:53:89
eth0: found Generic MII PHY (0x00)
/plb/opb/emac-rgmii@ef601500: input 1 in RGMII mode
/plb/opb/ethernet@ef600f00: can't find PHY!
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ppc-of-ehci 4bffd0400.ehci: OF EHCI
ppc-of-ehci 4bffd0400.ehci: new USB bus registered, assigned bus number 1
ppc-of-ehci 4bffd0400.ehci: irq 36, io mem 0x4bffd0400
ppc-of-ehci 4bffd0400.ehci: USB 2.0 started, EHCI 1.00
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: OF EHCI
usb usb1: Manufacturer: Linux 2.6.32.14 ehci_hcd
usb usb1: SerialNumber: PPC-OF USB
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ppc-of-ohci 4bffd0000.usb: OF OHCI
ppc-of-ohci 4bffd0000.usb: new USB bus registered, assigned bus number 2
ppc-of-ohci 4bffd0000.usb: irq 37, io mem 0x4bffd0000
usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: OF OHCI
usb usb2: Manufacturer: Linux 2.6.32.14 ohci_hcd
usb usb2: SerialNumber: PPC-OF USB
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
usbcore: registered new interface driver usblp
dwc_otg: version 2.60a 22-NOV-2006
dwc_otg: Using Slave mode
dwc_otg dwc_otg.0: DWC OTG Controller
dwc_otg dwc_otg.0: new USB bus registered, assigned bus number 3
dwc_otg dwc_otg.0: irq 28, io mem 0x00000000
dwc_otg: Init: Port Power? op_state=1
dwc_otg: Init: Power Port (0)
usb usb3: New USB device found, idVendor=1d6b, idProduct=0002
usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb3: Product: DWC OTG Controller
usb usb3: Manufacturer: Linux 2.6.32.14 dwc_otg_hcd
usb usb3: SerialNumber: dwc_otg.0
usb usb3: configuration #1 chosen from 1 choice
hub 3-0:1.0: USB hub found
hub 3-0:1.0: 1 port detected
i2c /dev entries driver
ibm-iic 4ef600700.i2c: using standard (100 kHz) mode
rtc-pcf8563 0-0051: chip found, driver version 0.4.3
rtc-pcf8563 0-0051: rtc core: registered rtc-pcf8563 as rtc0
ibm-iic 4ef600800.i2c: using standard (100 kHz) mode
W83L786: Load fan configurations from VPD
PPC4xx WDT : WDT start on boot !! The period is about 30 seconds
<ppc460ex_configure_raid_devices> line 371
<ppc460ex_configure_raid_devices> line 389
<ppc460ex_configure_raid_devices> line 405
ppc460ex_dma_1_channel.resource[0].start=0x31d6
<ppc460ex_configure_raid_devices> line 426 dma_reg1=0xd5720200
<ppc460ex_configure_raid_devices> line 444
--------------- ppc460ex_adma_probe: 4327-------------------------
Improved ADMA - 061508
adev->res[0].start=0x0
adev->id = 0x1 ppc460ex_dma_1_channel.resource[0].start=0xffffffff
descriptor-memory = ocm
<ppc460ex_adma_probe> irq=0x29
<ppc460ex_adma_probe> irq=0x36
--------------- ppc460ex_adma_probe: 4511-------------------------
<ppc460ex_adma_probe> ret=0x0
device-mapper: ioctl: 4.15.0-ioctl (2009-04-01) initialised: dm-devel@redhat.com
usbcore: registered new interface driver hiddev
usbcore: registered new interface driver usbhid
usbhid: v2.6:USB HID core driver
TCP cubic registered
NET: Registered protocol family 17
NET: Registered protocol family 5
rtc-pcf8563 0-0051: setting system clock to 2015-12-01 19:36:42 UTC (1448998602)
RAMDISK: gzip image found at block 0
VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing unused kernel memory: 384k init
INIT: version 2.86 booting
Mount MNT
Mount Usr
Mount Promise
Mount Data
Mount OEM
Mount nfsd
Enable RAID5
PPC460Ex RAID-5 has been activated successfully
Loading modules:
t3sas - t3sas 0000:81:00.0: enabling device (0006 -> 0007)
t3sas 0000:81:00.0: Found PDC42819 Controller 105a:3f20 with IRQ: 18
t3sas 0000:81:00.0: Driver version of PDC42819 : 1.3.0.14-NAS-15
scsi0 : t3sas
scsi 0:0:8:0: Processor Promise RAID Console 1.00 PQ: 0 ANSI: 3
scsi 0:0:8:0: Attached scsi generic sg0 type 3
usb-storage - Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
sata_dwc - sata-dwc sata-dwc.0: id 0, controller version 1.82
sata-dwc sata-dwc.0: DMA initialized
sata-dwc sata-dwc.0: **** No neg speed (nothing attached?)
scsi1 : sata-dwc
ata1: SATA max UDMA/133 irq 22
iscsi_trgt - iSCSI Enterprise Target Software - version 1.4.20.2
iscsi_trgt: Registered io type fileio
iscsi_trgt: Registered io type blockio
iscsi_trgt: Registered io type nullio
Copying config files to root fs
cp: `/usr/local/atalk/etc' is not a directory
cp: unable to preserve times of `/usr/local/atalk': Read-only file system
cp: unable to preserve ownership of `/usr/local/atalk': Read-only file system
cp: unable to preserve permissions of `/usr/local/atalk': Read-only file system
cp: `/usr/local/samba/lib' is not a directory
cp: `/usr/local/samba/private' is not a directory
cp: unable to preserve times of `/usr/local/samba': Read-only file system
cp: unable to preserve ownership of `/usr/local/samba': Read-only file system
cp: unable to preserve permissions of `/usr/local/samba': Read-only file system
cp: `/usr/local/proftp/etc' is not a directory
cp: unable to preserve times of `/usr/local/proftp': Read-only file system
cp: unable to preserve ownership of `/usr/local/proftp': Read-only file system
cp: unable to preserve permissions of `/usr/local/proftp': Read-only file system
cp: unable to preserve times of `/usr/local': Read-only file system
cp: unable to preserve ownership of `/usr/local': Read-only file system
cp: unable to preserve permissions of `/usr/local': Read-only file system
cp: `/usr/local/atalk/etc' is not a directory
No vg needs to be restored.
quotacheck: Can't find filesystem to check or filesystem not mounted with quota option.
mount: special device /dev/vg001/lv001 does not exist
Local time (GMT+1): Tue Dec 1 20:37:07 GMT+1 2015
0, 0, 0, 0, 0,
0, 0
1448998627
7,37,20,1,11,115,2,334,0
INIT: Entering runlevel: 2
Starting syslogd...syslogd: Already running.
klogd: Already running.
Starting base networking daemons: portmap inetd.
Starting periodic command scheduler: cron.
Starting LPD service...
Starting loopback...
Starting network...
eth0: link is down
eth0: link is down
Starting httpd...
Swap Memory On...LED => 1
Checking File System...0, 0, 0, 0, 0,
0, 0
1448998670
50,37,20,1,11,115,2,334,0
Starting SMB...sh invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0
Call Trace:
[c8735ce0] [c0005968] show_stack+0x50/0x154 (unreliable)
[c8735d20] [c0052860] oom_kill_process+0x54/0x1bc
[c8735d50] [c0052d18] __out_of_memory+0x144/0x160
[c8735d90] [c0052db0] out_of_memory+0x7c/0xa8
[c8735db0] [c00556a4] __alloc_pages_nodemask+0x3e4/0x4b8
[c8735e40] [c0063f8c] do_wp_page+0x3fc/0x78c
[c8735e90] [c0010c18] do_page_fault+0x294/0x41c
[c8735f40] [c000d70c] handle_page_fault+0xc/0x80
Mem-Info:
DMA per-cpu:
CPU 0: hi: 0, btch: 1 usd: 0
active_anon:1572 inactive_anon:1577 isolated_anon:0
active_file:19 inactive_file:21 isolated_file:0
unevictable:0 dirty:0 writeback:0 unstable:0
free:128 slab_reclaimable:22 slab_unreclaimable:145
mapped:32 shmem:5 pagetables:91 bounce:0
DMA free:8192kB min:8192kB low:10240kB high:12288kB active_anon:100608kB inactive_anon:100928kB active_file:1216kB inactive_file:1344kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:262016kB mlocked:0kB dirty:0kB writeback:0kB mapped:2048kB shmem:320kB slab_reclaimable:1408kB slab_unreclaimable:9280kB kernel_stack:592kB pagetables:5824kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:32 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
DMA: 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB 1*8192kB 0*16384kB 0*32768kB 0*65536kB = 8192kB
45 total pagecache pages
0 pages in swap cache
Swap cache stats: add 0, delete 0, find 0/0
Free swap = 0kB
Total swap = 0kB
4096 pages RAM
0 pages HighMem
180 pages reserved
277 pages shared
3591 pages non-shared
Out of memory: kill process 1934 (smbd) score 186 or a child
Killed process 1934 (smbd)
cron invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0
Call Trace:
[c0cffc50] [c0005968] show_stack+0x50/0x154 (unreliable)
[c0cffc90] [c0052860] oom_kill_process+0x54/0x1bc
[c0cffcc0] [c0052d18] __out_of_memory+0x144/0x160
[c0cffd00] [c0052db0] out_of_memory+0x7c/0xa8
[c0cffd20] [c00556a4] __alloc_pages_nodemask+0x3e4/0x4b8
[c0cffdb0] [c00577f0] __do_page_cache_readahead+0xa4/0x1f8
[c0cffe00] [c0051a84] filemap_fault+0x1d8/0x3d8
[c0cffe40] [c0063554] __do_fault+0x5c/0x438
[c0cffe90] [c0010c18] do_page_fault+0x294/0x41c
[c0cfff40] [c000d70c] handle_page_fault+0xc/0x80
Mem-Info:
DMA per-cpu:
CPU 0: hi: 0, btch: 1 usd: 0
active_anon:1578 inactive_anon:1585 isolated_anon:0
active_file:5 inactive_file:29 isolated_file:0
unevictable:0 dirty:0 writeback:0 unstable:0
free:128 slab_reclaimable:20 slab_unreclaimable:145
mapped:17 shmem:5 pagetables:81 bounce:0
DMA free:8192kB min:8192kB low:10240kB high:12288kB active_anon:100992kB inactive_anon:101440kB active_file:320kB inactive_file:1856kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:262016kB mlocked:0kB dirty:0kB writeback:0kB mapped:1088kB shmem:320kB slab_reclaimable:1280kB slab_unreclaimable:9280kB kernel_stack:568kB pagetables:5184kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:43 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
DMA: 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB 1*8192kB 0*16384kB 0*32768kB 0*65536kB = 8192kB
39 total pagecache pages
0 pages in swap cache
Swap cache stats: add 0, delete 0, find 0/0
Free swap = 0kB
Total swap = 0kB
4096 pages RAM
0 pages HighMem
180 pages reserved
209 pages shared
3609 pages non-shared
Out of memory: kill process 2014 (nmbd) score 184 or a child
Killed process 2014 (nmbd)
Starting FTP...
Starting AFP...
warning: `proftpd' uses 32-bit capabilities (legacy support in use)
Starting quota...
Starting Domain Integrate...
Starting alert agent...
I2 Event Daemon, Ver 1.0.0.0
Checking last shutdown...
Check Data Partition : OK
NS4600 R2.0 A1 (Version 02.01.0000.22) - Promise Technology, INC.
c014-nas login: LED => 1
.pre
^^ reset password
Hold button near ethernet connector until long beep is heard to reset password
.pre
INShutting down alert agent...killall: alert_agent: no process killed
Stopping periodic command scheduler: cronstopped /usr/sbin/cron (pid 1908).
.
Shutting down syslogd...killall: syslogd: no process killed
killall: klogd: no process killed
Shutting down Bonjour...
Shutting down AppleTalk services: Can't unregister C014-NAS:Workstation@*
Can't unregister C014-NAS:netatalk@*
cat: /var/lock/atalkd: No such file or directory
kill: Could not kill pid '2376': No such process
Shutting down FTP service...
Shutting down NFS...
Shutting down SMB service...Shutting down httpd...
Clear boot flag...
Sending all processes the TERM signal... done.
Sending all processes the KILL signal... done.
eepromctl 7.3, a 24Cxx EEPROM reader/writer
Bus: /dev/i2c0, Address: 0x50, Mode: 8bit
Deactivating swap...done.
Unmounting local filesystems...done.
U-Boot 1.3.4 (NS4600p - 013 - 800MHz) (Jun 01 2010 - 16:16:09)
CPU: AMCC PowerPC 431EXr at 800 MHz (PLB=200, OPB=100, EBC=100 MHz)
Security/Kasumi support
Bootstrap Option F - Boot ROM Location NAND (8 bits), booting from NAND
Internal PCI arbiter disabled
32 kB I-Cache 32 kB D-Cache
Board: NS4600p - PROMISE 4-bay NAS Target Board, 1*PCIe/1*SATA
I2C: ready
DRAM: 256 MB
Enclosure: Load fan configurations from VPD
NAND: 128 MiB
eth0 MAC = 00:01:55:30:53:89
eth1 MAC = 00:00:00:00:00:00
PCI: Bus Dev VenId DevId Class Int
PCIE1: successfully set as root-complex
01 00 105a 3f20 0104 00
SCSI: Net: ppc_4xx_eth0
Hit Ctrl + C to stop autoboot: 0
Waiting for PHY auto negotiation to complete...... TIMEOUT !
done
ENET Speed is 10 Mbps - HALF duplex connection (EMAC0)
Wake on POWER_BUTTON / LAN
Press Ctrl + C to leave...
.pre
^^ u-boot info
.pre
=> bdinfo
memstart = 0x00000000
memsize = 0x10000000
flashstart = 0x00000000
flashsize = 0x00000000
flashoffset = 0x00000000
sramstart = 0x00000000
sramsize = 0x00000000
bootflags = 0x0108C6F0
intfreq = 800 MHz
busfreq = 200 MHz
ethaddr = 00:01:55:30:53:89
eth1addr = 00:00:00:00:00:00
IP addr = 192.168.207.168
baudrate = 115200 bps
=> iprobe
Valid chip addresses: 2E 50 51 69
.pre
^^ u-boot boot to shell
.pre
=> printenv addtty
addtty=setenv bootargs ${bootargs} console=ttyS0,${baudrate}
=> setenv addtty setenv bootargs \${bootargs} console=ttyS0,\${baudrate} init=/bin/sh
=> printenv addtty
addtty=setenv bootargs ${bootargs} console=ttyS0,${baudrate} init=/bin/sh
=> boot
Waiting for PHY auto negotiation to complete...... TIMEOUT !
done
Wake on POWER_BUTTON / LAN
Press Ctrl + C to leave...
# press power button to start boot
Set autoboot flag
Starting to write EEPROM
OK
Power button was pressed !
Leave clock generator PD mode... OK
Leave net PHY PD mode... OK
Turn on all activity LED power... OK
FAN_SET mode... OK
Blinking LED... OK
Turn on disk power... OK
# etc, etc....
.pre
^^ manual boot with root shell
.pre
$ cat /etc/init.d/checkroot
#!/bin/sh
/bin/mount -t proc /proc /proc
echo "Mount MNT"
/bin/mkdir /mnt/usr_fs
/bin/mount -t jffs2 -r /dev/mtdblock6 /mnt/usr_fs
/bin/mkdir /mnt/app_fs
/bin/mount -t jffs2 -r /dev/mtdblock9 /mnt/app_fs
echo "Mount Usr"
/bin/mount -o loop -t squashfs /mnt/usr_fs/usr_sqfs /usr
echo "Mount Promise"
/bin/mount -o loop -t squashfs /mnt/app_fs/app_sqfs /promise
#/bin/mount -t jffs2 /dev/mtdblock9 /promise
echo "Mount Data"
/bin/mount -t jffs2 /dev/mtdblock7 /data
echo "Mount OEM"
/bin/mkdir /mnt/oem
/bin/mount -t jffs2 -r /dev/mtdblock8 /mnt/oem
echo "Enable RAID5"
/sbin/enable_raid5 >/dev/null 2>/dev/null
$ /sbin/enable_raid5
PPC460Ex RAID-5PPC460Ex RAID-5 has been activated successfully
enable utility.
Current RAID-5 state:
PPC460Ex RAID-r5 capabilities are DISABLED.
Activate RAID-5.
RAID-5 state:
PPC460Ex RAID-r5 capabilities are ENABLED.
$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
t3sas
usb-storage
sata_dwc
iscsi_trgt
$ insmod /lib/modules/t3sas.ko
t3sas 0000:81:00.0: enabling device (0006 -> 0007)
t3sas 0000:81:00.0: Found PDC42819 Controller 105a:3f20 with IRQ: 18
t3sas 0000:81:00.0: Driver version of PDC42819 : 1.3.0.14-NAS-11
## this takes very long, but eventually....
scsi0 : t3sas
scsi 0:0:0:0: Direct-Access Promise 3+1 Disk RAID5 1.10 PQ: 0 ANSI: 4
sd 0:0:0:0: [sda] 2929926144 512-byte logical blocks: (1.50 TB/1.36 TiB)
sd 0:0:0:0: Attached scsi generic sg0 type 0
scsi 0:0:8:0: Processor Promise RAID Console 1.00 PQ: 0 ANSI: 3
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
scsi 0:0:8:0: Attached scsi generic sg1 type 3
sda: sda1
sd 0:0:0:0: [sda] Attached SCSI disk
$ mount /sys/
$ /usr/sbin/pvscan
PV /dev/sda1 VG vg001 lvm2 [1.36 TB / 488.00 MB free]
Total: 1 [1.36 TB] / in use: 1 [1.36 TB] / in no VG: 0 [0 ]
$ /usr/sbin/vgchange -a y vg001
2 logical volume(s) in volume group "vg001" now active
$ /usr/sbin/lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv001 vg001 -wi-a- 1.36T
nsswap vg001 -wi-a- 512.00M
$ mkdir /tmp/lv001
$ mount /dev/vg001/lv001 /tmp/lv001/ -o ro
kjournald starting. Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
$ cat /etc/rc2.d/S60servon
.pre
USB [FX2LP] based logic analyzers
* http://www.triplespark.net/elec/periph/USB-FX2/eeprom/
^ Saleae / USBEE AX MINI
.pre
dpavlin@blue:~$ lsusb -d 0925:3881
Bus 001 Device 022: ID 0925:3881 Lakeview Research Saleae Logic
.pre
http://dx.com/p/logic-analyzer-w-dupont-lines-and-usb-cable-for-scm-black-148945
http://www.epanorama.net/blog/2012/10/02/usbee-ax-clone/
http://www.jwandrews.co.uk/2011/12/saleae-logic-analyser-clone-teardown-and-reprogramming/
http://tubbutec.de/blog/adding-output-capability-to-a-10e-logic-analyser/
^^ Linux software
https://bitbucket.org/wump/usbee
https://blog.visucore.com/2010/5/27/usbee-sx-protocol-description
http://sigrok.org/wiki/Fx2lafw
http://www.drdobbs.com/embedded-systems/rocking-with-sigrok/240147198
^ USBee AX Pro
http://dx.com/p/usb-oscilloscope-and-logic-analyzer-93518
* https://blog.visucore.com/tags/usbee
* http://www.eeelec.com/xla/
^ CY7C68013 datasheets
* http://www.datasheetsite.com/datasheet/CY7C68013
^ Change usb id under Linux
http://gronlier.fr/blog/2014/07/usbee-ax-pro-reprogramming/
.pre
root@x200:/rest/cvs/fx2eeprom# apt-get install fxload
root@x200:/rest/cvs/fx2eeprom# git remote -v
origin https://github.com/ribalda/fx2eeprom.git (fetch)
origin https://github.com/ribalda/fx2eeprom.git (push)
root@x200:/rest/cvs/fx2eeprom# lsusb -d 08a9:0014
Bus 007 Device 010: ID 08a9:0014 CWAV Inc. USBee AX-Pro
root@x200:/rest/cvs/fx2eeprom# fxload -D /dev/bus/usb/007/010 -t fx2lp -I vend_ax.hex
root@x200:/rest/cvs/fx2eeprom# sudo ./fx2eeprom r 0x08a9 0x0014 8 > eeprom.dat
Readed 8 bytes
root@x200:/rest/cvs/fx2eeprom# hexdump -C eeprom.dat
00000000 c0 a9 08 14 00 00 1b 00
# edit usb id
root@x200:/rest/cvs/fx2eeprom# hexdump -C saleae.dat
00000000 c0 25 09 81 38 00 1b 00
root@x200:/rest/cvs/fx2eeprom# sudo ./fx2eeprom w 0x08a9 0x0014 8 < saleae.dat
Written 8 bytes
# unplug, re-plug usb dongle
root@x200:/rest/cvs/fx2eeprom# lsusb -d 0925:3881
Bus 007 Device 013: ID 0925:3881 Lakeview Research Saleae Logic
.pre
Bunch of references for Altera FPGA
{toc: }
^ JTAG pinout
{image: altera-jtag-pinout.jpg}
^ Bus Pirate programming
* http://dangerousprototypes.com/forum/viewtopic.php?f=4&t=2505
The Bus Pirate can program CPLDs and FPGAs using XSVF format bitstreams and XSVF player firmware. Altera might not output XSVF directly, but there is a simple converter for SVF to XSVF.
Windows binaries are provided, but the source should also compile under Linux. Source is in the Bus Pirate SVN:
https://code.google.com/p/the-bus-pirate/source/browse/#svn%2Ftrunk%2Fscripts%2FXSVF
Bus Pirate FPGA and CPLD programming with XSVF:
http://dangerousprototypes.com/docs/Bus_Pirate#FPGA_and_CPLD_programming
SVF to XSVF converter:
http://dangerousprototypes.com/docs/JTAG_SVF_to_XSVF_file_converter
^ USB Blaster
[FX2LP] firmware
* libusb tools https://github.com/swetland/jtag
* https://github.com/mithro/ixo-usb-jtag usb-jtag - Altera USB Blaster Emulation with a FX2
* https://github.com/binary-logic/vj-uart - serial over JTAG USB Blaster for Cyclone IV
^ Quartus
^^ Create SVF file
http://www.altera.com/support/kdb/solutions/rd07222008_677.html
To generate an SVF file in Quartus® II software, follow the steps below:
* Open the Quartus II programmer and add a .sof / .pof file into the programmer window.
* Select the File Menu then select Create/Update within this menu choose Create JAM, SVF, or ISC File.
* Input a file name for your SVF file output.
* In the File Format drop-down select Serial Vector File (SVF) as your output file type.
* Press ok to generate your SVF file.
^^ manual pin assigment
edit .*qsf file and add:
.pre
set_location_assignment PIN_AP30 -to qdr_q[35]
.pre
^^ 13.0sp1 start
.pre
dpavlin@klin:~$ /opt/altera/13.0sp1/quartus/bin/quartus --64bit
.pre
^ Altera hardware
* [X300 dongle]
* [X300 PCI]
* [MiniPCIe/PCI/LPC Combo-Debug Card]
This is a list of the pages in the Socialtext Workspace Tour. Click the first one to start the tour, or you can jump into the middle by clicking on one of the other links.
# [Start here]
# [What else is here?]
# [Documents that people are working on]
# [Conversations]
# [Meeting agendas]
# [Project plans]
# [Lists of pages]
# [How do I find my way around?]
# [Advanced getting around]
# [Can I change something?]
# [What if I make a mistake?]
# [What's the funny punctuation?]
# [How do I make links?]
# [How do I make a new page?]
# [Congratulations! You know how to use a workspace]
{file: PCF8591_YL-40_schema.pdf}
{image: PCF8591_YL-40_schema.jpg}
{image: sku_150190_1.jpg}
PCF8591 8-Bit A/D D/A Converter Module
AIN0 - Jumper P5 - Light Dependent Resistor (LDR)
AIN1 - Jumper P4 - Thermistor
AIN2 - Not connected
AIN3 - Jumper P6 - Potentiometer
^ [RaspberryPi]
.pre
pi@raspberrypi ~ $ grep snd /etc/modprobe.d/raspi-blacklist.conf
blacklist snd-bcm2708
pi@raspberrypi ~ $ grep i2c /etc/modules
i2c_dev
pi@raspberrypi ~ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi ~ $ gpio -x pcf8591:120:0x48 readall
+------+---------+--------+
| Pin | Digital | Analog |
+------+---------+--------+
| 120 | 0 | 132 |
| 121 | 0 | 224 |
| 122 | 0 | 89 |
| 123 | 0 | 119 |
+------+---------+--------+
pi@raspberrypi ~ $ gpio -x pcf8591:120:0x48 aread 120
132
pi@raspberrypi ~ $ gpio -x pcf8591:120:0x48 aread 121
224
pi@raspberrypi ~ $ gpio -x pcf8591:120:0x48 aread 122
99
pi@raspberrypi ~ $ gpio -x pcf8591:120:0x48 aread 123
118
pi@raspberrypi ~ $ gpio -x pcf8591:120:0x48 awrite 120 128
.pre